2010-11-20 1 views
2

Я пытаюсь использовать NAudio для декодирования закодированного звука аудио в формате pcm. Мой сервис POSTED загрузил закодированные звуковые байты, закодированные в mu-law, и я получаю ошибку от NAudio, что у данных нет заголовка RIFF. Должен ли я добавить это как-то? Код я использую:Использование NAudio для декодирования звука mu-law

WaveFileReader reader = new WaveFileReader(tmpMemStream); 
using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) 
{ 
    WaveFileWriter.CreateWaveFile(recordingsPath + "/" + outputFileName, convertedStream); 
} 

Я также сохранение исходных данных на диск и делать декодирование в Matlab, который работает без проблем. Благодарю.

ответ

3

Поскольку у вас есть только исходные данные му-закона, вы не можете использовать WaveFileReader на нем. Вместо этого создайте новый класс, который наследуется от WaveStream.

В своем методе Read возвращайте данные из tmpMemStream. Как WaveFormat верните mu-law WaveFormat.

Вот общий вспомогательный класс, который вы можете использовать:

public class RawSourceWaveStream : WaveStream 
{ 
    private Stream sourceStream; 
    private WaveFormat waveFormat; 

    public RawSourceWaveStream(Stream sourceStream, WaveFormat waveFormat) 
    { 
     this.sourceStream = sourceStream; 
     this.waveFormat = waveFormat; 
    } 

    public override WaveFormat WaveFormat 
    { 
     get { return this.waveFormat; } 
    } 

    public override long Length 
    { 
     get { return this.sourceStream.Length; } 
    } 

    public override long Position 
    { 
     get 
     { 
      return this.sourceStream.Position; 
     } 
     set 
     { 
      this.sourceStream.Position = value; 
     } 
    } 

    public override int Read(byte[] buffer, int offset, int count) 
    { 
     return sourceStream.Read(buffer, offset, count); 
    } 
} 

Теперь вы можете приступить к созданию преобразованного файла, как вы делали это раньше, проходя в RawSourceWaveStream в качестве ввода:

var waveFormat = WaveFormat.CreateMuLawFormat(8000, 1); 
var reader = new RawSourceWaveStream(tmpMemStream, waveFormat); 
using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) 
{ 
    WaveFileWriter.CreateWaveFile(recordingsPath + "/" + outputFileName, convertedStream); 
} 
+0

Спасибо вы Марк! Это сработало отлично. – Sean

+0

Что делать, если мой tmpMemStream является файлом? – Har

 Смежные вопросы

  • Нет связанных вопросов^_^