Pregunta

Estoy intentando utilizar NAudio a decodificar mu-ley codificada de audio en audio PCM. Mi servicio se publica la cruda ley mu bytes codificados de audio y estoy recibiendo un error de NAudio que los datos no tiene una cabecera RIFF. ¿Es necesario añadir esto de alguna manera? El código que estoy usando es:

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

También estoy guardando los datos en bruto en el disco y hacer la decodificación en Matlab que está trabajando sin ningún problema. Gracias.

¿Fue útil?

Solución

Dado que sólo hay datos de ley Mu primas, no se puede utilizar un WaveFileReader en él. En su lugar, crear una nueva clase que hereda de WaveStream.

En su método Read, datos de retorno de tmpMemStream. Como WaveFormat devolver un WAVEFORMAT mu-ley.

Esta es una clase de ayuda genérica que puede usar:

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);
    }
}

Ahora se puede proceder a crear el archivo convertido como lo hacía antes, que pasa en el RawSourceWaveStream como entrada:

var waveFormat = WaveFormat.CreateMuLawFormat(8000, 1);
var reader = new RawSourceWaveStream(tmpMemStream, waveFormat);
using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader))
{
    WaveFileWriter.CreateWaveFile(recordingsPath + "/" + outputFileName, convertedStream);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top