audio - FFmpeg:在没有 filter_complex 的情况下连接视频文件(包含音频)

标签 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(使用 .txt 文件和 -c:v 复制 -an), (3) 将(1)中获得的音频添加到(2)中获得的结果中。然而,在(1)中获得的音频的持续时间比在(2)中获得的视频的持续时间短。
知道所有音轨都用 aac 编码并且具有相同的采样频率,唯一不同的参数是 kb/s 的数量。

您能帮我找出一种无需使用 filter_complex 即可连接这些视频幻灯片的方法吗?

非常感谢!

最佳答案

在使用基于 MDCT 的音频编解码器(如 AAC)时,与 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 秒)。

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

关于audio - FFmpeg:在没有 filter_complex 的情况下连接视频文件(包含音频),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359176/

相关文章:

php - ffmpeg 使用 php 变量将 wav 转换为 mp3

math - 如何自然淡出音量?

android - 强制USB音频输出

android - 如何在 Android 上使用 ffmpeg 命令

python - "FFmpeg was not found, spotdl can' t continue”,即使它是使用 sudo apt-get install spotdl 安装的 + 如果从终端运行它也可以工作

MySQL SELECT 条件 CONCAT

ios - 使用AudioUnitSetParameter

amazon-web-services - EBS FFMPEG 未从 ebexentsions 安装

jquery - 与 jquery 连接

从 token 和宏的串联创建类似对象的宏