当前位置: 首页 > 知识库问答 >
问题:

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

相德宇
2023-03-14

我在尝试连接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个答案

通煜祺
2023-03-14

在使用基于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的持续时间(在本例中为100s)。

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

 类似资料:
  • 我正在尝试使用FFMPEG合并2个mp4文件。其中一个文件同时具有视频和音频(),而另一个只有音频()。这些文件的名称以以下方式列在名为的文本文件中: 然后执行下面的ffmpeg命令来合并它们。 但是,生成的连接文件只包含。也就是说,如果

  • 我正在寻找一个解决方案在FFmpeg合并音频(mp3)与短视频循环,或GIF。 我已经能够通过加入音频从图像生成视频,但视频在音频持续时间内保持静态帧,命令如下: 我需要的视频,有音频的持续时间,但使用另一个mp4或GIF循环。在音频持续时间内保持重复。

  • 使用ffmpeg concat连接多个文件似乎会导致音频的时间戳或偏移不匹配。我试过几个视频,发现H.264/MP4也有同样的问题。 使用并对视频进行编码似乎可以很好地工作。当ffmpeg执行全部转换计算时,音频保持同步,似乎可以得到所有正确的结果。 然而,简单地将视频级联而不进行任何转换或编码会导致同步问题缓慢增加。显然,对视频进行编码而不是简单地加入它们将导致信息/质量的损失,所以我宁愿找到一

  • 然后我尝试这样写音频帧: 问题是我从来不传递这个语句:“if(pkt.stream_index==st->index)”。数据包流索引从来不等于音频流索引。谁能指出我错在哪里? 更新: 顺便说一句,下面的答案没有帮助,因为它假设音频和视频流都来自同一个文件,而在我的情况下,只有音频来自外部源。

  • 我想从视频中提取对齐的音频流。目标是获得与视频精确对齐的音频序列。 问题:视频和音频序列不对齐。输出音频持续时间比视频输入短。 要复制的脚本: 我的尝试(没有成功): 按照此答案中的建议添加 添加,同时导出视频(链接) 在Audacity中打开。那里的持续时间是 在VLC中打开。持续时间: 显式设置帧率 其他视频文件 如果能给我一些建议,我将不胜感激。非常感谢。

  • 如果我尝试对其运行第一个命令行,则输出视频将给出一个错误。 所有的反馈赞赏缩短一个视频,然后添加结尾。 干杯!瑞安