通过 ffmpeg filter_complex 连接两个音频文件

通过 ffmpeg filter_complex 连接两个音频文件

如果我尝试通过-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

相关内容