我需要使用 IMediaSample 检测 PCM 音频流中的静音。信号由电视提供,通过光缆与 PC 连接到 Prodigy 7.1 HiFi 声卡。到目前为止,我有这个:
bool detectSound(IMediaSample *pSamples)
{
BYTE *pData;
pSamples->GetPointer(&pData);
long size = pSamples->GetActualDataLength();
long nulls = 0;
for(long i = 0; i < size; ++i) {
if(pData[i] == 0)
++nulls;
}
/* 0.9 to eliminate interference */
long max_nulls = (long) (0.9 * size);
if(nulls > max_nulls) { /* STOP */
/* no audio */
return false;
}
else {
/* audio available */
return true;
}
}
问题是,如果我在标记为“STOP”的行处放置断点,则无论我是否将电视静音,nulls 几乎总是具有相同的值并且小于 max_nulls。我注意到 pData[i] 的值始终为 0 或 255。(奇怪还是不奇怪?)
可能我不明白这个“数据”到底是什么以及如何解释它。我可以肯定的是,如果没有音频,那么波形中的所有采样值应该几乎为 0。
你能验证我的想法吗?提前致谢。
蚀
编辑:
问题出在驱动程序和 AC3 滤波器设置的某个地方,因为在“SPDIF 测试”中,我发现 DirectSound 不支持 44.1 kHz、48 kHz 和 32 kHz。Roman的想法是正确的,当我解决这个问题时会起作用。