データを一時的にディスクに保存せずに、たとえばWebRequest から返されたSystem.IO.Streamからオーディオ (MP3 など) を直接再生する方法は C# にありますか?
NAudioを使用したソリューション
NAudio 1.3を使用すると、次のことが可能になります。
- URL から MP3 ファイルを MemoryStream にロードする
- MP3 データの読み込みが完了したら、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);
}
}
}
}
}