Frage

Ich versuche NAudio zu dekodieren mu-law-Audio in PCM-Audio codiert zu verwenden. Mein Service ist POSTed die rohe mu-Gesetz codierte Audio Bytes und ich bin immer einen Fehler von NAudio, dass die Daten keine RIFF-Header verfügt. Muss ich das irgendwie hinzufügen? Der Code Ich verwende ist:

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

Ich spare auch die Rohdaten auf die Festplatte und macht die Decodierung in Matlab, die ohne Probleme funktioniert. Danke.

War es hilfreich?

Lösung

Da Sie nur rohe mu-law Daten haben, können Sie keine WaveFileReader auf sie aus. Verwenden Sie stattdessen eine neue Klasse, die erbt von Wavestream.

In seiner Read Methode Rückgabedaten aus tmpMemStream. Als WaveFormat ein mu-Gesetz WAVE zurück.

Hier ist eine allgemeine Helfer-Klasse, die Sie verwenden können:

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

Sie können nun mit der konvertierten Datei erstellen, wie Sie vorher, wie Sie Ihre Eingabe in der RawSourceWaveStream vorbei:

var waveFormat = WaveFormat.CreateMuLawFormat(8000, 1);
var reader = new RawSourceWaveStream(tmpMemStream, waveFormat);
using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader))
{
    WaveFileWriter.CreateWaveFile(recordingsPath + "/" + outputFileName, convertedStream);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top