Apakah ada cara di C # untuk memutar audio (misalnya, MP3) secara langsung dari System.IO. Alirkan yang misalnya adalah returend dari WebRequest tanpa menyimpan data sementara ke disk?
Solusi dengan NAudio
Dengan bantuan NAudio 1.3, dimungkinkan untuk:
- Muat file MP3 dari URL ke dalam MemoryStream
- Ubah data MP3 menjadi data gelombang setelah selesai dimuat
- Putar ulang data gelombang menggunakan kelas WaveOut NAudio
Akan lebih baik untuk dapat memutar file MP3 yang setengah dimuat, tetapi ini tampaknya tidak mungkin karena desain perpustakaan NAudio .
Dan inilah fungsi yang akan melakukan pekerjaan itu:
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);
}
}
}
}
}
Jawaban:
Edit: Jawaban diperbarui untuk mencerminkan perubahan dalam versi terbaru NAudio
Itu mungkin menggunakan pustaka audio .NET open source NAudio yang saya tulis. Ini mencari codec ACM pada PC Anda untuk melakukan konversi. Mp3FileReader yang disertakan dengan NAudio saat ini mengharapkan untuk dapat memposisikan ulang dalam aliran sumber (itu membangun indeks frame MP3 di depan), sehingga tidak sesuai untuk streaming melalui jaringan. Namun, Anda masih dapat menggunakan kelas
MP3Frame
danAcmMp3FrameDecompressor
di NAudio untuk mendekompresi MP3 yang dialirkan dengan cepat.Saya telah memposting artikel di blog saya yang menjelaskan cara memutar aliran MP3 menggunakan NAudio . Pada dasarnya Anda memiliki satu utas mengunduh bingkai MP3, mendekompresi dan menyimpannya dalam file
BufferedWaveProvider
. Utas lain kemudian memutar ulang menggunakanBufferedWaveProvider
sebagai input.sumber
Kelas SoundPlayer dapat melakukan ini. Sepertinya yang perlu Anda lakukan hanyalah menyetel properti Stream ke aliran, lalu panggil
Play
.edit
Saya rasa tidak bisa memutar file MP3; tampaknya terbatas pada .wav. Saya tidak yakin apakah ada sesuatu dalam kerangka yang dapat memutar file MP3 secara langsung. Semua yang saya temukan tentang itu melibatkan penggunaan kontrol WMP atau berinteraksi dengan DirectX.
sumber
Bass bisa melakukan ini. Putar dari Byte [] dalam memori atau file melalui delegasi tempat Anda mengembalikan data, sehingga Anda dapat memutar segera setelah Anda memiliki cukup data untuk memulai pemutaran ..
sumber
Saya sedikit mengubah sumber permulaan topik, sehingga sekarang dapat memutar file yang tidak terisi penuh. Ini dia (perhatikan, ini hanya contoh dan merupakan titik awal; Anda perlu melakukan beberapa pengecualian dan penanganan kesalahan di sini):
sumber
Saya telah mengubah sumber yang diposting dalam pertanyaan untuk memungkinkan penggunaan dengan API TTS Google untuk menjawab pertanyaan tersebut sini :
Panggil dengan:
Akhiri dengan:
Perhatikan bahwa saya menggunakan
ParameterizedThreadDelegate
kode di atas, dan utas dimulai denganplayThread.Start(10000);
. 10000 mewakili maksimal 10 detik audio untuk diputar sehingga perlu di-tweak jika streaming Anda membutuhkan waktu lebih lama dari itu untuk diputar. Hal ini diperlukan karena versi NAudio (v1.5.4.0) saat ini tampaknya memiliki masalah dalam menentukan kapan streaming selesai diputar. Ini mungkin diperbaiki di versi yang lebih baru atau mungkin ada solusi yang saya tidak meluangkan waktu untuk menemukannya.sumber
NAudio membungkus API WaveOutXXXX. Saya belum melihat sumbernya, tetapi jika NAudio mengekspos fungsi waveOutWrite () dengan cara yang tidak secara otomatis menghentikan pemutaran pada setiap panggilan, maka Anda harus dapat melakukan apa yang Anda inginkan, yaitu mulai memainkan aliran audio sebelum Anda menerima semua data.
Menggunakan fungsi waveOutWrite () memungkinkan Anda untuk "membaca ke depan" dan membuang potongan audio yang lebih kecil ke dalam antrian keluaran - Windows secara otomatis akan memutar potongan tersebut dengan mulus. Kode Anda harus mengambil aliran audio terkompresi dan mengubahnya menjadi potongan kecil audio WAV dengan cepat; bagian ini akan sangat sulit - semua pustaka dan komponen yang pernah saya lihat melakukan konversi MP3-ke-WAV seluruh file dalam satu waktu. Mungkin satu-satunya kesempatan realistis Anda adalah melakukan ini menggunakan WMA daripada MP3, karena Anda dapat menulis pembungkus C # sederhana di sekitar SDK multimedia.
sumber
Saya membungkus pustaka decoder MP3 dan membuatnya tersedia untuk pengembang .NET sebagai mpg123.net .
Termasuk contoh untuk mengkonversi file MP3 ke PCM , dan membaca tag ID3 .
sumber
Saya belum mencobanya dari WebRequest, tetapi baik komponen Windows Media Player ActiveX dan MediaElement (dari WPF ) mampu memutar dan menyangga aliran MP3.
Saya menggunakannya untuk memutar data yang berasal dari aliran SHOUTcast dan itu berfungsi dengan baik. Namun, saya tidak yakin apakah itu akan berhasil dalam skenario yang Anda usulkan.
sumber
Saya selalu menggunakan FMOD untuk hal-hal seperti ini karena gratis untuk penggunaan non-komersial dan berfungsi dengan baik.
Karena itu, saya dengan senang hati akan beralih ke sesuatu yang lebih kecil (FMOD ~ 300k) dan open-source. Poin bonus super jika dikelola sepenuhnya sehingga saya dapat mengkompilasi / menggabungkannya dengan .exe saya dan tidak perlu ekstra hati-hati untuk mendapatkan portabilitas ke platform lain ...
(FMOD juga dapat dibawa, tetapi Anda jelas membutuhkan binari yang berbeda untuk platform yang berbeda)
sumber