Domanda
Ho un server che invia i dati tramite un socket, i dati sono un 'file' wav. Posso facilmente scrivere i dati su disco e quindi riprodurli in WMP, ma non ho idea di come posso riprodurli mentre li leggo dal socket. È possibile?
Domanda bonus: come farei se lo streaming fosse in mp3 o in altro formato?
Questo è per Windows in C ++ nativo.
Soluzione
Dato che hai detto WMP, suppongo che la domanda si applichi al tentativo di riprodurre un file WAV su un computer Windows. In caso contrario, questa risposta non è pertinente.
Quello che vuoi fare non è banale. C'è un buon articolo qui sul progetto di codice che descrive l'audio di Windows modello. Descrive come impostare il dispositivo audio e come trasmettere i dati nel dispositivo per la riproduzione. "Semplicemente" è necessario fornire i dati provenienti dal socket come dati per i buffer di riproduzione. Ma è qui che si trova tutto il lavoro complicato. Devi essere sicuro che
- Hai abbastanza dati per iniziare una riproduzione
- Gestisci il caso quando il tuo socket è affamato di dati e non hai nulla da inviare al buffer di riproduzione
- Sei in grado di leggere i dati dal socket con una velocità sufficiente per mantenere pieni i buffer di riproduzione
È un esercizio interessante. Ma difficile.
Altri suggerimenti
Mark ha ragione sul fatto che questo è un problema difficile. Potrebbe essere meno complicato se si utilizza DirectSound anziché waveOut. Ecco un articolo sullo streaming di file wave da disco: lo streaming dalla rete è essenzialmente lo stesso processo. Assicurati di raccogliere abbastanza dati dalla rete prima di iniziare: vorrai più dei 2 buffer citati dall'articolo.
Ancora meno complicato sarebbe FMOD . Dalle FAQ :
Funzioni Internet avanzate
- Streaming audio su Internet. È incluso un codice di streaming Internet personalizzato, che consente il supporto continuo di streaming SHOUTcast, Icecast e http.
- Funzionalità di download. Un effetto collaterale del file system modulare di FMOD che supporta i file di rete, anche i campioni statici possono essere caricati da Internet.
Supporto formato file : FMOD attualmente supporta una vasta gamma di formati di file audio. elenco parziale :
- MP3 - (MPEG I / II Layer 3, incluso il supporto VBR)
- OGG - (formato Ogg Vorbis)
- WAV - (file Microsoft Wave, inclusi gli onde compressi. Wav compressi PCM, MP3 e IMA ADPCM
Mark ha ragione sul fatto che questo è un problema difficile. L'API waveOutXXXX è antica (è precedente a Windows 95) e richiede una codifica più soggetta a errori di quanto si pensi. Interagire con l'API in C ++ sarà più semplice che con C #. Assicurati solo che sia qualcosa che vuoi davvero fare.
Se il tuo stream è in un formato diverso dai dati del file WAV (come MP3 o WMA), dovrai eseguire la fase aggiuntiva di decodifica dei dati in formato WAV e riprodurli con l'API waveOutXXXX. Trovare un buon componente per eseguire la decodifica MP3 è più complicato di quanto ti aspetteresti - penso che ciò sia legato alla situazione delle licenze Fraunhofer (dovresti pagarli se usi il codice MP3 in qualche modo).
Troverei un prodotto standard per farlo, a meno che tu non voglia l'esperienza di apprendimento.