15

我正在开发一个严重依赖 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 命令行。

任何帮助将非常感激。

4

3 回答 3

19

您需要告诉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 过滤器文档

于 2013-10-17T18:25:25.817 回答
8

除了支持 Neckbeard 勋爵的回应,这解决了我的问题顺便说一句:我想提供一个 Bash Shell 脚本的工作示例,展示我如何连接三个 mp3 文件(一个 intro、middle 和 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
于 2014-05-24T01:24:25.643 回答
3

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

让我走了。

于 2017-02-07T16:32:01.730 回答