0

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 フィルター設定のどこかにあります。ローマンのアイデアはちょうどいいので、これを修正すればうまくいくでしょう。

4

1 に答える 1

2

より良い方法は、PCM データとは何かを調べることです。投稿された質問への答えは些細なことです。

より迅速な方法は次のとおりです。

  • これらのオーディオデータバイトを SHORT 値として扱います(言及していませんが、オーディオは16ビットだと思います)
  • チャネルに分割して個別に処理する方が良いでしょう
  • 標準偏差を計算する
  • 沈黙は、計算された値が特定の小さなしきい値を下回った場合/場合です
于 2012-07-31T10:07:18.483 に答える