2012-07-29 21 views
13

Transmisión de audio con MediaPlayer en Android.La transmisión de medios de Android se detiene al cambiar la red

Cuando el dispositivo se mueve de Wi-Fi a la red de la célula o viceversa, MediaPlayer detiene la reproducción.

Normalmente, hay unos pocos segundos de audio en el búfer, por lo que la reproducción no cesa inmediatamente.

Idealmente me gustaría retomar la secuencia para la reproducción ininterrumpida, pero no puedo ver cómo hacerlo.

Estoy trabajando con ambos archivos mp3 alojados en el servidor y una transmisión de transmisión en vivo.

+0

¿Algún código para compartir con nosotros? – Erol

+0

Hay muchos ejemplos en la barra lateral si necesita ayuda con MediaPlayer, pero es muy simple: 'MediaPlayer mMediaPlayer = MediaPlayer.create (contexto, Uri.parse (url));' ' mMediaPlayer.prepare(); ' ' mMediaPlayer.start(); ' lo pondrá en marcha. Si está conectado a Wi-Fi y tiene cobertura 3G, apague el Wi-Fi mientras se detiene la transmisión y la reproducción. – lightversusdark

+2

Sí, sé cómo usar el reproductor multimedia. Solo preguntaba si probaste algo en ese nombre y quieres compartir tu progreso para que podamos mejorarlo. – Erol

Respuesta

0

No sé por qué su reproductor multimedia se está deteniendo, pero tal vez podría agregar un método onReceive y poner "mp.start()" en el método para que reinicie la reproducción.
Android, How to handle change in network (from GPRS to Wi-fi and vice-versa) while polling for data

Puede que tenga que hacer una clase separada, sino que debe explicar cómo crear un método que se llama cuando cambia de red, momento en el que se podría llamar "mp.start()" para reanudar la reproducción (suponiendo que mp es su MediaPlayer).
Esto asume, por supuesto, que su MediaPlayer solo está siendo en pausa cuando está conmutando redes, no se detiene.

14

Desde el punto de vista de un servidor, cambiar el modo de red de WiFi a 3G (viceversa), se verá como una nueva conexión desde un IP (cliente) separado.

Si el servidor del que está descargando no admite el seguimiento de la secuencia (por ejemplo, número de segundos, secuencia, byte) (a diferencia de los servidores de medios), tendrá que volver a publicar su mp3 de 0 bytes.

Si su URL apunta a un archivo MP3 ubicado en un servidor HTTP estándar, su situación será la esperada. Debería considerar el uso de un servidor de transmisión de medios, para que pueda reanudar la descarga/transmisión a su elección. Cuando reciba la intención de que la conexión se pierda/reanude, puede apuntar su reproductor a la nueva URL con posición de archivo en la URL (por ejemplo, segundos = 19, bytes = 57365).

No estoy seguro si esto lo ayuda, pero explica un poco lo que sucede "detrás de escena".

1

Intente configurar su setOnCompletionListener y setOnErrorListener. Completo con transmisión en vivo, simplemente puede llamar al prepareAsync() nuevamente y esto iniciará de nuevo la transmisión. No hay una manera elegante de hacer esto realmente a menos que usted escriba su propio marco de medios.

También puede escuchar en usted onError() para el MEDIA_ERROR_SERVER_DIED, luego puede disparar el prepareAsync() nuevamente.

Descubrirá que el MediaPlayer será Error o Completo. Si maneja ambas devoluciones de llamada, lo mínimo que puede hacer es reiniciar la transmisión al cambiar de red, como para una reproducción fluida ... eso requeriría un marco de medios personalizado ya que el de Android es bastante de mala calidad.

0

Como dice Vidar, restablecer la conexión será tratada por el servidor como una nueva conexión.

Parece que tengo que duplicar la reproducción del audio, lo que significa construir un reproductor multimedia personalizado. Esto puede proporcionar audio continuo, pero saltará al escuchar una transmisión en vivo.

El archivo MP3 es un poco más fácil porque puedo conocer la posición de reproducción. No es así con la transmisión en vivo.

Como gmaster dice, necesitaré un receptor de difusión para establecer una nueva conexión cuando la red cambie. El búfer de audio de la conexión de red anterior debe continuar la reproducción mientras se llena un nuevo búfer de audio a través de la nueva conexión.

Cuando el nuevo búfer está lo suficientemente lleno para iniciar la reproducción, puedo cambiar la reproducción a este. Si estoy transmitiendo un archivo en streaming, con soporte de servidor y un poco de trabajo, puedo asegurarme de que los datos de posición de reproducción actuales estén en ambos buffers y cambien sin interrupciones.

Como las memorias intermedias de la transmisión en vivo no se pueden sincronizar, inevitablemente habrá una falla cuando se enciendan.

Un buffer más grande evitará la caída de audio si la conexión tarda un tiempo en establecerse, pero retrasará el primer inicio de la reproducción. Se puede descargar un archivo MP3 y llenar el búfer más rápido que en tiempo real, pero la transmisión en vivo almacenará en búfer en tiempo real.

Chris.Jenkins menciona algunos métodos de MediaPlayer que pueden ayudar, pero señala que esto parece necesitar un marco personalizado. Tendrá que manejar las condiciones que menciona y otras.

Si puedo hacer que se vea bonita lo publicaré aquí. Voy a mantener la pregunta abierta.

Cuestiones relacionadas