ffmpeg 合并不同长度的单独视频和音频

ffmpeg 合并不同长度的单独视频和音频

我有 2 个视频文件 (flv)。一个有视频,另一个有音频。我使用 ffmpeg 编写了一个脚本,将音频提取为 mp3,然后将其与视频 flv 合并。它可以工作,只是我的音频和视频不同步,因为音频比视频长。他们先开始录制会议的音频,然后才开始录制视频。

为了完整起见,下面是我的两个命令:

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

这让我开始思考,ffmpeg 是从每个文件的开头将两个文件合并在一起的。有没有办法让我从结尾判断是否匹配,并忽略开头的多余部分?

我知道我可以编辑每个文件以使它们具有相同的大小,但我想使这个过程尽可能自动化。

答案1

如果你这样做,ffmpeg -i inputfile它会给你信息输出,包括流的长度(还有一个ffprobe你可能有或可能没有的命令,它可以做同样的事情,并且可能有更多的输出控制)。

% ffmpeg -i foo.mkv
ffmpeg version 1.0.git-79133fd Copyright (c) 2000-2012 the FFmpeg developers
[...]
Input #0, matroska,webm, from 'foo.mkv':
  Metadata:
    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

因此,您需要解析此输出以获取每个原始文件的长度,然后将该-itsoffset选项与您学到的内容结合使用。

   -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.

因此你最终会得到类似如下的结果(未经测试):

ffmpeg -i foo.mp3 -itsoffset 60 -i blah.mpeg -acodec copy -vcodec copy -copyts out.mkv

相关内容