audio - FFmpeg 检查音频通道是否静音
问题描述
我有两个.mp4
文件,都有 8 个(7.1)音频通道。但事实上,有人告诉我,一个有stereo
音频通道 + 2 SAP(通道 7-8 上的辅助音频),另一个有6 (5.1)
音频通道 + 2 SAP(通道 7-8 上)。所以基本上后者有一些[真实的]音频通道,例如Center
在前一个立体声通道中不存在的通道(虽然它有这些通道,但显然它们是静音/静音的)。
我一直在尝试查看一些有区别的元数据,以某种方式区分两者 using Mediainfo
,但两者的元数据看起来完全相同。还尝试了一些基本的元数据检索ffmpeg
and ffprobe
,它们看起来都一样 - 不走运:
ffprobe -i 2ch.mp4 -show_streams -select_streams a:0
所以问题是:是否ffmpeg
或ffprobe
有任何快速的方法来区分这两者?是否有任何音频过滤器可以检测特定音频通道是否静音?或者任何其他有区别的元数据?我宁愿通过一些元数据来区分两者,而不是内容分析。
解决方案
您的两个示例文件都有 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
,则该频道是静音的。
推荐阅读
- mysql - 设置产品特定价格时如何添加含税价值价格
- r - if else 语句和 if_else 的不同行为
- r - igraph R的合着网络边缘列表
- python - Python异步无法工作
- batch-file - 创建用于搜索和删除多个文件的批处理文件
- internet-explorer - ES6 箭头函数在 IE 上不起作用
- python - Keras:在多标签回归中显示每个标签的损失
- javascript - 在 Javascript 中,有一个像“切片”一样工作的函数,但可以更好地控制边界处的元素?
- python - 命令大小写不敏感
- java - 使用radar-netbeans时的空指针