FFMPEG 检测立体声通道是否实际上是单声道



我可以检测(使用ffmpeg或类似的东西)立体声文件的左声道和右声道是否实际上相同,因此文件是单声道的吗?

伪代码:

left_channel = read_left_channel_from(file)
right_channel = read_right_channel_from(file)
return left_channel.equals(right_channel)

反转一个通道的相位,然后下混为单声道和音量检测是否有任何内容:

-filter_complex "stereotools=phasel=1[tmp];[tmp]pan=1c|c0=0.5*c0+0.5*c1,volumedetect"

另一种解决方案是计算每个通道的 MD5 哈希。

ffmpeg -loglevel -8 -i <INPUT> -filter_complex "[0:a]channelsplit=channel_layout=stereo[left][right]" -map "[left]" -f md5 - -map "[right]" -f md5 -

这个答案虽然比 Vit 的答案更好地复制了你的伪代码,但在大多数实际情况下更糟糕;音频通道可能过于相似(超出人类感知),但会产生不同的 MD5 哈希。

基于@vit的答案,扩展多声道音频文件:

首先,我们将

从多声道生成一个"虚拟立体声",然后我们将使用声相滤波器反转两个轨道中的一个。

然后我们会检测平均体积。

分两步完成似乎比链接过滤器更快。

如果我们要分析多声道 mxf 文件的前两个声道以检查它们是立体声还是双单声道:

ffmpeg -i multichannel.mxf -filter_complex "[0:a:0]pan=mono|c0[a1];[0:a:1]pan=mono[a2];[a1][a2]amerge=inputs=2[pair1];[pair1]pan=1c|c0=0.5*c0-0.5*c1[output] -map "[output]" output.wav
ffmpeg -i output.wav -af volumedetect -f null /dev/null

如果是双单声道,则输出.wav为静音,平均音量为-91.0 dB

最新更新