0

我需要使用 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的想法是正确的,当我解决这个问题时会起作用。

4

1 回答 1

2

更好的方法是找出 PCM 数据是什么,并且发布的问题的答案将是微不足道的。

更快的方法是:

  • 将这些音频数据字节视为 SHORT 值(您没有提到,但我想您的音频是 16 位的)
  • 最好是拆分成通道,分别处理
  • 计算标准差
  • 沉默是当/如果计算值低于某个小阈值
于 2012-07-31T10:07:18.483 回答