![通过 ffmpeg filter_complex 连接两个音频文件](https://linux22.com/image/1430875/%E9%80%9A%E8%BF%87%20ffmpeg%20filter_complex%20%E8%BF%9E%E6%8E%A5%E4%B8%A4%E4%B8%AA%E9%9F%B3%E9%A2%91%E6%96%87%E4%BB%B6.png)
如果我尝试通过-filter_complex
使用命令连接两个 mp4 视频文件:
ffmpeg -i a.mp4 -i b.mp4 -filter_complex \
"[0:1] [0:0] [1:1] [1:0] concat=n=2:v=1:a=1 [v] [a]" \
-map [v] -map [a] -y testfull.mp4
它工作正常但如果我尝试类似的音频文件如下:
ffmpeg -i a.mp3 -i b.mp3 -filter_complex \
"[0:1] [0:0] [1:1] [1:0] concat=n=2:a=1 [a]" \
-map [a] -y testfull.mp3
出现错误:
Input #1, mp3, from 'b.mp3': Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isomavc1mp42
creation_time : 2010-12-13 21:15:11
encoder : Lavf53.4.0 Duration: 00:02:01.61, start: 0.000000, bitrate: 64 kb/s
Stream #1:0: Audio: mp3, 8000 Hz, stereo, s16p, 64 kb/s
Stream specifier ':1' in filtergraph description [0:1] [0:0] [1:1] [1:0] concat= n=2:a=1 [a] matches no streams.
如果我修改-filter_complex
参数并运行命令如下:
ffmpeg -i a.mp3 -i b.mp3 -filter_complex \
"concat=n=2:a=1 [a]" -map [a] -y testfull.mp3
出现以下错误
Input #1, mp3, from 'b.mp3': Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isomavc1mp42
creation_time : 2010-12-13 21:15:11
encoder : Lavf53.4.0 Duration: 00:02:01.61, start: 0.000000, bitrate: 64 kb/s
Stream #1:0: Audio: mp3, 8000 Hz, stereo, s16p, 64 kb/s
Cannot find a matching stream for unlabeled input pad 0 on filter Parsed_concat_ 0
有人能帮助我如何通过最新ffmpeg
版本合并两个音频文件吗-filter_complex
?
更新:好的,用这个ffmpeg
命令解决了我的问题:
ffmpeg -i "concat:a.mp3|b.mp3" -c copy output.mp3
答案1
您必须告诉 concat 过滤器将不会有视频:v=0
并且您也不需要处理视频流[0:0]
[1:0]
,因此命令将是这样的:
ffmpeg -i a.mp3 -i b.mp3 -filter_complex \
"[0:a] [1:a] concat=n=2:v=0:a=1 [a]" \
-map [a] -c:a mp3 testfull.mp3
答案2
只是为了使事情更清楚,[0:1] [0:0] [1:1] [1:0]
指的是来自这两个文件的流。
就你的情况而言:
[0:1] is video from first file
[0:0] is audio from first file
[1:1] is video from second file
[1:0] is audio from second file
对于 mp3 文件,视频流不存在。因此,您应该在命令中删除视频流引用。
如果您的最后一个命令有效 - 是的,这是 mp3 文件的有效解决方案。
答案3
n 是流段的数量,而不是输入文件的数量
来自 concat 文档
该过滤器适用于同步视频和音频流的片段。所有片段必须具有相同数量的每种类型的流,并且这也是输出的流数量。
该过滤器接受以下选项:
n - 设置段数。默认值为 2。
过去几天我一直在与此作斗争,并一遍又一遍地阅读这个问题及其回复。我将 PNG 序列(输入 0)与 WAV 文件(输入 1)合并,并不断收到相同的错误
在过滤器 Parsed_concat_ 0 上找不到未标记输入 pad 0 的匹配流
经过多次尝试和失败后,我最终找到 n=1(即一个所需的输出流)和 v=1:a=1...即一个视频和一个音频输入流...又名连接一个由来自输入 0 的视频和来自输入 1 的音频组成的段,然后它工作得很好。
完整命令行
ffmpeg -i '/var/tmp/input.%04d.png -i '/var/tmp/input.wav' -filter_complex '[0:v:0] [1:a:0] concat=n=1:v=1:a=1 [vout] [aout]' -map '[vout]' -map '[aout]' -vcodec 'mjpeg' '/var/tmp/output.mov'
答案4
您必须混合音频流:
ffmpeg -i 1.mp4 -i 1.3gp -i 2.3gp -i 1.mp3
-filter_complex "[2]adelay=10000|10000[s2];[3:a][1:a][s2]amix=3[a]"
-map 0:v -map "[a]" -c:v copy result.mp4