gpt4 book ai didi

c++ - 如何在 PCM 音频中使用 IMediaSample 检测静音

转载 作者:行者123 更新时间:2023-11-28 03:33:48 27 4
gpt4 key购买 nike

我需要使用 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。

你能验证我的思路吗?提前致谢。

eclipse

编辑:

问题出在驱动程序和 AC3 滤波器设置上,因为在“SPDIF 测试”中我发现 DirectSound 不支持 44.1 kHz、48 kHz 和 32 kHz。 Roman 的想法是正确的,当我解决这个问题时会起作用。

最佳答案

更好的方法是找出什么是 PCM 数据,而对已发布问题的回答将是微不足道的。

更快的方法是:

  • 将那些音频数据字节视为 SHORT 值(你没有提到,但我想你的音频是 16 位的)
  • 最好拆分成 channel 单独处理
  • 计算standard deviation
  • 沉默是当/如果计算值低于某个小阈值

关于c++ - 如何在 PCM 音频中使用 IMediaSample 检测静音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11737220/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com