【问题标题】:FFmpeg check channels of a 7.1 audio for silenceFFmpeg 检查 7.1 音频的通道是否静音
【发布时间】:2019-07-06 20:19:06
【问题描述】:

这是我上一个问题here 的后续问题,我需要在特定音轨中寻找静音。这是ffmpeg life-saver 解决方案,有助于获取一些元数据:

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

但我有其他类型的输入 .mp4 文件,它们有一个单一的轨道 8(即 7.1)音频通道。显然,这些文件是从原始文件转码的(不知何故,4 轨立体声被压缩到这些文件中)。现在与我之前的类似,我需要知道原始文件是 2 声道立体声还是 5.1 (6) 声道。

如何知道音轨的特定通道(例如Center 通道)是否静音/静音,可能使用ffmpegHere 是一个示例 .mp4 文件。

【问题讨论】:

  • 0:a:1 替换为0:a:0 以分析第一个流。
  • 谢谢。有没有办法只看到特定通道的输出?说Center?我也不知道布局,哪个#是哪个。
  • ffmpeg 的布局对于 MOV/MP4 可能不是 reliable。在任何情况下,像 channelssplit 之类的东西来隔离通道,或者 grep astats 读数。
  • @Gyan 想知道为什么您的命令结果与答案不同。您的命令没有说频道#3 的-inf。但是答案中的命令说FC 是静默。
  • -inf 用于完美的数字静音。频道 #3 有一些杂散样本:Min level: -0.000007 Max level: 0.000006。静音检测有一个阈值,任何低于该阈值的音量都被注册为静音。 -90db 或更低实际上是数字静音。

标签: audio ffmpeg codec aac ffprobe


【解决方案1】:

您可以使用channelsplit 过滤器拆分音频通道并在每个通道上运行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

【讨论】:

  • 我得到的是:[silencedetect @ 0000024c44b02700] silence_start: 0 frame= 1891 fps=0.0 q=-0.0 Lsize=N/A time=00:01:03.10 bitrate=N/A speed=73.8x video:990kB audio:5916kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown [silencedetect @ 0000024c44b02700] silence_end: 63.104 | silence_duration: 63.104。那么这是什么意思呢?
  • 你有 63.104 秒的沉默
  • 我需要知道它是否完全静音。无论如何? (就像我有问题的命令一样,元数据显示 -inf 这是我要寻找的)
  • 比较silence_duration与音频流的持续时间?
  • 将静音持续时间与音频流的持续时间进行比较 --> astats 通过允许在整个流上累积统计数据来避免这种情况。当然,还有volumedetect。
【解决方案2】:

还有astats 过滤器可用于检测静音轨道/通道。

这是它为建议测试文件的通道 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

【讨论】:

  • 看起来不错。谢谢!
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 2022-01-19
  • 2021-04-13
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2021-01-13
相关资源
最近更新 更多