2010-01-09 10 views
7

Tengo problemas para obtener MediaPlayer para que sea resistente al transmitir desde una URL HTTP.Transmisión en tiempo real con Android MediaPlayer: errores de captura y almacenamiento en memoria intermedia

Si empiezo a reproducir el archivo, pero luego dejo caer la conexión (por ejemplo, modo avión), MediaPlayer#OnErrorListener genera what=1, extra=-17 y poco después what=-38, extra=0.

No hay documentación que pueda ver en las API de lo que esto denota, excepto que el extra es "Típicamente dependiente de la implementación". Estoy usando un HTC Hero (bueno, es el G2 Touch de T-Mobile UK).

¿Las otras personas obtienen los mismos valores y es seguro detectar estos valores como si la conexión se hubiera ido?

¿Cómo puedo reanudar mejor cuando reaparece la conexión? (guarde la búsqueda actual en preferencias, y vuelva a intentar cada 5 segundos?)

¿Cómo puedo saber cuándo el dispositivo ha decidido comenzar a reproducir lo que ha estado guardando en búfer? ¿Hay una devolución de llamada (que no sea de sondeo isPlaying())?

Además, no estoy del todo seguro de lo que ofrece onBufferingUpdate. Estoy usando un podcast de 40 minutos MP3 (64kbps bitrate) - el almacenamiento en búfer es del 1%, 2%, 3%. Cuando busco unos 30 minutos, muestra el 75%, luego, cuando vuelvo al inicio al 5%, ¿cuál es el objetivo de esta devolución de llamada que no sea mostrar aproximadamente lo que se almacena en caché?

Finalmente, ¿hay alguna forma de conectar lo que se transmita a un MP3?

+0

_ "¿Cómo puedo reanudar mejor cuando reaparezca la conexión? (Guarde la búsqueda actual en las preferencias, y vuelva a intentarlo cada 5 segundos?) _ Tengo curiosidad por conocer su solución definitiva para esta pregunta en particular :) – Behnam

+0

Hola, tengo el mismo problema, necesito reanudar la transmisión cuando reaparezca la conexión. Por favor, ayúdenme. Estoy luchando con esto tantos días – Sakthi

Respuesta

5

Tomado de This similar stack Overflow Question

Yo también estoy decepcionado por la MEDIA_INFO_BUFFERING_START y MEDIA_INFO_BUFFERING_END ganchos ... fastidio.

Revisé la aplicación Pandora y no muestra un indicador de almacenamiento en búfer. Cuando se interrumpe la música para el almacenamiento en memoria intermedia , simplemente se queda allí como si no ocurriera nada y la interfaz de usuario parece todavía se está reproduciendo. Así que llegué a y llegué a la conclusión de que si está utilizando MediaPlayer, simplemente no es posible determinar si la pista está temporalmente detenida para el almacenamiento en búfer.

Sin embargo, me di cuenta de que hay unas constantes par MediaPlayer que podría ser de utilidad: MEDIA_INFO_BUFFERING_START y MEDIA_INFO_BUFFERING_END. Pero están solo disponibles en el nivel API 9+, y los documentos no dicen nada sobre ellos . Supongo que se pueden usar con OnInfoListener.

Estoy decepcionado, pero al menos puedo dejar de girar las ruedas ahora y mover a otra cosa.

+0

MediaPlayer de Android es muy decepcionante. Falta de método getState(), falta de información de almacenamiento en memoria intermedia , etc. – StackOverflowed

2

Es posible hacer esto

MediaPlayer tiene métodos para registrar un OnPreparedListener y una OnBufferingUpdateListener

onPrepared se llamará una vez que el jugador ha tamponada suficiente para empezar a jugar.

http://developer.android.com/reference/android/media/MediaPlayer.OnPreparedListener.html

onBufferingUpdate será llamado para ponerle al día sobre buffering información.

http://developer.android.com/reference/android/media/MediaPlayer.OnBufferingUpdateListener.html

También debe utilizar el servicio de conectividad a escuchar para conectividad de red

public boolean hasConnectivity() 
{ 
    ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = connectivityManager.getActiveNetworkInfo(); 

    int netType = info.getType(); 
    int netSubtype = info.getSubtype(); 

    if (netType == ConnectivityManager.TYPE_WIFI) 
    { 
     return info.isConnected(); 
    } 
    else if (netType == ConnectivityManager.TYPE_MOBILE && netSubtype == TelephonyManager.NETWORK_TYPE_UMTS) 
    { 
     return info.isConnected(); 
    } 

    return false; 
} 
0

Cuando se busca o se salta o se pierde la conexión y MediaPlayer se mantenga volver a conectar con el servidor proxy, debe enviar esta respuesta con Status 206 después de obtener la solicitud y rango (int) del cliente.

String headers += "HTTP/1.1 206 Partial Content\r\n"; 
headers += "Content-Type: audio/mpeg\r\n"; 
headers += "Accept-Ranges: bytes\r\n"; 
headers += "Content-Length: " + (fileSize-range) + "\r\n"; 
headers += "Content-Range: bytes "+range + "-" + fileSize + "/*\r\n"; 
headers += "\r\n"; 

Y cuando reciba una petición de MediaPlayer que no contiene Rango en la cabecera HTTP, a continuación, se solicita un nuevo archivo de flujo, en este caso el encabezado de respuesta debe tener este aspecto:

String headers = "HTTP/1.1 200 OK\r\n"; 
headers += "Content-Type: audio/mpeg\r\n"; 
headers += "Accept-Ranges: bytes\r\n"; 
headers += "Content-Length: " + fileSize + "\r\n"; 
headers += "\r\n"; 

¡Disfrútalo!

Cuestiones relacionadas