Audio FFmpeg concat视频和音频不同步

Audio FFmpeg concat视频和音频不同步,audio,video,ffmpeg,concatenation,Audio,Video,Ffmpeg,Concatenation,使用ffmpeg连接多个文件似乎会导致音频的时间戳或偏移量不匹配。我试过几段视频,发现h.264/MP4也有同样的问题 使用concat对视频进行编码似乎效果不错。当ffmpeg进行完整的转换计算时,音频保持同步,似乎一切正常 然而,简单地连接视频而不进行任何转换或编码会导致同步问题缓慢增加。显然,编码视频而不是简单地加入视频会导致信息/质量的损失,因此我宁愿找到解决这个问题的方法 我必须根据时间戳来解决这个问题。但这些似乎都不能解决这个问题 ffmpeg -f concat -fflags +

使用ffmpeg连接多个文件似乎会导致音频的时间戳或偏移量不匹配。我试过几段视频,发现h.264/MP4也有同样的问题

使用
concat
对视频进行编码似乎效果不错。当ffmpeg进行完整的转换计算时,音频保持同步,似乎一切正常

然而,简单地连接视频而不进行任何转换或编码会导致同步问题缓慢增加。显然,编码视频而不是简单地加入视频会导致信息/质量的损失,因此我宁愿找到解决这个问题的方法

我必须根据时间戳来解决这个问题。但这些似乎都不能解决这个问题

ffmpeg -f concat -fflags +genpts -async 1 -i segments.txt test.mov
ffmpeg -auto_convert 1 -f concat -fflags +genpts -async 1 -i segments.txt -c copy test2.mov
ffmpeg -f concat -i segments.txt -c copy -fflags +genpts test3.mp4
ffmpeg -f concat -fflags +genpts -async 1 -i segments.txt -copyts test4.mov
ffmpeg -f concat -i segments.txt -copyts test5.mov
ffmpeg -f concat -i segments.txt -copyts -c copy test6.mov
ffmpeg -f concat -fflags +genpts -i segments.txt -copyts -c copy test7.mov
注意:我能在SO上找到的所有其他问题似乎都通过简单地重新编码视频来“修复”问题。这不是个好办法

更新 我意识到海螺不是问题所在。原始剪辑集的时间戳不匹配。不知何故,concat+编码解决了这个问题,但我不想每次都对视频重新编码并降低质量

ffmpeg -y -ss 00:00:02.750 -i input.MOV -c copy -t 00:00:05.880 output.MOV
这导致了以下数据

ffprobe -v quiet -show_entries stream=start_time,duration output.MOV

start_time=-0.247500
duration=6.131125
start_time=-0.257333
duration=6.155333
从那以后,我尝试在不同的地方使用
-to
m和
-t
以及
-af apad-c:v copy
,但我仍然无法获得相同的持续时间

详细的示例文件
我录制了一段视频样本,添加了一些命令将其切碎,然后对其进行压缩

您可以使用
filter\u complex
一次性选择不同的选项

ffmpeg -i input1.mp4 -i input2.webm \
-filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]" \
-map "[v]" -map "[a]" <encoding options> output.mkv
ffmpeg-i input1.mp4-i input2.webm\
-过滤复合物“[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[v][a]”\
-映射“[v]”-map“[a]”output.mkv

这两个步骤应该可以完成

步骤1在每个片段中填充音频

ffmpeg -i segment1.mov -af apad -c:v copy <audio encoding params> -shortest -avoid_negative_ts make_zero -fflags +genpts padded1.mov
步骤2Concat

ffmpeg -f concat -i segments.txt -c copy test.mov

其中,
segments.txt
由填充文件的名称组成。

我也一直在为这个问题挣扎了很长一段时间。尤其是在使用松下AVCHD生成的MTS文件时。我目前的解决方案是在操作系统级别连接它们,而不是ffmpeg。我在windows上执行此操作,它看起来像这样:

COPY /b input_1.mts + input_2.mts + input_3.mts output.mts
在linux上,它应该类似于:

$ cat input_1.mts input_2.mts input_3.mts > output.mts
您可以查阅文档以了解和二进制连接


如果原始格式适合您的话,这种与转码类似的连接方法就是最好的选择。此方法实际上不使用CPU处理,并保持原始质量。在处理高质量的批量媒体时,这是一种双赢。

如果输入的视频具有相同的视频格式、音频格式、尺寸等,您可以使用mkvtoolnix中的
mkvmerge
连接视频,而无需重新编码:

mkvmerge-o output.mkv file1.mkv+file2.mkv+file3.mkv
mkvmerge
也接受带有MP4容器的输入文件,但即使您尝试将输出文件的文件扩展名指定为
.MP4
,输出文件也将具有MKV容器。您可以使用
ffmpeg
更改容器:

mkvmerge-o output.mkv file1.mp4+file2.mp4+file3.mp4
ffmpeg-i output.mkv-c copy output.mp4
我需要连接不同来源的视频,这些视频使用不同的设置进行编码,因此我首先使用如下命令调整输入视频的大小并重新编码:

用于*.mp4中的f;do w=1280;h=720;ffmpeg-i$f-filter:v“scale=iw*min($w/iw\,$h/ih):ih*min($w/iw\,$h/ih),pad=$w:$h:($w-iw*min($w/iw\,$h/ih))/2:($h-ih*min($w/iw\,$h/ih))/2“-c:v libx264-crf 22-预设慢速-pix{fmt yuv420p-c:a aac-q:a 1-ac 2-ar 44100$%mp4;完成

我的一些输入视频没有音频通道,因此我使用类似于以下的命令向视频添加无声音频通道:

用于f in*.mkv;doffprobe$f |&grep-q1:\Audio |{ffmpeg-i$f-f lavfi-i anullsrc-c:aac-shortest-c:v copy temp-$f;mv temp-$f$f;};完成

然后,我使用
mkvmerge
连接视频:

mkvmerge-o output.mkv`printf%s\\n*.mkv|sed'1!s/^/+/'`

我遇到了类似的问题,找到了一个有效的解决方案,至少对我来说是这样。在我的例子中,我还连接了文件,发现iOs存在音频/视频同步问题,而Windows没有(例如,VLC media player使用相同的mp4文件时没有同步问题)。iOs播放这种连接的mp4的症状是最初同步良好,随后随着电影的播放,同步丢失越来越多,音频速度比视频快。有趣的是,同步可以通过将电影进度滑块提前到电影中的任何点来临时恢复,但是当电影继续在iOs中播放时,同步将再次丢失。通过在iOs和Windows VLC中同时播放同一部电影,并在开始时尽可能地彼此同步,通过观察它们之间“回声”的演变,我得出结论,iOs音频速度过快(假设Windows player是正确的)


对我来说,解决方案是将音频过滤器选项
-af aresample=async=1000
添加到ffmpeg命令中,我在ffmpeg在线文档中找到了该命令,并使用了逐字逐句。我不知道这个设置是否最佳,但结果是mp4在iOs和VLC播放时音频和视频保持同步。此ffmpeg选项在连接期间和之后对已连接的文件重新编码时都产生了正确的iOs同步。

音频可能必须重新编码,但不能。您可以使用
-video\u track\u timescale
更改MOV/MP4s的视频时基,而无需重新编码。如果您粘贴输入文件的详细信息,这将非常有用。我认为这可能与此有关,这可能是音频同步问题的一部分。sboisse建议使用.Y
$ cat input_1.mts input_2.mts input_3.mts > output.mts