How to make a movie constituted of image loops and audio?

I've wrote a procedure according to the Igor example FM Modulation Movie to make a movie constituted of image loops and audio. The experiment, procedure and pictures for the movie are in the attachment.

Macro MakeMovie(nframes,fRate,wAudio)
    Variable nframes=NumVarOrDefault("gnframes",10)
    Variable fRate=NumVarOrDefault("gwFPS",30)
    Variable wAudio=NumVarOrDefault("gwAudio",2)
    Prompt nframes,"Number of movie frames"
    Prompt fRate,"Frame rate"
    Prompt wAudio,"Sound:",popup "Off;On"
   
    Variable/G gnframes= nframes
    Variable/G gwFPS= fRate
    Variable/G gwAudio= wAudio
   
    DoMakeMovie(nframes,gwFPS,wAudio-1)
end

// returns error flag
Function ValidatePath()
    PathInfo moviesPath
    if( V_Flag==0 )
        NewPath/o/Q moviesPath,  SpecialDirPath("Igor Pro User Files", 0, 0, 0 )
        if( V_Flag != 0 )
            return 1        // abort or failure
        endif
    endif
    return 0
End
   

Function DoMakeMovie(nframes,fRate,wAudio)
    Variable nframes,fRate,wAudio
    wave scar
    Execute/Q "SetIgorOption VerboseMode=2"
   
    newpath/o IgorSpace, "F:"
   
    ValidatePath()
 
    String fName= "sampleMovie"
    String fExtension= ".mp4"
   
    Variable isMac= CmpStr(IgorInfo(2),"Macintosh") == 0

    Make/O/W/N=( 963332/fRate,2) yuanAudio
    SetScale/P x,0,20/ 963332,"s" yuanAudio
   
    variable i=0
    do
       int a=mod(i,4)
       string nextImage = "pict"+num2str(a+1)+".bmp"
       imageload /O/P=IgorSpace /T=bmp  nextimage
       duplicate/o $nextimage,w
       redimension/n=(259,183,-1) w
       newimage /n=season/s=0 w
   
      if(i==0)  
           if( wAudio)
                fName += "Audio"
                NewMovie/cf=1/O/F=(fRate)/P=moviesPath/S=yuanAudio as fName+fExtension
           else
                NewMovie/cf=1/O/F=(fRate)/P=moviesPath as fName+fExtension
           endif
           if( V_Flag!=0 )
                Print "OpenMovie failed, err= ",V_Flag
                return 0            // probably canceled
           endif
       endif
       
       doupdate
        AddMovieFrame
        killwindow season
        killwaves $nextimage
        if( V_Flag!=0 )
            Print "Add movie frame failed, err= ",V_Flag,", frame ",i
            if( isMac && wAudio )
                Print "Specifing sound may not work on Mac"
            endif
            break
        endif
       
        i += 1
    while(i<nframes)
    if( wAudio )
            yuanAudio= scar[100000+p]
            AddMovieAudio/Z yuanAudio
            if( V_Flag!=0 )
                Print "Add movie audio failed, err= ",V_Flag
            endif
    endif
    CloseMovie/Z
    if( V_Flag!=0 )
        Print "Close movie failed, err= ",V_Flag
    endif
    Sleep/S 1       // without this, Mac sometimes gives a file not a movie error; DoUpdate did not help
    PlayMovie/P=moviesPath as fName+fExtension
end

When I run this procedure it always turns out :

  Add movie frame failed, err=   1  , frame   1

I don't know where the error is.

And when I delete these lines in the procedure 

	if( V_Flag!=0 )
			Print "Add movie frame failed, err= ",V_Flag,", frame ",i
			if( isMac && wAudio )
				Print "Specifing sound may not work on Mac"
			endif
			break 	
       endif

the procedure can run as I expect but the image quality in the movie becomes worse with the loop number increasing.

Can someone help me?  My Igor version is Igor Pro 8.  The operating system version is win10 64 bit. I think the best value for nframes and fRate in the procedure are 20 and 1, respectively.

Thanks a lot!

the main procedure (2.41 KB) four pictures used in the movie (496.81 KB) the Igor experiment (21.51 MB)

Deleted my comment ...nevermind, I didn't see the attachments... I hope someone else can help.

 

I really don't have sufficient information here but if your AppendMovieFrame command includes the /Z flag then you should pay attention to the value of V_Flag and if it is non-zero you need to determine the reason for the error.

If the movie quality deteriorates with increasing frames you should look at the way you are initializing the NewMovie.  If your codec allows you to set the key frame, you will have to reduce the number that you are using because apparently the compression is not keeping up with the relative changes between frames.  In fact, it might be a good idea to select a codec that is more appropriate for the type of variations that you have between frames.

A.G.

In reply to by Igor

I add /cf=1 to the Newmovie command so the picture quality problem has been solved. When I add /z flag to Addmovieframe, Newmovie, etc, the procedure can run although it will get slow down as time passes  by, but that may be  enough for me. Thank you.

When you add /CF=1 there is no compression and each one of your images could potentially add a lot of memory which will slow your computer down.  Try something like a factor of 10 and see if that improves your performance.  I'm not going to comment on the rest of the code because I am not a fan of killing the window each time.  Why not simply overwrite the image data, call doUpdate to make sure that it is displayed and then AddMovieFrame.