IMediaSample で PCM オーディオ ストリームの無音を検出する必要があります。信号は TV から供給され、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 になるはずだということだけです。
私の考え方を検証していただけますか?前もって感謝します。
日食
編集:
「SPDIF テスト」で、44.1 kHz、48 kHz、および 32 kHz が DirectSound でサポートされていないことがわかったため、問題はドライバーと AC3 フィルター設定のどこかにあります。ローマンのアイデアはちょうどいいので、これを修正すればうまくいくでしょう。