Audio map_频道在ffmpeg中是如何工作的?

Audio map_频道在ffmpeg中是如何工作的?,audio,ffmpeg,Audio,Ffmpeg,我需要从5.1音频中提取频道。这些音频曲目包含在MKV文件中。“movie.mkv”文件的结构如下: Input #0, matroska,webm, from 'movie.mkv': Duration: 00:40:38.08, start: 0.000000, bitrate: 21128 kb/s Stream #0:0(eng): Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x800 [SAR 1:1 D

我需要从5.1音频中提取频道。这些音频曲目包含在MKV文件中。“movie.mkv”文件的结构如下:

Input #0, matroska,webm, from 'movie.mkv':
  Duration: 00:40:38.08, start: 0.000000, bitrate: 21128 kb/s
    Stream #0:0(eng): Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x800 [SAR 1:1 DAR 12:5], 24 fps, 24 tbr, 1k tbn, 48 tbc
    Stream #0:1(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s
    Stream #0:2(ger): Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 1536 kb/s
    Stream #0:3(eng): Subtitle: subrip
但是语法非常混乱,所以我没有弄清楚如何正确提取通道

对于第一首音频曲目,此代码工作正常:

ffmpeg -i "movie.mkv" -map_channel 0.1.0 "eng channel 1.wav"
ffmpeg -i "movie.mkv" -map_channel 0.1.1 "eng channel 2.wav"
ffmpeg -i "movie.mkv" -map_channel 0.1.2 "eng channel 3.wav"
ffmpeg -i "movie.mkv" -map_channel 0.1.3 "eng channel 4.wav"
ffmpeg -i "movie.mkv" -map_channel 0.1.4 "eng channel 5.wav"
ffmpeg -i "movie.mkv" -map_channel 0.1.5 "eng channel 6.wav"
我相信0.1.0是:input#0(movie.mkv);然后,流1(音频eng);然后是通道0(第一个通道)

但当我试图从第二个音轨中提取频道时

ffmpeg -i "movie.mkv" -map_channel 0.2.0 "ger channel 1.wav"
ffmpeg -i "movie.mkv" -map_channel 0.2.1 "ger channel 2.wav"
ffmpeg -i "movie.mkv" -map_channel 0.2.2 "ger channel 3.wav"
ffmpeg -i "movie.mkv" -map_channel 0.2.3 "ger channel 4.wav"
ffmpeg -i "movie.mkv" -map_channel 0.2.4 "ger channel 5.wav"
ffmpeg -i "movie.mkv" -map_channel 0.2.5 "ger channel 6.wav"
…它不提取德语声音,而是使用相同的eng频道(与前一种情况相比声音略大)生成。在这段代码中,0.2.0似乎是:input#0(movie.mkv);然后流2(音频ger);然后是通道0(第一个通道)

那么我做错了什么?:-)

使用channelsplit过滤器 更简单的方法是:

ffmpeg -i input.mkv -filter_complex "[0:a:0]channelsplit=channel_layout=5.1(side)[FL][FR][FC][LFE][SL][SR]" -map "[FL]" front_left.wav -map "[FR]" front_right.wav -map "[FC]" front_center.wav -map "[LFE]" lfe.wav -map "[SL]" side_left.wav -map "[SR]" side_right.wav
  • 上面的示例将从第一个音频流(
    流#0:1(eng)
    )获取音频。如果您想要
    Stream#0:2(ger)
    ,请将
    [0:a:0]
    更改为
    [0:a:1]
    。有关
    [0:a:0]
    语法的更多详细信息,请参阅

  • 有关更多示例,请参见

  • 请参阅
    ffmpeg-layouts
    ,了解使用channelsplit时有用的频道布局和频道名称列表


我提供了一个答案,给出了另一种解决方案。如果您仍然想使用
-map\u channel
,请显示
ffmpeg-i“movie.mkv”-map\u channel 0.2.0“ger channel 1.wav”中的完整日志。
不需要,channelsplit很好:-)我假设有人会建议使用filter\u complex和channelsplit。我认为使用channelsplit确实使命令更具可读性。非常感谢你的解释!