我正在开发一个依赖FFMpeg来对音频文件执行各种转换的应用程序。我目前正在命令行上测试我的FFMpeg配置。
我正在尝试连接不同格式的多个音频文件(主要是MP3,MP2和WAV)。我一直在使用官方TRAC文档(https://trac.ffmpeg.org/wiki/How%20to%20concatenate%20(join%2C%20merge)%20media%20files#differentcodec)来帮助我,并创建了以下命令:
ffmpeg -i OHIn.wav -i OHOut.wav -filter_complex '[0:0] [1:0] concat=n=2:a=1 [a]' -map '[a]' output.wav
但是,当我使用FFMpeg的2.0.1版在Mac OS X上运行时,我收到以下错误消息:
Stream specifier ':0' in filtergraph description [0:0] [1:0] concat=n=2:a=1 [a] matches no streams.
以下是终端的完整输出:
~/ffmpeg -i OHIn.wav -i OHOut.wav -filter_complex '[0:0] [1:0] concat=n=2:a=1 [a]' -map '[a]' output.wav
ffmpeg version 2.0.1 Copyright (c) 2000-2013 the FFmpeg developers
built on Aug 15 2013 10:56:46 with llvm-gcc 4.2.1 (LLVM build 2336.11.00)
configuration: --prefix=/Volumes/Ramdisk/sw --enable-gpl --enable-pthreads --enable-version3 --enable-libspeex --enable-libvpx --disable-decoder=libvpx --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-avfilter --enable-libopencore_amrwb --enable-libopencore_amrnb --enable-filters --enable-libgsm --arch=x86_64 --enable-runtime-cpudetect
libavutil 52. 38.100 / 52. 38.100
libavcodec 55. 18.102 / 55. 18.102
libavformat 55. 12.100 / 55. 12.100
libavdevice 55. 3.100 / 55. 3.100
libavfilter 3. 79.101 / 3. 79.101
libswscale 2. 3.100 / 2. 3.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 3.100 / 52. 3.100
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, wav, from 'OHIn.wav':
Duration: 00:00:06.71, bitrate: 1411 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Guessed Channel Layout for Input Stream #1.0 : stereo
Input #1, wav, from 'OHOut.wav':
Duration: 00:00:07.19, bitrate: 1411 kb/s
Stream #1:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Stream specifier ':0' in filtergraph description [0:0] [1:0] concat=n=2:a=1 [a] matches no streams.
我不明白为什么这不起作用。 FFMpeg显示源文件中存在流0:0和1:0。网上唯一的其他类似问题包括在Windows中使用单引号,但是测试确认它不适用于我的Mac命令行。
非常感谢任何帮助。
答案 0 :(得分:13)
您需要告诉concat过滤器输出视频流的数量。视频的默认值为v=1
,音频的默认值为a=0
,但您没有视频流。最好不要依赖默认值。手动列出输入段数(n
),输出视频流(v
)和输出音频流(a
)。
ffmpeg -i input0.wav -i input1.wav -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1[a]" -map "[a]" output.wav
请注意,我添加了v=0
。
有关详细信息,请参阅concat filter documentation。
答案 1 :(得分:6)
除了支持Lord Neckbeard的回复,这解决了我的问题btw:我想提供一个Bash Shell脚本的工作示例,显示我如何连接三个mp3文件(一个介绍,中间和outro,每个具有相同比特率160 kbps,采样率为44.1 Khz)成为一个结果mp3。我的过滤器图表的原因是:
[0:a] [1:a] [2:a]
而不是像:
[0:0] [1:0] [2:0]
是因为有些mp3有艺术品,ffmpeg认为每个输入mp3文件有两个流,一个音频(用于音乐本身)和一个视频(用于图像图形文件)。
:a
部分让ffmpeg知道您希望它只使用它为该输入文件读取的音频流并将其传递给concat过滤器。因此任何视频过滤器都会被忽略这样做的好处是,您不需要知道视频流的位置(这样您就不会意外地传递它),如运行如下命令所指定的那样:
ffprobe control-intro-recording.mp3
。
无论如何,我离题了,这是shell脚本:
#!/bin/sh
ffmpeg -i ./source-files/control-intro-recording.mp3 \
-i ./source-files/control-middle-1-hour-recording-with-artwork-160-kbps.mp3 \
-i ./source-files/control-outro-recording.mp3 \
-filter_complex '[0:a] [1:a] [2:a] concat=n=3:v=0:a=1 [a]' \
-map '[a]' ./output-files/control-output-with-artwork-160-kbps-improved.mp3
答案 2 :(得分:1)
我遇到了这个Stream specifier ':0' in filtergraph description [0:0] [1:0]
...错误尝试合并两个视频文件。 @ LordNeckbeard的回答帮助我诊断了这个问题。我提到它是一个单独的答案,以防像我这样的未来类似的情况遇到视频文件。
原来我的一个视频没有音轨。使用
添加音轨ffmpeg -f lavfi -i aevalsrc=0 -i title-slide.mp4 -shortest -c:v copy \
-c:a mp3 -strict experimental title.mp4
让我走了。