---
# System prepended metadata

title: '[FFmpeg] 音量調整'
tags: [ffmpeg]

---

# [FFmpeg] 音量調整

## 改變音量

如果要改變音量，你可以使用 `volume` 篩選器，用法如下。

0.5倍音量：
```powershell
ffmpeg -i input.wav -af "volume=0.5" output.wav
```

1.5倍音量：
```powershell
ffmpeg -i input.wav -af "volume=1.5" output.wav
```

使用分貝單位：
```powershell
ffmpeg -i input.wav -af "volume=5dB" output.wav
```

## 峰值正常化

如果要將一個 音訊的音量正常化，可以使用 volumedetect 檢測 音量峰值 `max_volume`，然後使用 `volume` 篩選器將音量峰值歸零或接近零即可，如果音量峰值是 -6 dB 則提高 6 dB 就能歸零。

例如要將一個 WAV 音訊轉為 AAC 格式並將音量正常化。

首先，使用 `VolumeDetect` 檢測音量：
```powershell
ffmpeg -i input.wav -af "volumedetect" -f null -
```

假設 VolumeDetect 輸出訊息為：
```text
[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：
```powershell
ffmpeg -i input.wav -af "volume=5dB" output.wav
```

如果用了 pan filter 或是 `-ac` 選項來混合聲道，你會發現輸出的音訊的音量變小，可以用同樣的參數設定加上 `volumedetect` 篩選器來檢測 混合聲道後的音量。

使用 `volumedetect` 檢測縮混之後的音量：
```powershell
ffmpeg -i input.wav -ac 2 -af "volumedetect" -f null -
```

> 注意：因為是要檢測 downmix 為雙聲道之後的音量所以 `-ac 2` 是必要的。

假設 `volumedetect` 輸出訊息為：
```test
[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` 篩選器正常化音量：
```powershell
ffmpeg -i input.wav -filter:a loudnorm output.wav
```

### 取得統計資料

設定 `print_format` 參數之值為 `json` 或 `summary`，輸出統計資料將包含音源與輸出的 I (Integrated Loudness, 綜合響度)、LRA (Loudness Range, 響度範圍)、 TP (True Peak, 真實峰值)、Threshold (閾值) 之值。

```powershell
ffmpeg -i input.wav -filter:a loudnorm=print_format=json output.wav
```

```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"
}
```

如果只是要取得音源的 I、LAR、TP、Threshold 之值，可以使用 `null` demuxer 不輸出檔案。

```powershell
ffmpeg -i input.wav -filter:a loudnorm=print_format=json -f null -
```
### 二階段處裡

使用二階段處裡來得到更加準確的音量正常化效果。

承上，再次使用 `loudnorm` 篩選器處理音源，設定 `linear` 參數之值為 `true`，以應用線性縮放，並設定 `measured_I`, `measured_LRA`, `measured_TP`, `measured_thresh` 為之前獲得的音源 I、LRA、TP、Threshold 之值。

```powershell
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
```

###### tags: `ffmpeg`
