FFMpeg连接过滤器:filtergraph中的流说明符':0'不匹配任何流

Ant*_*den 11 audio ffmpeg

我正在开发一个严重依赖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
Run Code Online (Sandbox Code Playgroud)

但是,当我使用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.
Run Code Online (Sandbox Code Playgroud)

这是终端的完整输出:

~/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.
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这不起作用.FFMpeg显示源文件中存在流0:0和1:0.网上唯一的其他类似问题包括在Windows中使用单引号,但是对此的测试证实它不适用于我的Mac命令行.

任何帮助将非常感激.

llo*_*gan 15

您需要告诉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
Run Code Online (Sandbox Code Playgroud)

请注意,我添加了v=0.

有关详细信息,请参阅concat过滤器文档.

  • 为我工作.Muchas Gracias LordNeckbeard(很酷的名字顺便说一句).! (2认同)

rac*_*101 6

除了赞成Lord Neckbeard的回应,这解决了我的问题顺便说一句:我想提供一个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
Run Code Online (Sandbox Code Playgroud)