FFmpeg 检查音频通道是不是静音

Posted

技术标签:

【中文标题】FFmpeg 检查音频通道是不是静音【英文标题】:FFmpeg check audio channels for silenceFFmpeg 检查音频通道是否静音 【发布时间】:2019-07-03 23:12:43 【问题描述】:

我有两个 .mp4 文件,都有 8 (7.1) 个音频通道。但事实上,有人告诉我,一个有 stereo 音频通道 + 2 SAP(通道 7-8 上的辅助音频),另一个有 6 (5.1) 音频通道 + 2 SAP(通道 7-8 )。所以基本上后者有一些 [真实] 音频通道,例如 Center 通道,而前者在立体声通道中不存在(虽然它有这些通道,但显然它们是静音/静音)。

我一直在尝试使用Mediainfo 查看一些有区别的元数据以以某种方式区分两者,但两者的元数据看起来完全相同。还尝试使用ffmpegffprobe 进行一些基本的元数据检索,但它们看起来都一样 - 不走运:

ffprobe -i 2ch.mp4 -show_streams -select_streams a:0

所以问题是:ffmpegffprobe 是否有任何快速区分这两者的方法?是否有任何音频过滤器可以检测特定音频通道是否静音?或者任何其他有区别的元数据?我宁愿通过一些元数据来区分这两者,而不是内容分析。

This是2通道mp4文件的样本,this是6通道mp4的样本。

【问题讨论】:

【参考方案1】:

您的两个示例文件都有 4 个音频流或轨道。每个音轨有 2 个声道,布局为立体声。

显然,音频编码器是恒定比特率的,因此元数据不能用于区分无声轨道和有声轨道。

您需要解析每个可疑的音频流。

ffmpeg -i file -map 0:a:1 -af astats -f null -

在控制台日志的末尾,将打印音频流的统计信息,

例如

[Parsed_astats_0 @ 0000000003c3aec0] Channel: 1
[Parsed_astats_0 @ 0000000003c3aec0] DC offset: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Min level: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Max level: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Min difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Max difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Mean difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] RMS difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Peak level dB: -6153.053111
[Parsed_astats_0 @ 0000000003c3aec0] RMS level dB: -inf
[Parsed_astats_0 @ 0000000003c3aec0] RMS peak dB: -3076.526556
[Parsed_astats_0 @ 0000000003c3aec0] RMS trough dB: -inf
[Parsed_astats_0 @ 0000000003c3aec0] Crest factor: 1.000000
[Parsed_astats_0 @ 0000000003c3aec0] Flat factor: -inf
[Parsed_astats_0 @ 0000000003c3aec0] Peak count: 662528
[Parsed_astats_0 @ 0000000003c3aec0] Bit depth: 0/0
[Parsed_astats_0 @ 0000000003c3aec0] Dynamic range: -inf
[Parsed_astats_0 @ 0000000003c3aec0] Zero crossings: 0
[Parsed_astats_0 @ 0000000003c3aec0] Zero crossings rate: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Channel: 2
[Parsed_astats_0 @ 0000000003c3aec0] DC offset: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Min level: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Max level: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Min difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Max difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Mean difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] RMS difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Peak level dB: -6153.053111
[Parsed_astats_0 @ 0000000003c3aec0] RMS level dB: -inf
[Parsed_astats_0 @ 0000000003c3aec0] RMS peak dB: -3076.526556
[Parsed_astats_0 @ 0000000003c3aec0] RMS trough dB: -inf
[Parsed_astats_0 @ 0000000003c3aec0] Crest factor: 1.000000
[Parsed_astats_0 @ 0000000003c3aec0] Flat factor: -inf
[Parsed_astats_0 @ 0000000003c3aec0] Peak count: 662528
[Parsed_astats_0 @ 0000000003c3aec0] Bit depth: 0/0
[Parsed_astats_0 @ 0000000003c3aec0] Dynamic range: -inf
[Parsed_astats_0 @ 0000000003c3aec0] Zero crossings: 0
[Parsed_astats_0 @ 0000000003c3aec0] Zero crossings rate: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Overall
[Parsed_astats_0 @ 0000000003c3aec0] DC offset: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Min level: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Max level: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Min difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Max difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Mean difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] RMS difference: 0.000000
[Parsed_astats_0 @ 0000000003c3aec0] Peak level dB: -6153.053111
[Parsed_astats_0 @ 0000000003c3aec0] RMS level dB: -inf
[Parsed_astats_0 @ 0000000003c3aec0] RMS peak dB: -3076.526556
[Parsed_astats_0 @ 0000000003c3aec0] RMS trough dB: -inf
[Parsed_astats_0 @ 0000000003c3aec0] Flat factor: -inf
[Parsed_astats_0 @ 0000000003c3aec0] Peak count: 662528.000000
[Parsed_astats_0 @ 0000000003c3aec0] Bit depth: 0/0
[Parsed_astats_0 @ 0000000003c3aec0] Number of samples: 662528

如果RMS level dB-inf,则该频道是静默的。

【讨论】:

感谢您的提示!是的,这也很快。看起来还有其他一些不同的领域,比如DC offset=0 用于沉默的领域。想知道您现在使用0:a:1 指定哪个频道?那是center 频道吗? 0:a:1 指定第二个流,它有 2 个通道。每个通道的读数分别给出。由于每个轨道都被编码为立体声,因此原始通道分配会丢失。您将不得不猜测或使用其他方式来获取该信息。 我明白了。所以0:a:1 物种第二流,频道 0。对吗? 不,如果你选择一个流,它里面的所有频道都会被选中。流中的所有频道始终一起提供。 哈哈。我认为0:a:1 中的第一个参数指定ch,最后一个参数是流号!

以上是关于FFmpeg 检查音频通道是不是静音的主要内容,如果未能解决你的问题,请参考以下文章

如何通过静音部分分割视频或音频

如何静音或只选择一个音频通道?

使用网络音频 api 检查所选麦克风是不是已静音

使用带有silencedetect的FFMPEG来消除音频静音

如何检测音频是不是无法静音?

使用ffmpeg 操作音频文件前后部分静音移除.