Naudio-преобразование 32 бит wav в 16 бит wav



Я пытался преобразовать 32-битный стерео wav в 16-битный моно wav. Я использую naudio для захвата звука я и думал, что использование только двух из четырех более значимых байтов будет работать.



Вот реализация 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:
}


Любая помощь будет очень признательна!

834   2  

2 ответов:

Я наконец нашел решение. Мне просто нужно было умножить преобразованное значение на 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);
    }
}

Выборка 32-bit может быть такой же высокой, как 4,294,967,295, а выборка 16-bit может быть такой же высокой, как 65,536. Таким образом, вам придется уменьшить масштаб выборки 32-bit, чтобы вписаться в диапазон выборки 16-bit. Более или менее, вы делаете что-то вроде этого...

SixteenBitSample = ( ThirtyTwoBitSample / 4294967295 ) * 65536;

Правка:

Для участка стерео-моно, если два канала имеют одинаковые данные, просто сбросьте один из них, в противном случае добавьте формы волн вместе, и если они выходят за пределы диапазона выборки (65,536), то вам придется уменьшить их аналогично приведенное выше уравнение.

Надеюсь, это поможет.

Comments

    Ничего не найдено.