Как map_channel работает в ffmpeg? - PullRequest
0 голосов
/ 02 августа 2020

Мне нужно извлечь каналы из 5.1 aud ios. Эти аудиодорожки содержатся в файле MKV. Структура файла "mov ie .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 (mov ie .mkv); затем поток 1 (аудио англ.); затем канал 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 (mov ie .mkv); затем поток 2 (аудиогер); затем канал 0 (самый первый канал).

Так что я делаю не так? : -)

1 Ответ

1 голос
/ 02 августа 2020

Использовать фильтр разделения каналов

diagram of splitting 5.1 channel layout to individual mono components

Фильтр разделения каналов проще:

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
  • В приведенном выше примере звук будет первый аудиопоток (Stream #0:1(eng)). Если вы хотите Stream #0:2(ger), измените [0:a:0] на [0:a:1]. См. этот ответ для получения дополнительных сведений о синтаксисе [0:a:0].

  • Дополнительные примеры см. FFmpeg Wiki: Audio Channels .

  • См. ffmpeg -layouts для получения списка раскладок и названий каналов, который полезен при использовании разделения каналов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...