首页 文章

FFmpeg:连接不带filter_complex的视频文件(包含音频)

提问于
浏览
0

尝试连接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(使用.txt文件和-c:v copy -an), (3) 添加获得的音频( 1)在(2)中获得的结果 . 然而,在(1)中获得的结果音频的持续时间短于在(2)中获得的视频的持续时间 . 知道所有音频轨道都是用aac编码并具有相同的采样频率,唯一的参数从一个变为另一个是kb / s的数量 .

你可以帮我找到一种方法来连接这些视频幻灯片而不必使用filter_complex吗?

非常感谢你!

1 回答

  • 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秒) .

    这种方法的优点是没有视频转码,并且很容易调整持续时间值以调整同步问题 .

相关问题