FFmpeg 检查 7.1 音频的通道是否静音
FFmpeg check channels of a 7.1 audio for silence
这是我之前提出的问题 的后续问题,我需要在该问题中寻找特定音轨中的静音。这是 ffmpeg
救命的解决方案,它有助于获取一些元数据:
ffmpeg -i file -map 0:a:1 -af astats -f null -
但我有其他类型的输入 .mp4
文件,它们有一个 8
(即 7.1)音频通道的单轨。显然,这些文件是从原始文件转码而来的(4 轨立体声以某种方式被压缩到这些文件中)。现在和我以前的一样,我需要知道原始文件是 2 声道立体声还是 5.1 (6) 声道。
如何知道音轨的特定通道(例如 Center
通道)是否为 silent/mute,可能使用 ffmpeg
? Here 是一个示例 .mp4
文件。
您可以在每个上使用 channelsplit filter to split the audio channels and run silencedetect。
示例:
ffmpeg -i test2.mp4 -filter_complex "[0:a]channelsplit=channel_layout=7.1:channels=FC[fc];[fc]silencedetect" -f null /dev/null
您可以在此处找到有关音频通道操作的更多信息:
https://trac.ffmpeg.org/wiki/AudioChannelManipulation
还有 astats 过滤器可用于检测静音 tracks/channels。
这是它为建议测试文件的通道 4 输出的内容,它看起来确实完全没有声音。
ffmpeg -i "$in" -vn -sn -dn -map 0:a -af "astats=measure_overall=none" -f null -
...
[Parsed_astats_0 @ 0x6beed00] Channel: 4
[Parsed_astats_0 @ 0x6beed00] DC offset: 0.000000
[Parsed_astats_0 @ 0x6beed00] Min level: 0.000000
[Parsed_astats_0 @ 0x6beed00] Max level: 0.000000
[Parsed_astats_0 @ 0x6beed00] Min difference: 0.000000
[Parsed_astats_0 @ 0x6beed00] Max difference: 0.000000
[Parsed_astats_0 @ 0x6beed00] Mean difference: 0.000000
[Parsed_astats_0 @ 0x6beed00] RMS difference: 0.000000
[Parsed_astats_0 @ 0x6beed00] Peak level dB: -inf
[Parsed_astats_0 @ 0x6beed00] RMS level dB: -inf
[Parsed_astats_0 @ 0x6beed00] RMS peak dB: -inf
[Parsed_astats_0 @ 0x6beed00] RMS trough dB: -inf
[Parsed_astats_0 @ 0x6beed00] Crest factor: 1.000000
[Parsed_astats_0 @ 0x6beed00] Flat factor: -inf
[Parsed_astats_0 @ 0x6beed00] Peak count: 6057984
[Parsed_astats_0 @ 0x6beed00] Bit depth: 0/0
[Parsed_astats_0 @ 0x6beed00] Dynamic range: -inf
[Parsed_astats_0 @ 0x6beed00] Zero crossings: 0
[Parsed_astats_0 @ 0x6beed00] Zero crossings rate: 0.000000
[Parsed_astats_0 @ 0x6beed00] Number of NaNs: 0
[Parsed_astats_0 @ 0x6beed00] Number of Infs: 0
[Parsed_astats_0 @ 0x6beed00] Number of denormals: 0
[Parsed_astats_0 @ 0x6beed00] Channel: 5
...
类似这样的内容会显示所有频道的概览:
ffmpeg -i "$in" -vn -sn -dn -map 0:a -af "astats=measure_overall=none" -f null - 2>&1 \
| egrep 'Channel|(Max|Peak) level'
[Parsed_astats_0 @ 0x7567d00] Channel: 1
[Parsed_astats_0 @ 0x7567d00] Max level: 0.978271
[Parsed_astats_0 @ 0x7567d00] Peak level dB: -0.190818
[Parsed_astats_0 @ 0x7567d00] Channel: 2
[Parsed_astats_0 @ 0x7567d00] Max level: 0.978271
[Parsed_astats_0 @ 0x7567d00] Peak level dB: -0.190818
[Parsed_astats_0 @ 0x7567d00] Channel: 3
[Parsed_astats_0 @ 0x7567d00] Max level: 0.000006
[Parsed_astats_0 @ 0x7567d00] Peak level dB: -103.162709
[Parsed_astats_0 @ 0x7567d00] Channel: 4
[Parsed_astats_0 @ 0x7567d00] Max level: 0.000000
[Parsed_astats_0 @ 0x7567d00] Peak level dB: -inf
[Parsed_astats_0 @ 0x7567d00] Channel: 5
[Parsed_astats_0 @ 0x7567d00] Max level: 0.000006
[Parsed_astats_0 @ 0x7567d00] Peak level dB: -103.162709
[Parsed_astats_0 @ 0x7567d00] Channel: 6
[Parsed_astats_0 @ 0x7567d00] Max level: 0.000006
[Parsed_astats_0 @ 0x7567d00] Peak level dB: -103.162709
[Parsed_astats_0 @ 0x7567d00] Channel: 7
[Parsed_astats_0 @ 0x7567d00] Max level: 0.978271
[Parsed_astats_0 @ 0x7567d00] Peak level dB: -0.190818
[Parsed_astats_0 @ 0x7567d00] Channel: 8
[Parsed_astats_0 @ 0x7567d00] Max level: 0.978271
[Parsed_astats_0 @ 0x7567d00] Peak level dB: -0.190818
这是我之前提出的问题 ffmpeg
救命的解决方案,它有助于获取一些元数据:
ffmpeg -i file -map 0:a:1 -af astats -f null -
但我有其他类型的输入 .mp4
文件,它们有一个 8
(即 7.1)音频通道的单轨。显然,这些文件是从原始文件转码而来的(4 轨立体声以某种方式被压缩到这些文件中)。现在和我以前的一样,我需要知道原始文件是 2 声道立体声还是 5.1 (6) 声道。
如何知道音轨的特定通道(例如 Center
通道)是否为 silent/mute,可能使用 ffmpeg
? Here 是一个示例 .mp4
文件。
您可以在每个上使用 channelsplit filter to split the audio channels and run silencedetect。
示例:
ffmpeg -i test2.mp4 -filter_complex "[0:a]channelsplit=channel_layout=7.1:channels=FC[fc];[fc]silencedetect" -f null /dev/null
您可以在此处找到有关音频通道操作的更多信息: https://trac.ffmpeg.org/wiki/AudioChannelManipulation
还有 astats 过滤器可用于检测静音 tracks/channels。
这是它为建议测试文件的通道 4 输出的内容,它看起来确实完全没有声音。
ffmpeg -i "$in" -vn -sn -dn -map 0:a -af "astats=measure_overall=none" -f null -
... [Parsed_astats_0 @ 0x6beed00] Channel: 4 [Parsed_astats_0 @ 0x6beed00] DC offset: 0.000000 [Parsed_astats_0 @ 0x6beed00] Min level: 0.000000 [Parsed_astats_0 @ 0x6beed00] Max level: 0.000000 [Parsed_astats_0 @ 0x6beed00] Min difference: 0.000000 [Parsed_astats_0 @ 0x6beed00] Max difference: 0.000000 [Parsed_astats_0 @ 0x6beed00] Mean difference: 0.000000 [Parsed_astats_0 @ 0x6beed00] RMS difference: 0.000000 [Parsed_astats_0 @ 0x6beed00] Peak level dB: -inf [Parsed_astats_0 @ 0x6beed00] RMS level dB: -inf [Parsed_astats_0 @ 0x6beed00] RMS peak dB: -inf [Parsed_astats_0 @ 0x6beed00] RMS trough dB: -inf [Parsed_astats_0 @ 0x6beed00] Crest factor: 1.000000 [Parsed_astats_0 @ 0x6beed00] Flat factor: -inf [Parsed_astats_0 @ 0x6beed00] Peak count: 6057984 [Parsed_astats_0 @ 0x6beed00] Bit depth: 0/0 [Parsed_astats_0 @ 0x6beed00] Dynamic range: -inf [Parsed_astats_0 @ 0x6beed00] Zero crossings: 0 [Parsed_astats_0 @ 0x6beed00] Zero crossings rate: 0.000000 [Parsed_astats_0 @ 0x6beed00] Number of NaNs: 0 [Parsed_astats_0 @ 0x6beed00] Number of Infs: 0 [Parsed_astats_0 @ 0x6beed00] Number of denormals: 0 [Parsed_astats_0 @ 0x6beed00] Channel: 5 ...
类似这样的内容会显示所有频道的概览:
ffmpeg -i "$in" -vn -sn -dn -map 0:a -af "astats=measure_overall=none" -f null - 2>&1 \
| egrep 'Channel|(Max|Peak) level'
[Parsed_astats_0 @ 0x7567d00] Channel: 1 [Parsed_astats_0 @ 0x7567d00] Max level: 0.978271 [Parsed_astats_0 @ 0x7567d00] Peak level dB: -0.190818 [Parsed_astats_0 @ 0x7567d00] Channel: 2 [Parsed_astats_0 @ 0x7567d00] Max level: 0.978271 [Parsed_astats_0 @ 0x7567d00] Peak level dB: -0.190818 [Parsed_astats_0 @ 0x7567d00] Channel: 3 [Parsed_astats_0 @ 0x7567d00] Max level: 0.000006 [Parsed_astats_0 @ 0x7567d00] Peak level dB: -103.162709 [Parsed_astats_0 @ 0x7567d00] Channel: 4 [Parsed_astats_0 @ 0x7567d00] Max level: 0.000000 [Parsed_astats_0 @ 0x7567d00] Peak level dB: -inf [Parsed_astats_0 @ 0x7567d00] Channel: 5 [Parsed_astats_0 @ 0x7567d00] Max level: 0.000006 [Parsed_astats_0 @ 0x7567d00] Peak level dB: -103.162709 [Parsed_astats_0 @ 0x7567d00] Channel: 6 [Parsed_astats_0 @ 0x7567d00] Max level: 0.000006 [Parsed_astats_0 @ 0x7567d00] Peak level dB: -103.162709 [Parsed_astats_0 @ 0x7567d00] Channel: 7 [Parsed_astats_0 @ 0x7567d00] Max level: 0.978271 [Parsed_astats_0 @ 0x7567d00] Peak level dB: -0.190818 [Parsed_astats_0 @ 0x7567d00] Channel: 8 [Parsed_astats_0 @ 0x7567d00] Max level: 0.978271 [Parsed_astats_0 @ 0x7567d00] Peak level dB: -0.190818