FFmpeg
簡介與其他資料:
http://www.mobile01.com/topicdetail.php?f=510&t=3734550
其他範例:
http://www.mobile01.com/topicdetail.php?f=510&t=4487462
改變音量
如果要改變音量,你可以使用 `volume` filter,用法如下。
0.5倍音量:
ffmpeg -i input.wav -af "volume=0.5" output.wav
1.5倍音量:
ffmpeg -i input.wav -af "volume=1.5" output.wav
使用分貝單位:
ffmpeg -i input.wav -af "volume=5dB" output.wav
峰值正常化
音量檢測
如果要將一個 音訊的音量正常化,可以使用 `volumedetect` 檢測 音量峰值 (max_volume),然後使用 `volume` filter 將音量峰值歸零或接近零即可,如果音量峰值是 -6 dB 則提高 6 dB 就能歸零。
例如要將一個 WAV 音訊轉為 AAC 格式並將音量正常化,
首先,使用 `volumedetect` 檢測音量:
ffmpeg -i input.wav -af "volumedetect" -f null -
假設 VolumeDetect 輸出訊息為:
```
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] mean_volume: -16.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] max_volume: -5.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] histogram_0db: 87861
```
手動音量正常化
承上,輸出訊息得知音量峰值 (max_volume) 為 -5 dB,所以要將音量峰值歸零需要提高 5dB。
音量峰值歸零需要提高 5dB
ffmpeg -i input.wav -af "volume=5dB" output.wav
如果用了 pan filter 或是 -ac 選項來混合聲道 (Mix channels) ,你會發現輸出的音訊的音量變小,可以用同樣的參數設定加上 `volumedetect` filter 來檢測 混合聲道後的音量。
使用 `volumedetect` 檢測 downmix 之後的音量:
ffmpeg -i input.wav -ac 2 -af "volumedetect" -f null -
注意 因為是要檢測 downmix 為雙聲道之後的音量所以 -ac 2 是必要的。
假設 `volumedetect` 輸出訊息為:
```
[Parsed_volumedetect_0 @ 00600c60] n_samples: 814080
[Parsed_volumedetect_0 @ 00600c60] mean_volume: -29.5 dB
[Parsed_volumedetect_0 @ 00600c60] max_volume: -7.9 dB
```
由上面輸出訊息得知音量峰值 (max_volume) 為 -7.9 dB,所以要將音量峰值歸零需要提高 7.9dB。
感知音量正常化
使用 `loudnorm` 過濾器正常化音量:
ffmpeg -i input.wav -filter:a loudnorm output.wav
取得統計資料
設定 `print_format` 參數之值為 `json` 或 `summary`,輸出統計資料將包含音源與輸出的 I (Integrated Loudness, 綜合響度)、LRA (Loudness Range, 響度範圍)、 TP (True Peak, 真實峰值)、Threshold (閾值) 之值。
音量正常化並輸出統計資料:
ffmpeg -i input.wav -filter:a loudnorm=print_format=json output.wav
如果只是要取得音源的 I、LRA、TP、Threshold 之值,可以使用 `null` demuxer 不輸出檔案:
ffmpeg -i input.wav -filter:a loudnorm=print_format=json -f null -
```json
[Parsed_loudnorm_0 @ 000001ae4d5bc040]
{
"input_i" : "-24.09",
"input_tp" : "-7.96",
"input_lra" : "4.80",
"input_thresh" : "-35.76",
"output_i" : "-23.23",
"output_tp" : "-8.22",
"output_lra" : "4.00",
"output_thresh" : "-34.40",
"normalization_type" : "dynamic",
"target_offset" : "-0.77"
}
```
二階段處裡
使用二階段處裡來得到更加準確的音量正常化效果。
承上,再次使用 `loudnorm` 過濾器處理音源,設定 `linear` 參數之值為 `true`,以應用線性縮放,並設定 `measured_I`, `measured_LRA`, `measured_TP`, `measured_thresh` 為之前獲得的音源 I、LRA、TP、Threshold 之值。
ffmpeg -input.wav -filter:a loudnorm=linear=true:measured_I=-24.09:measured_LRA=4.80:measured_TP=-7.96:measured_thresh=-35.76 output.wav