Как я могу преобразовать 8-битный волновой файл без знака в 8-битный подписанный волновой файл?

Я использую NAudio с C# для преобразования волновых файлов в 48 000, 8 бит, моно. Я храню преобразованные данные в массиве байтов. Мой код ниже. Он работает нормально, но данные файла новой волны не подписаны, а мне нужно, чтобы они были подписаны.

WaveFormat target = new WaveFormat(48000, 8, 1);
WaveStream stream = new WaveFileReader(this.FilePath);
WaveFormatConversionStream conv = new WaveFormatConversionStream(target, stream);
this.ConvertedData = new byte[conv.Length];
conv.Position = 0;
conv.Read(this.ConvertedData, 0, Convert.ToInt32(conv.Length));
stream.Dispose();
conv.Dispose();

Я попытался перебрать массив байтов после преобразования данных и вычесть 128 из каждого байта, что является решением, которое я нашел на этом сайте.

for (int i = 0; i < end; i++)
{
    signed = (int)this.ConvertedData[i] - 128;
    this.Data[i] = (byte)signed;
}

Этот вид работает, но не является надежным, и я уверен, что должен быть лучший способ. Любые предложения будут ценны. Спасибо.


person user1561302    schedule 18.08.2012    source источник
comment
согласно этому описанию формата файла wav, при использовании 8-битного значения могут быть только беззнаковыми. sonicspot.com/guide/wavefiles.html, когда образцы представлены 8-битными, они указаны как беззнаковые значения   -  person TJD    schedule 18.08.2012
comment
не уверен, поможет ли этот сайт, но он может дать лучшее объяснение того, что вы можете и не можете делать stackoverflow.com/questions/11711689/   -  person MethodMan    schedule 18.08.2012


Ответы (3)


WaveFormat target = new WaveFormat(48000, 8, 1);
WaveStream stream =new WaveFileReader(this.FilePath);
WaveFormatConversionStream str = new WaveFormatConversionStream(target, stream);
WaveFileWriter.CreateWaveFile("c:\\converted.wav", str); //or the path of .wav file

попробуйте вместо этого использовать метод WaveFileWriter.CreateFile.

Оформить заказ NAudio По этой ссылке вы также можете оформить заказ, у них есть аудиобиблиотека C# Alvis.Audio

person MethodMan    schedule 18.08.2012

Я не могу комментировать, поэтому мне приходится «неправильно использовать» функцию ответа:

пытаться:

Convert.toSByte

Он основан на String, но должен работать...

http://msdn.microsoft.com/en-us/library/b0hdkwd9.aspx

person Markus Masquerade    schedule 18.08.2012

Если вы просто ищете лучший способ преобразования массива байтов без знака в массив байтов со знаком, вы можете использовать метод Buffer.BlockCopy или попробовать sbyte[] signed = (sbyte[])(Array)unsigned . Надеюсь, поможет.

person Avichal Badaya    schedule 18.08.2012