【C# 】バイト列で受け取ったMP3をファイルに書き出さずにWAVに変換する【NAudio】

Webからダウンロードした音源データをファイルにせずに変換したい時に躓いたのでメモ。

ググっても一旦MP3で保存してその後WAVで書き出して~とかしか出てこなくて困った。

コード

このコードではNAudioを使う。NAudioとは何か、導入手順等は以下の記事を参照して欲しい。

//MP3のバイト列
byte[] mp3Byte = hogehoge();
byte[] wavByte;

using (Stream stream = new MemoryStream())
{
    stream.Write(mp3Byte, 0, wavByte);

    stream.Position = 0;
                
    using (WaveStream pcm = new Mp3FileReader(stream))
    {
        wavByte = new byte[Convert.ToInt32(pcm.Length)];
        //wavByteに読み込み
        pcm.Read(wavByte,0, Convert.ToInt32(pcm.Length));
    }
}

streamをMemoryStreamで初期化している。これは、ファイルの読み取り先にメモリを使用するストリームである。

つまり、Byte配列等の生データから読み込めるということだ。

そのStreamに書き込んだ後、Positionを0に戻す

後のMp3FileReaderがPositionからデコードするのか、これが無いとエラーを吐く。

Mp3FileReaderでデコードして、そのデータをwavByteに読み込む。このデータは生のPCMデータ、つまり波形のデータだ。

また、wavFileを保存する場合はwavByteに書き込むところを

WaveFileWriter.CreateWaveFile(savePath, pcm);

とすれば良いし、そのまま再生する場合はWaveStreamを再利用できる。