1. 获取相关信息 1.1 获取音频流信息 1.2 声道布局 1.3 音量 volumedetect 1.4 多声道混合波形图 1.5 不同声道的波形图 1.6 统计信息 2. 拆分声道 2.1 pan 2.2 channelsplit 2.3 小结 3. 查看单声道文件相关信息 3.1 获取音频流信息 3.2 音量 volumedetect 3.3 波形图 3.4 统计信息 4. volume 滤波器调节音量 4.1 音量 volumedetect 4.2 波形图 5. 合并 5.1 获取音频流信息 5.2 音量 volumedetect 5.3 不同声道的波形图 5.4 文件大小 6. AudioChannel命令参考 7. 文中用到的选项及滤镜
1. 获取相关信息
1.1 获取音频流信息
ffmpeg -i 2018.mp4
Stream #0:1[0x2](eng): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 640 kb/s (default)
1.2 声道布局
ffmpeg -layouts
mono FC
stereo FL+FR
quad FL+FR+BL+BR
quad(side) FL+FR+SL+SR
5.1 FL+FR+FC+LFE+BL+BR
5.1(side) FL+FR+FC+LFE+SL+SR
… 这里只列出本例遇到的及相关布局。
1.3 音量 volumedetect
ffmpeg -i 2018.mp4 -hide_banner -filter_complex volumedetect -c:v copy -f null /dev/null
ffmpeg -i 2018.mp4 -filter:a volumedetect -vn -f null /dev/null
ffmpeg -i 2018.mp4 -filter volumedetect -vn -f null /dev/null
ffmpeg -i 2018.mp4 -af volumedetect -vn -f null /dev/null
[...] mean_volume: -30.8 dB
[...] max_volume: 0.0 dB
1.4 多声道混合波形图
ffmpeg -i 2018.mp4 -filter_complex "showwavespic=s=1920*720" -frames:v 1 8a.png
图略
1.5 不同声道的波形图
ffmpeg -i 2018.mp4 -filter_complex "showwavespic=s=1920*960:split_channels=1" -frames:v 1 8am.png
图形放在第5.3节,与修改后的图形对比。
1.6 统计信息
ffmpeg -i 2018.mp4 -af astats -f null -
注: 8100运行此命令只有~15x的速度,耗时约7分半。
增加 -vn 选项,忽略视频部分,速度增加10倍。
ffmpeg -i 2018.mp4 -vn -af astats -f null -
可以列出 Channel.(1~6) 的详细信息,其中的 RMS level dB 表示每个声道的平均音量。
Overall 则是综合6个声道的统计信息,Overall 的 RMS level dB 和前面使用 volumedetect 滤镜获取的 mean_volume 一致。
| Channel | 1 (FL) | 2 (FR) | 3 (FC) | 4 (LFE) | 5 (SL) | 6 (SR) | Overall | 通道 |
| DC offset | -0.000008 | -0.000009 | -0.000009 | 0.000001 | -0.00001 | -0.000011 | -0.000011 | 直流偏移 |
| Min level | -0.713869 | -0.71056 | -0.999829 | -0.679425 | -1.021281 | -0.9638 | -1.021281 | 最小电平 |
| Max level | 0.71264 | 0.695435 | 0.995467 | 0.677106 | 1.031011 | 0.962693 | 1.031011 | 最大电平 |
| Min difference | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 最小差值 |
| Max difference | 0.628798 | 0.581773 | 0.694345 | 0.022837 | 0.370033 | 0.392021 | 0.694345 | 最大差值 |
| Mean difference | 0.001396 | 0.001468 | 0.003859 | 0.000021 | 0.001228 | 0.001224 | 0.001533 | 平均差值 |
| RMS difference | 0.003795 | 0.003989 | 0.009361 | 0.000128 | 0.003429 | 0.003426 | 0.004856 | 均方根差值 |
| Peak level dB | -2.927632 | -2.96798 | -0.001484 | -3.35717 | 0.265267 | -0.320259 | 0.265267 | 峰值电平 dB |
| RMS level dB | -33.124027 | -32.65356 | -25.858851 | -32.648587 | -33.945536 | -33.983928 | -30.817171 | 均方根电平 dB |
| RMS peak dB | -6.735127 | -8.108412 | -5.499001 | -4.888176 | -5.274029 | -9.256225 | -4.888176 | 均方根峰值 dB |
| RMS trough dB | -112.519922 | -111.171483 | -111.433785 | -3202.270341 | -108.760425 | -106.989207 | -3202.270341 | 均方根谷值 dB |
| Crest factor | 32.345936 | 30.498536 | 19.62765 | 29.145455 | 51.349962 | 48.215143 | 波峰因子 | |
| Flat factor | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 平坦因子 |
| Peak count | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 峰值计数 |
| Abs Peak count | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 绝对峰值计数 |
| Noise floor dB | -99.643932 | -97.877327 | -98.739502 | -inf | -97.807155 | -101.373386 | -97.807155 | 噪声基底 dB |
| Noise floor count | 671 | 416 | 160 | 109866231 | 278 | 1 | 18311292.833333 | 噪声基底计数 |
| Entropy | 0.541997 | 0.554552 | 0.672009 | 0.267778 | 0.520391 | 0.523669 | 0.513399 | 熵 |
| Bit depth | 31/32/32/32 | 31/32/32/32 | 31/32/32/32 | 31/32/32/32 | 32/32/32/32 | 31/32/32/32 | 32/32/32/32 | 位深度 |
| Dynamic range | 232.436339 | 237.004291 | 282.966711 | 279.886954 | 249.608638 | 234.34847 | 动态范围 | |
| Zero crossings | 15226294 | 14816369 | 18927784 | 458054 | 14737991 | 14490558 | 过零点数 | |
| Zero crossings rate | 0.044867 | 0.043659 | 0.055774 | 0.00135 | 0.043428 | 0.042699 | 过零率 | |
| Number of NaNs | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NaN 值数量 |
| Number of Infs | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Inf 值数量 |
| Number of denormals | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 非正规数数量 |
| Number of samples | 1 (FL) | 2 (FR) | 3 (FC) | 4 (LFE) | 5 (SL) | 6 (SR) | 339368208 | 样本数量 |
2. 拆分声道
2.1 pan
5.1(side) FL+FR+FC+LFE+SL+SR
ffmpeg -i 2018.mp4 -filter_complex "[0:a]pan=1c|c0=c0[fl];[0:a]pan=1c|c0=c1[fr];[0:a]pan=1c|c0=c2[fc];[0:a]pan=1c|c0=c3[lfe];[0:a]pan=1c|c0=c4[sl];[0:a]pan=1c|c0=c5[sr]" -map "[fl]" 8fl.ac3 -map "[fr]" 8fr.ac3 -map "[fc]" 8fc.ac3 -map "[lfe]" 8lfe.ac3 -map "[sl]" 8sl.ac3 -map "[sr]" 8sr.ac3
或者拆开来运行: 结果都一样。
- ffmpeg -i 2018.mp4 -af "pan=mono|c0=c0" 80.ac3
- ffmpeg -i 2018.mp4 -af "pan=mono|c0=c1" 81.ac3
- ffmpeg -i 2018.mp4 -af "pan=mono|c0=c2" 82.ac3
- ffmpeg -i 2018.mp4 -af "pan=mono|c0=c3" 83.ac3
- ffmpeg -i 2018.mp4 -af "pan=mono|c0=c4" 84.ac3
- ffmpeg -i 2018.mp4 -af "pan=mono|c0=c5" 85.ac3
2.2 channelsplit
ffmpeg -i 2018.mp4 -filter_complex "channelsplit=channel_layout=5.1(side)[FL][FR][FC][LFE][SL][SR]" -map "[FL]" 8fl.ac3 -map "[FR]" 8fr.ac3 -map "[FC]" 8fc.ac3 -map "[LFE]" 8lfe.ac3 -map "[SL]" 8sl.ac3 -map "[SR]" 8sr.ac3
2.3 小结
使用 channelsplit 滤镜,并没有按预期的生成所有单声道文件。
- fc, lfe 这2个是 mono 单声道文件;比特率均为96kb/s。和上方的 pan 滤镜输出一致。
- fl, fr 这2个是 stereo 立体声文件;比特率均为192kb/s。
- 通过 astats 统计信息, 输出立体声的左右声道数据非常近似,相当于将输出的一个单声道,分别放到立体声的左右声道。
- 使用 showwavespic 滤镜,生成不同声道的波形图,可以观察到,立体声2个声道是基本相同的波形。
- sl,sr 这2个是 quad(side) 形式的4声道文件,比特率均为384kb/s。
- 通过 astats 统计信息, 输出 quad(side) 的4个声道数据,前2个非常近似,相当于将输出的一个单声道,分别放到这2个位置,另外2个声道有数据,但属于静音范围,一样占用了一半的文件大小。
- 使用 showwavespic 滤镜,生成不同声道的波形图,可以观察到,前2个声道是基本相同的波形,后2个声道只有占据了位置,没有任何波形(静音)。
拆分声道,使用 pan 滤镜,命令里已指定1c或mono,拆分出来的都是单声道文件,比特率均为96kb/s,体积都一样大。
- 后面的内容都已 pan 滤镜生成的6个单声道文件为基础继续。
3. 查看单声道文件相关信息
3.1 获取音频流信息
ffprobe -i 文件名
Stream #0:0: Audio: ac3, 48000 Hz, mono, fltp, 96 kb/s
使用 pan 滤镜生成的所有6个文件,都是独立的单声道文件。
3.2 音量 volumedetect
ffmpeg -i 文件名 -af volumedetect -vn -f null /dev/null
信息见下方4.1节表格。
3.3 波形图
ffmpeg -i 文件名 -filter_complex "showwavespic=s=1920*960" -frames:v 1 output.png
ffmpeg -i 文件名 -filter_complex "showwavespic=s=1920*960:split_channels=1" -frames:v 1 output.png
由于是单声道文件,所以这2行输出的图形是一样的。
这里将所有6个文件的图形分别输出,以便后续调整后对照。
3.4 统计信息
ffmpeg -i 文件名 -af astats -f null -
单声道音频文件的统计信息和前面5.1声道统计信息里的对应声道数据接近,但不完全相同。
4. volume 滤波器调节音量
将2018文件的6个声道分别调整适当的音量,然后再合并。
- ffmpeg -i 8fc.ac3 -filter:a "volume=5dB" 8fc-u.ac3
- ffmpeg -i 8fl.ac3 -filter:a "volume=7dB" 8fl-u.ac3
- ffmpeg -i 8fr.ac3 -filter:a "volume=7dB" 8fr-u.ac3
- ffmpeg -i 8lfe.ac3 -filter:a "volume=3dB" 8lfe-u.ac3
- ffmpeg -i 8sl.ac3 -filter:a "volume=3dB" 8sl-u.ac3
- ffmpeg -i 8sr.ac3 -filter:a "volume=3dB" 8sr-u.ac3
volume=号后面的数值若不带dB分贝单位,则表示按比例调整音量。
4.1 音量 volumedetect
ffmpeg -i 文件名 -af volumedetect -vn -f null /dev/null
| Channel | 章节: 3.2 | 章节: 4 | 章节: 4.1 | |||||
| file | 平均音量 | max | +dB | file | 平均音量 | max | ||
| 1 (FL) | 8fl.ac3 | -33.1 dB | -2.4 dB | 7dB | → | 8fl-u.ac3 | -26.2 dB | 0.0 dB |
| 2 (FR) | 8fr.ac3 | -32.6 dB | -2.5 dB | 7dB | → | 8fr-u.ac3 | -25.7 dB | 0.0 dB |
| 3 (FC) | 8fc.ac3 | -25.9 dB | 0.0 dB | 5dB | → | 8fc-u.ac3 | -20.9 dB | 0.0 dB |
| 4 (LFE) | 8lfe.ac3 | -32.6 dB | -3.4 dB | 3dB | → | 8lfe-u.ac3 | -29.6 dB | -0.4 dB |
| 5 (SL) | 8sl.ac3 | -33.9 dB | 0.0 dB | 3dB | → | 8sl-u.ac3 | -31.0 dB | 0.0 dB |
| 6 (SR) | 8sr.ac3 | -34.0 dB | -0.2 dB | 3dB | → | 8sr-u.ac3 | -31.0 dB | 0.0 dB |
章节: 3.2,4.1音量对照表,所有文件大小均为80.9Mb,比特率为96kbs,Layouts:mono, 48000Hz。
4.2 波形图
ffmpeg -i 文件名 -filter_complex "showwavespic=s=1920*960" -frames:v 1 output.png
与3.3调整音量前的图形对照。波形的幅度显著增大了。
5. 合并
5.1(side) FL+FR+FC+LFE+SL+SR
- ffmpeg -i 8fl-u.ac3 -i 8fr-u.ac3 -i 8fc-u.ac3 -i 8lfe-u.ac3 -i 8sl-u.ac3 -i 8sr-u.ac3 -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]join=inputs=6:channel_layout=5.1(side)[a]" -map "[a]" output.ac3
- ffmpeg -i 8fl-u.ac3 -i 8fr-u.ac3 -i 8fc-u.ac3 -i 8lfe-u.ac3 -i 8sl-u.ac3 -i 8sr-u.ac3 -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]join=inputs=6:channel_layout=5.1(side):map=0.0-FL|1.0-FR|2.0-FC|3.0-LFE|4.0-SL|5.0-SR[a]" -map "[a]" output1.ac3
- ffmpeg -i 8fl-u.ac3 -i 8fr-u.ac3 -i 8fc-u.ac3 -i 8lfe-u.ac3 -i 8sl-u.ac3 -i 8sr-u.ac3 -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[a]" -map "[a]" output3.ac3
使用 amerge 函数时,所有输入必须具有相同的采样率和格式。如果输入持续时间不同,输出将以最短的持续时间结束。
No channel layout for input 1
Input channel layouts overlap: output layout will be determined by the number of distinct input channels Output #0, ac3, to 'output3.ac3':
Stream #0:0: Audio: ac3, 48000 Hz, 5.1, fltp, 448 kb/s
使用 amerge 滤镜过程中,提示没有指定 layout,默认会输出 5.1 声道,如上,但实际生成的文件是 5.1(side) 声道。
5.1 获取音频流信息
ffprobe -i output.ac3
Stream #0:0: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s
5.2 音量 volumedetect
ffmpeg -i output.ac3 -af volumedetect -vn -f null /dev/null
mean_volume: -25.8 dB。注: 第1.3节,原始音轨音量平均为:-30.8 dB
5.3 不同声道的波形图
- ffmpeg -i output.ac3 -filter_complex "showwavespic=s=1920*960:split_channels=1" -frames:v 1 output-m.png
- ffmpeg -i output1.ac3 -filter_complex "showwavespic=s=1920*960:split_channels=1" -frames:v 1 output1-m.png
- ffmpeg -i output3.ac3 -filter_complex "showwavespic=s=1920*960:split_channels=1" -frames:v 1 output3-m.png
和原始输出对比,波形幅度更加突出(音量提高了约5dB)。
注:参照波形,其中output.ac3文件的第2和第3声道互调了。命令行里的输入顺序都是一致的。具体原因还不清楚。
5.4 文件大小
- 原始输出ac3文件大小为539Mb。(640bps)
- 拆分为6个单声道文件80.9Mb*6=485MB。(96kb/s * 6 = 576bps) 大约是原始文件的90%。
- 将这6个文件分别调整音量后,文件大小没有变化,合计仍然是485MB。(576bps)
- 将这6个文件合并为5.1(side)声道文件,文件大小变为377MB。(448bps) 大约是原始文件的70%。
6. AudioChannel命令参考
以下文档是每晚重新生成的(中文翻译),对应于最新的 FFmpeg 修订版。
7. 文中用到的选项及滤镜
| 选项 alias/滤镜 | 描述 |
| -ac | https://ffmpeg.org/ffmpeg-all.html#Audio-Options https://ffmpeg.cpp.org.cn/ffmpeg-all.html#Audio-Options 设置音频通道数。对于输出流,默认设置为输入音频通道的数量。 对于输入流,此选项仅对音频采集设备和原始解复用器有意义,并映射到相应的解复用器选项。 |
| -map | https://ffmpeg.org/ffmpeg-all.html#Stream-selection-1 https://ffmpeg.cpp.org.cn/ffmpeg-all.html#Stream-selection-1 流选择,手动控制每个输出文件中的流选择。用户可以跳过 -map,并让 ffmpeg 执行如下所述的自动流选择。 -vn / -an / -sn / -dn 选项可用于跳过分别包含视频、音频、字幕和数据流。 |
| -b -b:v -b:a |
https://ffmpeg.org/ffmpeg-all.html#Options-20 https://ffmpeg.cpp.org.cn/ffmpeg-all.html#Options-20 设置比特率,单位为比特/秒。 |
| -c -codec -c:a -acodec -c:v -vcodec -c:s -scodec |
https://ffmpeg.org/ffmpeg-all.html#Generic-options https://ffmpeg.cpp.org.cn/ffmpeg-all.html#Generic-options 为一个或多个流选择一个编码器(当在输出文件之前使用时)或解码器(当在输入文件之前使用时)。 codec 是解码器/编码器的名称或特殊值 copy(仅限输出),表示该流不被重新编码。 |
| -f | https://ffmpeg.org/ffmpeg-all.html#Main-options https://ffmpeg.cpp.org.cn/ffmpeg-all.html#Main-options 强制输入或输出文件格式。 通常会自动检测输入文件的格式,并根据输出文件的文件扩展名进行猜测,因此在大多数情况下不需要此选项。 |
| -f null - | https://ffmpeg.org/ffmpeg-all.html#null-1 https://ffmpeg.cpp.org.cn/ffmpeg-all.html#null-1 此复用器不生成任何输出文件,主要用于测试。 |
| -filter -af -filter:a -vf -filter:v |
https://ffmpeg.org/ffmpeg-all.html#Simple-filtergraphs https://ffmpeg.cpp.org.cn/ffmpeg-all.html#Simple-filtergraphs 指定单个滤镜,用于过滤输入流。 |
| -filter_complex | https://ffmpeg.org/ffmpeg-all.html#Complex-filtergraphs https://ffmpeg.cpp.org.cn/ffmpeg-all.html#Complex-filtergraphs 过滤器图,复杂的集合。滤镜链用“;”字符分隔,每个滤镜链以“[in]”开头,以“[out]”结尾,最后一个可省略。 |
| -filters | 获取所有滤镜的列表。 |
| -h filter=pan | 获取单个滤镜的信息,例如这里获取 pan 滤镜信息。 |
| asplit | 将输入拆分为多个相同的输出,默认为 2。 |
| aphasemeter | 测量输入音频的相位, 相位值范围 [-1, 1] ,其中 -1 表示左右声道完全异相,而 1 表示声道同相。 |
| ametadata | 操作帧元数据。 |
| aresample | 将输入音频重采样到指定的参数。若未指定任何参数,则过滤器将在其输入和输出之间自动转换。 此过滤器还能够拉伸/压缩音频数据以使其与时间戳匹配,或者注入静音/切除音频以使其与时间戳匹配,或者两者兼而有之,或者都不进行操作。 |
| amix | 将多个音频输入混合到单个输出中。注:仅支持浮点样本(amerge 和 pan 音频滤波器支持多种格式)。 整数样本将自动执行到浮点样本的转换。 |
| amerge | 将两个或多个音频流合并为单个多通道流。 |
| channelmap | 将输入通道重新映射到新的位置。 |
| channelsplit | 将输入音频流中的每个通道拆分为单独的输出流。 |
| join | 将多个输入流连接成一个多通道流。 |
| pan | 以特定的增益级别混合通道。该过滤器接受输出通道布局,后跟一组通道定义。 此过滤器还旨在有效地重新映射音频流的通道。 |
| Sofalizer | 为用户在耳机中创建虚拟扬声器 |
| astats | 显示有关音频通道的时域统计信息。统计信息针对每个音频通道计算和显示,并且在适用的情况下,还会给出总体数据。 |
| -map_channel | Option not found (in 2026) |

