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.