【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を再利用できる。