1. ホーム
  2. .net

[解決済み] C#によるストリームからのオーディオ再生

2022-11-28 17:24:40

質問

C#で、音声(例えばMP3)を直接 System.IO.Stream から直接オーディオ (例えば MP3) を再生する方法はありますか?


解決方法 オーディオ

の助けを借りて NAudio 1.3 ではそれが可能です。

  1. MP3 ファイルを URL から MemoryStream にロードする。
  2. MP3 データを完全に読み込んだ後、wave データに変換する
  3. WAVEデータを NAudio のWaveOutクラスで再生します。

半分だけ読み込まれた MP3 ファイルを再生することさえできればよかったのですが、これは NAudio ライブラリの設計上、不可能なようです。

そして、これがその作業を行う関数です。

    public static void PlayMp3FromUrl(string url)
    {
        using (Stream ms = new MemoryStream())
        {
            using (Stream stream = WebRequest.Create(url)
                .GetResponse().GetResponseStream())
            {
                byte[] buffer = new byte[32768];
                int read;
                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
            }

            ms.Position = 0;
            using (WaveStream blockAlignedStream =
                new BlockAlignReductionStream(
                    WaveFormatConversionStream.CreatePcmStream(
                        new Mp3FileReader(ms))))
            {
                using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
                {
                    waveOut.Init(blockAlignedStream);
                    waveOut.Play();                        
                    while (waveOut.PlaybackState == PlaybackState.Playing )                        
                    {
                        System.Threading.Thread.Sleep(100);
                    }
                }
            }
        }
    }

どのように解決するのですか?

編集: NAudioの最近のバージョンでの変更を反映するために回答を更新しました。

を使えば可能です。 NAudio を使えば可能です。これは、PC 上の ACM コーデックを探して変換を行います。NAudio に付属する Mp3FileReader は現在、ソース ストリーム内で位置を変更できることを期待しています (MP3 フレームのインデックスを前面に作成します)ので、ネットワーク経由のストリーミングには適していません。しかしながら、まだ MP3FrameAcmMp3FrameDecompressor クラスで、ストリームされたMP3をオンザフライで伸長することができます。

私のブログで説明した記事 を使用してMP3ストリームを再生する方法について説明した記事をブログに投稿しました。 . 基本的には、1つのスレッドがMP3フレームをダウンロードし、それを解凍し、それを BufferedWaveProvider . 次に別のスレッドが BufferedWaveProvider を入力として再生します。