Использование NAudio для декодирования аудио mu-law - PullRequest
2 голосов
/ 20 ноября 2010

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

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

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

1 Ответ

3 голосов
/ 21 ноября 2010

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

В методе Read возвращает данные из tmpMemStream. Как WaveFormat вернуть мю-закон 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);
}
...