2010-03-24 3 views
22

Sto cercando di scrivere un server leggero HTTP nella mia app per feed generati dinamicamente i dati MP3 alla funzione built-in AndroidMediaPlayer. Non sono autorizzato a memorizzare i miei contenuti su SD card.Streaming per Android MediaPlayer

I dati di input sono essenzialmente di lunghezza infinita. Dico allo MediaPlayer che la sua origine dati dovrebbe essere qualcosa di simile a "http://localhost/myfile.mp3". Ho una semplice configurazione del server che aspetta MediaPlayer per fare questa richiesta. Tuttavia, MediaPlayer non è molto collaborativo. Inizialmente, crea un HTTP GET e tenta di afferrare l'intero file. Scade se proviamo a scaricare i dati nel socket, quindi abbiamo provato a utilizzare l'intestazione Range HTTP per scrivere i dati in blocchi. MediaPlayer non piace e non continua a richiedere i blocchi successivi.

Qualcuno ha avuto successo con lo streaming di dati direttamente in MediaPlayer? Devo invece implementare un server RTSP o Shoutcast? Mi manca semplicemente un importante HTTP header? Quale strategia dovrei usare qui?

+0

Hai utilizzato questo approccio anche per riprodurre file video? Funzionava allo stesso modo dei file audio? –

+0

Hey Rob hai qualche soluzione per il problema? puoi condividere il codice di esempio? –

+0

lo so tardi. ma questo è per quelli che finiscono qui in futuro. questo [** Link **] (http://stackoverflow.com/questions/5343730/mediaplayer-stutters-at-start-of-mp3-playback/5432091#5432091) ha il codice per iniziare. – Samuel

risposta

3

Il server HTTP era effettivamente ospitato sul telefono stesso. Era molto semplice: solo un thread in ascolto su un socket per una richiesta . Quando ha ottenuto la richiesta HTTP, uno , , restituisce alcune intestazioni HTTP e avvia lo scarico dei dati audio MP3 indietro allo socket. Questo server HTTP non ha fatto altro.

Il Android Media Player stava riproducendo la musica mentre stavo trasmettendo a esso. Il Media Player si comportava in modo molto scarso se la sua riproduzione buffer veniva svuotata mentre stava riproducendo audio. Era molto importante per me assicurarmi che il mio server HTTP continuasse a scrivere i dati in quello socket. I ha spostato byte nel socket in piccoli blocchi (10 kB). Le intestazioni sulla mia risposta HTTP finito per assomigliare a questo:

// Build response headers 
StringBuilder sb = new StringBuilder(); 
sb.append("HTTP/1.1 200 OK\r\n"); 
sb.append("Content-Type: audio/mpeg\r\n"); 
sb.append("Connection: close\r\n"); 
sb.append("Accept-Ranges: bytes\r\n"); 
sb.append("Content-Length: " + totalFileSize + "\r\n"); 
sb.append("Content-Disposition: inline; filename=xxxxx.mp3\r\n\r\n"); 

Finché ho mantenuto il tubo alimentato, il Android Media Player mantenuto consumarlo senza lamentarsi. La riproduzione audio richiedeva solo una richiesta e una risposta . Ha finito per funzionare abbastanza bene.

+1

Qualche possibilità che il codice completo sia ospitato ovunque? Sto provando a fare lo stesso con i video live provenienti dal MediaRecorder + Camera e sono stremato dall'inseguire diversi tentativi e librerie. In caso contrario, quale taglia taglie ci vorrebbe per aggiungere maggiori dettagli qui? – ChiefTwoPencils