4

32 ビットのステレオ WAV を 16 ビットのモノ WAV に変換しようとしています。私は naudio を使用してサウンドをキャプチャし、より重要な 4 バイトのうちの 2 バイトだけを使用するとうまくいくと考えました。

DataAvailable の実装は次のとおりです。

void _waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
     byte[] newArray = new byte[e.BytesRecorded / 2];
     short two;
     for (int i = 0, j = 0; i < e.BytesRecorded; i = i + 4, j = j + 2)
     {
          two = (short)BitConverter.ToInt16(e.Buffer, i + 2);


          newArray[j] = (byte)(two & 0xFF);
          newArray[j + 1] = (byte)((two >> 8) & 0xFF);
     }
     //do something with the new array:
}

どんな助けでも大歓迎です!

4

2 に答える 2

3

私は最終的に解決策を見つけました。変換された値に 32767 を掛けて、それを short にキャストするだけで済みました。

void _waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
    byte[] newArray16Bit = new byte[e.BytesRecorded / 2];
    short two;
    float value;
    for (int i = 0, j = 0; i < e.BytesRecorded; i += 4, j += 2)
    {
        value = (BitConverter.ToSingle(e.Buffer, i));
        two = (short)(value * short.MaxValue);

        newArray16Bit[j] = (byte)(two & 0xFF);
        newArray16Bit[j + 1] = (byte)((two >> 8) & 0xFF);
    }
}
于 2012-12-29T00:02:58.717 に答える
1

32-bitサンプルはのように高く4,294,967,295なり、16-bitサンプルは のように高くなる可能性があります65,536。したがって、サンプルの範囲32-bitに収まるようにサンプルを縮小する必要があります。16-bit多かれ少なかれ、あなたはこのようなことをしています...

SixteenBitSample = ( ThirtyTwoBitSample / 4294967295 ) * 65536;

編集:

ステレオからモノラルへの部分については、2 つのチャンネルが同じデータを持っている場合は、そのうちの 1 つをダンプするだけです。それ以外の場合は、波形を一緒に追加し65,536ます。サンプル範囲 ( ) の外にある場合は、それらをスケールダウンする必要があります。上式と同様。

それが役立つことを願っています。

于 2012-12-21T18:56:10.860 に答える