From 57abe8131d8a90da4017cecf877549fad1bbaeed Mon Sep 17 00:00:00 2001 From: n-a-c-h <> Date: Mon, 27 Feb 2006 20:37:42 +0000 Subject: [PATCH] Can now mux audio with video. Audio/Video saved in start path. Make sure to delete zmovie.cfg before recording with this change. --- zsnes/src/md.psr | 23 ++++++++++++++-------- zsnes/src/zloader.c | 6 ++++++ zsnes/src/zmovie.c | 47 +++++++++++++++++++++++++++++++-------------- 3 files changed, 54 insertions(+), 22 deletions(-) diff --git a/zsnes/src/md.psr b/zsnes/src/md.psr index 46676acf..5a2e8175 100644 --- a/zsnes/src/md.psr +++ b/zsnes/src/md.psr @@ -1,17 +1,24 @@ md_raw_file times 50 db "rawvideo.bin" @ Only for Raw Video -md_pcm_audio times 50 db "pcmaudio.wav" @ AVI dumping always dumps audio seperatly +md_pcm_audio times 50 db "audio.wav" @ AVI dumping always dumps audio seperatly md_ntsc times 20 db "59649/995" md_pal times 5 db "50/1" + +md_file times 50 db "video.avi" md_prog times 50 db "mencoder" md_raw times 100 db "-demuxer rawvideo -rawvideo format=0x42475218:w=256:h=224:size=172032" -md_other times 75 db "-aspect 4:3 -mc 0 -nosound" -md_file times 50 db "video.avi" +md_other times 75 db "-aspect 4:3 -mc 0" +md_no_sound times 25 db "-nosound" +md_sound times 50 db "-oac mp3lame -lameopts aq=0:preset=64" +md_x264 times 100 db "-ovc x264 -x264encopts qp_constant=0:frameref=15" +md_ffv1 times 100 db "-ovc lavc -lavcopts vcodec=ffv1:vstrict=-2:aspect=4/3" -@Valid variables to use in the next three lines are: -@$md_prog, $md_raw, $md_other, $md_file, $md_video_rate +@Valid variables to use in the next two lines are: +@$md_file, $md_prog, $md_raw, $md_other, $md_no_sound, $md_sound, $md_pcm_audio +@and $md_video_rate, $md_vcodec @These variables are defined above. @$md_video_rate is $md_ntsc or $md_pal depending on the game as needed -md_uncompressed times 150 db "$md_prog $md_other $md_raw:fps=$md_video_rate -ovc copy -o $md_file -" -md_x264 times 150 db "$md_prog $md_other $md_raw:fps=$md_video_rate -ovc x264 -x264encopts qp_constant=0:frameref=15 -o $md_file -" -md_ffv1 times 150 db "$md_prog $md_other $md_raw:fps=$md_video_rate -ovc lavc -lavcopts vcodec=ffv1:vstrict=-2:aspect=4/3 -o $md_file -" +@$md_vcodec is $md_x264 or $md_ffv1 depending on the codec selected + +md_command times 150 db "$md_prog $md_other $md_no_sound $md_raw:fps=$md_video_rate $md_vcodec -o $md_file -" +md_merge times 150 db "$md_prog $md_other $md_sound -audiofile $md_pcm_audio -ovc copy -o merged.avi $md_file" \ No newline at end of file diff --git a/zsnes/src/zloader.c b/zsnes/src/zloader.c index 758b10dc..71744d2e 100644 --- a/zsnes/src/zloader.c +++ b/zsnes/src/zloader.c @@ -562,6 +562,8 @@ void ccmdline() handle_params(argc, argv); } +char ZStartPath[PATH_MAX]; + #ifdef __WIN32__ extern HINSTANCE hInst; int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) @@ -572,6 +574,8 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, hInst=hInstance; ImportDirectX(); + getcwd(ZStartPath, PATH_MAX); + zstart(); return(0); } @@ -587,6 +591,8 @@ int main(int zargc, char *zargv[]) handle_params(zargc, zargv); #endif + getcwd(ZStartPath, PATH_MAX); + zstart(); return(0); } diff --git a/zsnes/src/zmovie.c b/zsnes/src/zmovie.c index 9f041e17..7cc48c83 100644 --- a/zsnes/src/zmovie.c +++ b/zsnes/src/zmovie.c @@ -1876,6 +1876,8 @@ unsigned char AudioLogging; extern unsigned char MovieVideoMode; extern unsigned char MovieAudioMode; +extern char ZStartPath[PATH_MAX]; + #define PICK_HELP(var) if (!strncmp(*str, "$"#var, strlen(#var)+1)) { *str += strlen(#var)+1; return(var); } static char *pick_var(char **str) @@ -1884,29 +1886,33 @@ static char *pick_var(char **str) PICK_HELP(md_raw); PICK_HELP(md_other); PICK_HELP(md_file); + PICK_HELP(md_sound); + PICK_HELP(md_no_sound); + PICK_HELP(md_pcm_audio); + + + if (!strncmp(*str, "$md_video_rate", strlen("$md_video_rate"))) { *str += strlen("$md_video_rate"); return(romispal ? md_pal : md_ntsc); } + if (!strncmp(*str, "$md_vcodec", strlen("$md_vcodec"))) + { + *str += strlen("$md_vcodec"); + return(MovieVideoMode == 2 ? md_ffv1 : md_x264); + } *str += strlen(*str); fprintf(stderr, "Unknown Variable: %s", *str); return(""); } -FILE *open_movie_file() +static char *encode_command(char *p) { - char command[450], *p, *var; + static char command[700]; + char *var; *command = 0; - switch (MovieVideoMode) - { - case 2: p = md_uncompressed; break; - case 3: p = md_ffv1; break; - case 4: p = md_x264; break; - default: p = "$"; break; - } - while (*p) { if ((var = strchr(p, '$'))) @@ -1923,7 +1929,8 @@ FILE *open_movie_file() } puts(command); - return(popen(command, WRITE_BINARY)); + + return(command); } struct @@ -1941,6 +1948,8 @@ struct static void raw_video_close() { + bool audio_and_video = raw_vid.vp && raw_vid.ap; + if (raw_vid.vp) { switch (MovieVideoMode) @@ -1948,7 +1957,7 @@ static void raw_video_close() case 1: fclose(raw_vid.vp); break; - case 2: case 3: case 4: + case 2: case 3: pclose(raw_vid.vp); break; } @@ -1973,6 +1982,14 @@ static void raw_video_close() raw_vid.ap = 0; AudioLogging = 0; } + + if (audio_and_video && (MovieAudioMode == 2)) + { + chdir(ZStartPath); + system(encode_command(md_merge)); + remove(md_file); + remove(md_pcm_audio); + } } static bool raw_video_open() @@ -1985,11 +2002,13 @@ static bool raw_video_open() break; case 1: + chdir(ZStartPath); raw_vid.vp = fopen(md_raw_file, "wb"); break; - case 2: case 3: case 4: - raw_vid.vp = open_movie_file(); + case 2: case 3: + chdir(ZStartPath); + raw_vid.vp = popen(encode_command(md_command), WRITE_BINARY); break; default: