Try   HackMD

[FFmpeg] 音訊聲道處理

聲道編號與布局名稱

查詢各音訊布局各聲道編號

  • mono: FC
    聲道布局名稱為 mono,單聲道,聲道 #0 就是 FC

  • stereo: FL+FR
    聲道布局名稱為 stereo ,2 聲道。聲道 #0 - 1: FL, FR

  • 5.1(side): FL+FR+FC+LFE+SL+SR
    聲道布局名稱為 5.1(side),6 聲道,聲道 #0 - 5: FL, FR, FC, LFE, SL, SR

可用 -layouts 查詢得知更多布局:

ffmpeg -layouts

查詢音訊的聲道布局

使用 ffmpeg 讀取影片檔:

ffmpeg -i 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:3(eng): Subtitle: subrip

由以上結果可知音訊布局是 5.1(side)

降混聲道 (Dwonmix)

要將聲道以混合的方式由多變少可以使用 -ac 選項。當設定的輸出的聲道數量數比輸入還要少時,會以混合輸入聲道的方式減少聲道。

降混 2 聲道以上至立體聲 (stereo)

使用 -ac 2 降混為雙聲道:

ffmpeg -i input.wav -ac 2 output.wav

特殊降混

表面上是將多個聲道降混到較少的聲道,但透多聲道的訊息被矩陣編碼給隱藏到輸出的聲道內容之中,特過支援的解碼器或與設備可以將隱藏的多聲道訊息還原回多聲道。

降混 6 聲道以上至 Dolby Pro Logic II

使用 aresample 篩選器提供的 matrix_encoding 選項降混為 DPL2:

ffmpeg -i input.wav -ac 2 -af "aresample=matrix_encoding=dplii" output.m4a"

提取聲道

提取 1 個聲道為單聲道 (mono)

