Frage

NAudio Library: http://naudio.codeplex.com/

Ich versuche, eine MP3-Datei in eine WAV-Datei zu konvertieren, aber ich habe in einen kleinen Fehler ausgeführt. Ich weiß, was falsch läuft, aber ich weiß nicht wirklich, wie über die Festsetzung es zu gehen.

Hier ist das Stück Code, ich bin mit:

private void button1_Click(object sender, EventArgs e) {
    using(Mp3FileReader reader = new Mp3FileReader(@"path\to\MP3")) {
        using(WaveFileWriter writer = new WaveFileWriter(@"C:\test.wav", new WaveFormat())) {
            int counter = 0;
            while(reader.Read(test, counter, test.Length + counter) != 0) {
                writer.WriteData(test, counter, test.Length + counter);
                counter += 512;
            }
        }
    }
}

reader.Read () geht in die Mp3FileReader Klasse, und das Verfahren sieht wie folgt aus:

public override int Read(byte[] sampleBuffer, int offset, int numBytes)
{
    if (numBytes % waveFormat.BlockAlign != 0)
        //throw new ApplicationException("Must read complete blocks");
        numBytes -= (numBytes % waveFormat.BlockAlign);
    return mp3Stream.Read(sampleBuffer, offset, numBytes);
}

mp3Stream ist eine Aufgabe der Stream-Klasse.

Das Problem ist: Ich bin eine Argument bekommen. MSDN sagt, dass dies liegt daran, dass die Summe aus Offset und numBytes größer ist als die Länge ist anderes sample.

Dokumentation: http://msdn.microsoft .com / en-us / library / system.io.stream.read.aspx

Dies geschieht, weil ich die Zähler jedes Mal erhöhen, aber die Größe des Byte-Arrays test bleibt gleich.

Was habe ich mich gefragt ist: brauche ich dynamisch die Größe des Arrays zu erhöhen, oder muss ich die benötigte Größe zu Beginn herauszufinden, und legen Sie es sofort

Und auch, statt 512, gibt die Methode in Mp3FileReader 365 das erste Mal. Welches ist die Größe eines ganzen Blocks. Aber ich schreibe die vollen 512. Ich bin im Grunde nur die Lese mit überprüfen, ob ich noch nicht am Ende der Datei bin. Muß ich den Rückgabewert fangen und etwas zu tun mit dem, oder bin ich gut hier?

War es hilfreich?

Lösung

Sie müssen den Rückgabewert von Read () verwenden, um zu bestimmen, wie viele Bytes Sie tatsächlich bekommen. Es muss nicht 512 sein, fand man bereits, dass aus. Und denken Sie daran, dass Sie mit Streams arbeiten, nicht Arrays. Machen Sie es ähnlich aussehen:

   using (var reader = new Mp3FileReader(@"path\to\MP3")) {
        using (var writer = new WaveFileWriter(@"C:\test.wav", new WaveFormat())) {
            var buf = new byte[4096];
            for (;;) {
                var cnt = reader.Read(buf, 0, buf.Length);
                if (cnt == 0) break;
                writer.WriteData(buf, 0, cnt);
            }
        }
    }

Andere Tipps

You're not actually performing any conversion from MP3 into WAV in your example. You need the WaveFormatConversionStream. Try something like this:

private void button1_Click(object sender, EventArgs e) {
    using(Mp3FileReader reader = new Mp3FileReader(@"path\to\MP3")) {
        using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) {
            WaveFileWriter.CreateWaveFile(outputFileName, convertedStream);
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top