I have 2 video files (flv). One has the video and the other has the audio. I wrote a script using ffmpeg that extracts the audio as mp3, then merges it with the video flv. It works, except that my audio and video are out of sync because the audio is longer than the video. They started recording the meeting's audio before the video.

For completeness, here are my 2 commands:

msg "Extracting Audio"
./ffmpeg -loglevel panic -i cameraVoip*.flv -vn -acodec mp3 output_audio.mp3

msg "Merging Audio with Video"
./ffmpeg -loglevel panic -i output_audio.mp3 -i screenshare*.flv -acodec copy -vcodec copy output_video.flv

This got me to thinking, ffmpeg is combining the 2 files together from the beginning of each file. Is there a way I can tell it match from the end, and ignore extra at the beginning?

I know I could edit each file to get them to the same size, but I'd like to make this as automated as possible.


if you just do ffmpeg -i inputfile it will give you informational output including the length of the stream (there is also a ffprobe command that you may or may not have that does the same thing, and may have more output control).

% ffmpeg -i foo.mkv
ffmpeg version 1.0.git-79133fd Copyright (c) 2000-2012 the FFmpeg developers
Input #0, matroska,webm, from 'foo.mkv':
    creation_time   : 2009-11-08 16:11:10
  Duration: 00:43:16.71, start: 0.000000, bitrate: 2435 kb/s
    Stream #0:0(eng): Video: h264 (High), yuv420p, 720x480 [SAR 32:27 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
    Stream #0:1(eng): Audio: ac3, 48000 Hz, stereo, s16, 192 kb/s (default)
    Stream #0:2(eng): Subtitle: subrip
At least one output file must be specified

So you'll need to parse this output to get the length of each original file, and then use the -itsoffset option with what you learn.

   -itsoffset offset (input)
       Set the input time offset in seconds.  "[-]hh:mm:ss[.xxx]" syntax
       is also supported.  The offset is added to the timestamps of the
       input files.  Specifying a positive offset means that the
       corresponding streams are delayed by offset seconds.

so you'll end up with something like (untested):

ffmpeg -i foo.mp3 -itsoffset 60 -i blah.mpeg -acodec copy -vcodec copy -copyts out.mkv
  • 2
    It's definitely better to use ffprobe for getting this information, if you're going to script it. The -show_format and -show_streams options will be useful (see the ffprobe man page or the online documentation) -- outputs one key=value pair per line, so it's easier to parse with grep or sed or whatever. – evilsoup Sep 6 '13 at 20:31
  • Yeah - I went with ffmpeg for the answer because it's a lowest common denominator. Lot of the time people seem to have found a windows ffmpeg binary somewhere and have nothing else. – Dan Pritts Sep 9 '13 at 19:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.