2012-07-29 10 views
13

Sono in streaming audio utilizzando MediaPlayer su Android.Lo streaming di MediaPlayer Android si interrompe in caso di cambio di rete

Quando il dispositivo si sposta dalla rete Wi-Fi alla rete cellulare o viceversa, MediaPlayer interrompe la riproduzione.

In genere nell'amplificatore sono presenti pochi secondi di audio, quindi la riproduzione non termina immediatamente.

Idealmente vorrei riprendere il flusso per la riproduzione ininterrotta, ma non riesco a vedere come farlo.

Sto lavorando con entrambi i file mp3 ospitati sul server e un flusso di trasmissione dal vivo.

+0

Qualche codice da condividere con noi? – Erol

+0

C'è un sacco di esempi nella barra laterale, se hai bisogno di aiuto con MediaPlayer, ma è molto semplice: 'MediaPlayer mMediaPlayer = MediaPlayer.create (contesto, Uri.parse (url));' ' mMediaPlayer.prepare(); ' ' mMediaPlayer.start(); ' consente di iniziare. Se si è connessi al Wi-Fi e si dispone di copertura 3G, disattivare il Wi-Fi durante lo streaming e la riproduzione si fermerà. – lightversusdark

+2

Sì, so come usare il lettore multimediale. Stavo solo chiedendo se hai provato qualcosa per quel motivo e voglio condividere i tuoi progressi in modo da poter migliorare su questo. – Erol

risposta

0

Non so perché il lettore multimediale si arresta, ma forse è possibile aggiungere un metodo onReceive e inserire "mp.start()" nel metodo per riavviare la riproduzione.
Android, How to handle change in network (from GPRS to Wi-fi and vice-versa) while polling for data

Potrebbe essere necessario fare una classe separata, ma che dovrebbe spiegare come creare un metodo che viene chiamato quando si passa reti, a questo punto si potrebbe chiamare "mp.start()" per riprendere la riproduzione (supponendo che mp sia il tuo MediaPlayer).
Questo presuppone, naturalmente, che il tuo MediaPlayer stia solo in pausa quando stai passando da una rete all'altra, non interrotta.

14

Dal punto di vista dei server, la modifica della modalità di rete da Wi-Fi a 3G (viceversa), sembrerà una nuova connessione da un IP separato (client).

Se il server da cui si sta scaricando non supporta il monitoraggio del flusso (ad esempio numero di secondi, sequenza, byte) (diversamente dai server multimediali), dovrà iniziare a servire nuovamente il proprio mp3 da 0 byte.

Se l'URL punta a un file MP3 situato su un server HTTP standard, la situazione sarà ciò che si aspetta. Dovresti esaminare l'uso di un server di streaming multimediale, in modo da poter riprendere il download/lo streaming a tua scelta. Quando si riceve l'intento che la connessione venga persa/ripresa, è possibile indirizzare il proprio mediaplayer al nuovo URL con posizione file nell'URL (ad es. Secondi = 19, byte = 57365).

Non so se questo ti aiuta, ma spiega un po 'che cosa sta succedendo "dietro le quinte".

1

Provare a impostare setOnCompletionListener e setOnErrorListener. Una volta completato con un flusso live, puoi chiamare nuovamente prepareAsync() e questo darà il via al flusso. Non c'è un modo elegante per farlo davvero a meno che non si scriva il proprio quadro dei media.

È inoltre possibile ascoltare in voi onError() per il MEDIA_ERROR_SERVER_DIED è quindi possibile sparare il prepareAsync() di nuovo.

Troverete che MediaPlayer sarà Errore o Completato. Se gestisci entrambi questi callback, il minimo che puoi fare è riavviare il flusso al cambio della rete, come per una riproduzione fluida .. che richiederebbe un mediaframework personalizzato poiché quello Android è piuttosto scadente.

0

Come dice Vidar, il ripristino della connessione verrà considerato dal server come una nuova connessione.

Sembra che sia necessario eseguire il doppio buffer della riproduzione audio, il che significa creare un lettore multimediale personalizzato. Questo può fornire audio continuo, ma salterà comunque durante l'ascolto di un live stream.

Il file MP3 è un po 'più semplice perché posso conoscere la posizione di riproduzione. Non così con il live streaming.

Come dice il direttore, ho bisogno di un ricevitore broadcast per stabilire una nuova connessione quando la rete cambia. Il buffer audio dalla connessione di rete precedente dovrebbe continuare a essere riprodotto mentre un nuovo buffer audio viene riempito tramite la nuova connessione.

Quando il nuovo buffer è sufficientemente pieno per avviare la riproduzione, è possibile passare alla riproduzione. Se sto eseguendo lo streaming di un file, con il supporto del server e un po 'di lavoro, posso garantire che i dati di posizione di riproduzione correnti siano in entrambi i buffer e passino senza interruzioni.

Poiché i buffer del flusso live non possono essere sincronizzati, ci sarà inevitabilmente un problema tecnico quando si passa.

Un buffer più grande eviterà l'interruzione dell'audio se la connessione richiede un po 'di tempo per stabilire, ma ritarderà il primo avvio della riproduzione. Un file MP3 può essere scaricato e riempire il buffer più velocemente del tempo reale, ma il live stream si buffererà in tempo reale.

Chris.Jenkins menziona alcuni metodi di MediaPlayer che possono aiutare ma sottolinea che questo sembra aver bisogno di un framework personalizzato. Dovrà gestire le condizioni che menziona e altre.

Se riesco a farlo sembrare carino, lo posterò qui. Terrò la domanda aperta.

Problemi correlati