Mit NAudio zu dekodieren mu-law Audio
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.
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);
}