Có cách nào trong C # để phát âm thanh (ví dụ: MP3) trực tiếp từ System.IO.Stream mà chẳng hạn như đã được returend từ WebRequest mà không lưu dữ liệu tạm thời vào đĩa không?
Giải pháp với NAudio
Với sự trợ giúp của NAudio 1.3, bạn có thể:
- Tải tệp MP3 từ một URL vào MemoryStream
- Chuyển đổi dữ liệu MP3 thành dữ liệu sóng sau khi tải xong
- Phát lại dữ liệu sóng bằng lớp WaveOut của NAudio
Thật tuyệt khi có thể phát một nửa tệp MP3 đã tải, nhưng điều này dường như là không thể do thiết kế thư viện NAudio .
Và đây là chức năng sẽ thực hiện công việc:
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);
}
}
}
}
}