FFmpeg:连接不带filter_complex

时间:2016-12-28 09:34:47

标签: audio ffmpeg concatenation

尝试连接FFmpeg中的多个文件时遇到问题;我的目标是通过连接不同类型的幻灯片来创建视频演示:

(a)图像幻灯片,通过循环框架一段时间将其转换为视频。这些类型的幻灯片没有音频,所以我为它们添加了一个静音音轨:

ffmpeg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -loop 1 -i inputFile.png -c:v libx264 -shortest -c:a aac -pix_fmt yuv420p -movflags faststart -profile:v high -r 30 -t 3 -level 4.0 -preset veryfast -crf 23 outputA.mp4

(b)视频幻灯片,其中包含重叠的水印,并持续到视频结束。如果文件不包含音频,则会以与上一种情况相同的方式添加:

-y -i inputFile.mp4 -i Watermark.jpg -filter_complex "[0]scale=1280:720,setsar=sar=1/1[0b]; [1]scale=1280:720[1b]; [0b][1b]overlay=0:0[ov]"  -c:v libx264 -shortest -c:a aac -pix_fmt yuv420p -movflags faststart -profile:v high -r 30 -t 2.8400055 -level 4.0 -preset veryfast -crf 23 outputB.mp4

-y -i inputFile.mp4 -i Watermark.jpg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -filter_complex "[0]scale=1280:720,setsar=sar=1/1[0b]; [1]scale=1280:720[1b]; [0b][1b]overlay=0:0[ov]"  -c:v libx264 -shortest -c:a aac -pix_fmt yuv420p -movflags faststart -profile:v high -r 30 -t 2.8400055 -level 4.0 -preset veryfast -crf 23 outputC.mp4

因此,一旦我拥有所有生成的文件和包含所有文件名的.txt文件,我想使用简单命令连接:

-y -f concat -safe 0 -i textfile.txt -c copy  outputConcat.mp4

不幸的是,我获得的结果远非完美,因为音频拧紧一切;我知道音频是问题,因为在不考虑音频的情况下调用相同的指令(即使用 -c:v copy -an 而不是 -c copy )细

我测试的一个解决方案是使用filter_complex内部的concat过滤器(再次转码音频和视频),但我担心速度,这个过程很慢,可以丢弃。

-y  -i Slide1.mp4 -i Slide2.mp4 -i Slide3.mp4 -filter_complex " [0:v:0][0:a:0] [1:v:0][1:a:0] [2:v:0][2:a:0] concat=n=3:v=1:a=1[v][a]" -map "[v]" -map "[a]" -c:v libx264 -c:a aac -pix_fmt yuv420p -movflags faststart -profile:v high -r 30 -level 4.0 -preset veryfast -crf 23 Report.mp4

我的另一个想法是:(1)仅连接filter_complex内的音轨(更快),(2)仅连接视频而不使用filter_complex(使用a .txt文件和 -c:v copy -an ),(3)将(1)中获得的音频添加到(2)中获得的结果中。然而,在(1)中获得的结果音频的持续时间短于在(2)中获得的视频的持续时间。 知道所有音频轨道都是用aac编码并具有相同的采样频率,唯一的参数从一个变为另一个是kb / s的数量。

是否可以帮助我找到一种方法来连接这些视频幻灯片,而无需使用filter_complex?

非常感谢!

1 个答案:

答案 0 :(得分:0)

在使用像AAC这样的基于MDCT的音频编解码器时,使用concat维护A / V同步总是一件苦差事。

我建议在同一个命令中执行两个concat操作。

ffmpeg -f concat -i video.txt -f concat -i audio.txt -map 0:v -c:v copy -map 1:a -c:a aac -shortest out.mp4

video.txt是您当前的列表。

对于音频,请创建一个如下所示的空文件:

ffmpeg -f lavfi -i anullsrc -t 100 empty.wav

然后像这样创建一个audio.txt

file 'empty.wav'
duration 15.4
file 'videoslide1.mp4'
file 'empty.wav'
duration 3
file 'videoslide2.mp4'
file 'videoslide3.mp4'
file 'empty.wav'
duration 37
file 'videoslide4.mp4'
file 'empty.wav'

只应列出empty.wav和包含现有音频的视频。 empty.wav将出现在video.txt中列出无音频视频的位置。每个empty.wav条目的持续时间是带有音频的视频幻灯片条目之间的无音频视频的总持续时间。此持续时间必须小于empty.wav的持续时间(在这种情况下为100秒)。

此方法的优点在于没有视频转码,并且可以轻松调整持续时间值以调整同步问题。