使用 channelsplit 篩選器提取第一個(#0)聲道:

ffmpeg -i input.wav -filter_complex "channelsplit=channel_layout=stereo[c0][c1]" -map "[c0]" channel_0.wav

使用 -map_channel 選項提取第一個(#0)聲道:

ffmpeg -i input.flac -map_channel 0.0.0 output.flac

使用 pan 篩選器提取第一個(#0)聲道:

ffmpeg -i input.flac -af "pan=1c|c0=c0" output.flac

使用 pan 篩選器提取輸入音訊的左聲道:

ffmpeg -i input.flac -af "pan=1c|FC=FL" output.flac

提取 2 個聲道為立體聲 (stereo)

使用 pan 篩選器提取 FL 與 FR 輸出為雙聲道:

ffmpeg -i input.wav -af "pan=stereo|c0=FL|c1=FR" output.wav

使用 pan 篩選器提取聲道編號0與1輸出為雙聲道:

ffmpeg -i input.wav -af "pan=stereo|c0=c0|c1=c1" output.wav

使用 -map_channel 提取聲道編號0與1輸出為雙聲道:

ffmpeg -i input.wav -map_channel 0.0.0 -map_channel 0.0.1 output.wav

複製聲道

要將聲道以複製的方式由少變多可以使用 -ac 選項。當設定的輸出的聲道數量數比輸入還要多時,會以複製輸入聲道的方式增加聲道。也可以使用 -map_channel 重複選取同樣的輸入聲道來得到相同的內容的新聲道。

mono → stereo

FL = input_FC
FR = input_FC

使用 -ac 選項:

ffmpeg -i input.wav -ac 2 output.wav

使用 pan 篩選器:

ffmpeg -i input.wav -af "pan=stereo|c0=c0|c1=c0" output.wav

-map_channel 選項:

ffmpeg -i input.wav -map_channel 0.0.0 -map_channel 0.0.0 output.wav

amerge 篩選器:

ffmpeg -i input.wav -filter_complex "[0:a][0:a]amerge=inputs=2[aout]" -map "[aout]" output.wav

混合聲道

stereo → stereo 兩個聲道互相混合

FL = input_FL + input_FR
FR = input_FL + input_FR

使用 pan 篩選器來互相混合左右聲道:

ffmpeg -i input.wav -af "pan=stereo|c0<c0+c1|c1<c0+c1" output.flac

混合不同音訊串流的聲道

如果要把兩個雙聲道(stereo)音訊混合為一個雙聲道音訊,可以使用以下這兩種做法。

混合相同位置聲道

FL = input0_FL + input1_FL
FR = input0_FR + input1_FR

amerge 篩選器 → pan 篩選器:

ffmpeg -i input0.wav -i input1.wav -filter_complex "[0:a][1:a]amerge=inputs=2,pan=stereo|c0<c0+c2|c1<c1+c3[aout]" -map "[aout]" output.flac

amerge 篩選器 → -ac 選項:

ffmpeg -i input0.wav -i input1.wav -filter_complex "[0:a][1:a]amerge=inputs=2[aout]" -map "[aout]" -ac 2 output.flac

混合相同音源聲道

FL = input0_FL + input0_FR
FR = input1_FL + input1_FR

amerge 篩選器 → pan 篩選器:

ffmpeg -i input0.wav -i input1.wav -filter_complex "[0:a][1:a]amerge=inputs=2,pan=stereo|c0<c0+c1|c1<c2+c3[aout]" -map "[aout]" output.flac

交換聲道位置

FL = input0_FR
FR = input0_FL

使用 -map_channel 選項來交換聲道位置:

ffmpeg -i stereo.flac -map_channel 0.0.1 -map_channel 0.0.0 output.wav

使用 pan 篩選器來交換聲道位置:

ffmpeg -i stereo.ogg -af "pan=stereo|c0=c1|c1=c0" output.wav

靜音聲道

使用 pan 篩選器,將目標聲道乘以零已得到即可得到一個靜音的聲道。或者是使用 -map_channel 選取需要的聲道再用選取 -1 代表一個靜音聲道。

FL = 0
FR = input0_FR

使用 -map_channel -1 將輸入雙聲道的左聲道靜音:

ffmpeg -i stereo.wav -map_channel -1 -map_channel 0.0.1 output.wav

使用 pan 篩選器將輸入雙聲道的左聲道靜音:

ffmpeg -i stereo.ogg -af "pan=stereo|c0=0*c0|c1=c1" output.wav

分割聲道

如果要分割每個聲道為單聲道音訊串流,可以使用 channelsplit / pan 篩選器來做到這點。

使用 channelsplit 篩選器分割 6 聲道輸出為個別個音軌:

ffmpeg -i input.flac -filter_complex channelsplit=channel_layout=stereo output.mka

使用 -map_channel 選項分割 6 聲道輸出為個別個音軌:

ffmpeg -i input.flac -map 0:0 -map 0:0 -map 0:0 -map 0:0 -map 0:0 -map 0:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -map_channel 0.0.2:0.2 -map_channel 0.0.3:0.3 -map_channel 0.0.4:0.4 -map_channel 0.0.5:0.5 output.mka

使用 pan 篩選器分割6聲道輸出為個別個音軌:

ffmpeg -i input.flac -filter_complex "[0:a:0]pan=1c|c0=c0[a0],[0:a:0]pan=1c|c0=c1[a1],[0:a:0]pan=1c|c0=c2[a2],[0:a:0]pan=1c|c0=c3[a3],[0:a:0]pan=1c|c0=c4[a4],[0:a:0]pan=1c|c0=c5[a5]" -map "[a0]" -map "[a1]" -map "[a2]" -map "[a3]" -map "[a4]" -map "[a5]" output.mka

使用 channelsplit 篩選器分割 6 聲道輸出為個別檔案:

ffmpeg -i input.wav -filter_complex "channelsplit=channel_layout=5.1[c0][c1][c2][c3][c4][c5]" -map "[c0]" channel_0.wav -map "[c1]" channel_1.wav -map "[c2]" channel_2.wav -map "[c3]" channel_3.wav -map "[c4]" channel_4.wav -map "[c5]" channel_5.wav

使用 -map_channel 分割 6 聲道輸出為個別檔案:

ffmpeg -i input.flac -map_channel 0.0.0 channel_0.wav -map_channel 0.0.1 channel_1.wav -map_channel 0.0.2 channel_2.wav -map_channel 0.0.3 channel_3.wav -map_channel 0.0.4 channel_4.wav -map_channel 0.0.5 channel_5.wav

使用 pan 篩選器分割 6 聲道分割輸出為個別檔案:

ffmpeg -i input.flac -filter_complex "[0:a:0]pan=1c|c0=c0[c0],[0:a:0]pan=1c|c0=c1[c1],[0:a:0]pan=1c|c0=c2[c2],[0:a:0]pan=1c|c0=c3[c3],[0:a:0]pan=1c|c0=c4[c4],[0:a:0]pan=1c|c0=c5[c5]" -map "[c0]" channel_0.wav -map "[c1]" channel_1.wav -map "[c2]" channel_2.wav -map "[c3]" channel_3.wav -map "[c4]" channel_4.wav -map "[c5]" channel_5.wav

合併多個單聲道為多聲道

如果合併多個單聲道為為一個多聲道串流,可以使用 amerge 篩選器來做到這點。

2 × mono → stereo:

ffmpeg -i left.wav -i right.wav -filter_complex "[0:a][1:a]amerge=inputs=2[aout]" -map "[aout]" output.wav

6 × mono → 5.1:

ffmpeg -i front_left.wav -i front_right.wav -i front_center.wav -i lfe.wav -i back_left.wav -i back_right.wav -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[aout]" -map "[aout]" output.wav
tags: ffmpeg