2010-12-16 24 views
29

Me falta algo obvio aquí, pero parece que no puedo encontrar nada que me permita determinar cuándo MediaPlayer está almacenando el audio. Estoy transmitiendo audio por Internet y quiero mostrar un indicador de almacenamiento en búfer, pero nada de lo que he intentado me permite saber cuándo MediaPlayer interrumpe el audio en el búfer, por lo que no puedo mostrar correctamente un indicador de almacenamiento en búfer. ¿Alguna pista?Android - Cómo saber cuándo MediaPlayer está almacenando en el buffer

+0

¿Alguna actualización sobre esto? Estoy tratando de hacer un reproductor de video en tiempo real. Todos los comentarios son bienvenidos. – Sen

Respuesta

6

@Daniel, según su comentario sobre la respuesta de @ JRL, probablemente pueda hacer que funcione haciendo girar un hilo y esperando un tiempo de espera.

Algo como DetectBufferTimeout.java (no probado) sería muy útil.

Sí, sin embargo, estoy de acuerdo en que hacer girar este hilo por separado es un poco complicado. Tal vez OnBufferingUpdateListener podría garantizar la frecuencia con la que llama al onBufferingUpdate() independientemente de si se ha producido un cambio en el progreso del almacenamiento en búfer para que podamos detectar si estamos obteniendo el mismo valor una y otra vez.

+1

Gracias, Matt. El problema que tengo es que no hay notificación de cuándo el MediaPlayer detiene la pista en el búfer. Pero tu sugerencia aún es buena. Creo que se aplicaría la misma técnica ... en lugar de verificar el progreso del almacenamiento en búfer, debería verificar el progreso de la reproducción. Si no se ha actualizado y no está en pausa ni detenido desde mi final, la instancia de MediaPlayer debe haberlo detenido para poder almacenar más datos de audio. ¡Gracias! – Daniel

+0

Ah sí, no me di cuenta de que quería saber cuándo la pista se había detenido _específicamente_ porque se había agotado a través de su memoria intermedia. –

1

Registre OnBufferingUpdate oyente.

+2

Gracias. Lo hice, pero parece que solo me dice el porcentaje de la pista de audio que ha sido almacenada. Traté de comparar con el tiempo de reproducción actual de la pista. Pensé que tal vez podría ver si el porcentaje del búfer actual es <= el porcentaje de tiempo de reproducción actual. Pero eso no funciona porque parece que MediaPlayer tiene un código de búfer horneado para que se guarde antes de que el búfer se agote por completo. Así que todavía no tengo una manera de decir (o controlar) cuando la pista está almacenando en búfer. Espero que me esté perdiendo algo? – Daniel

10

Ok, me siento un poco reivindicado ahora. 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 búfer, simplemente se sienta allí como si nada hubiera sucedido y la interfaz de usuario parece que todavía está jugando. Así que he llegado a la conclusión de que si está utilizando MediaPlayer, simplemente no es posible determinar si la pista está pausada temporalmente para el almacenamiento en búfer.

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

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

47

, como a continuación (API nivel ≥ 9):

mp.setOnInfoListener(new OnInfoListener() { 

    @Override 
    public boolean onInfo(MediaPlayer mp, int what, int extra) { 
     switch (what) { 
      case MediaPlayer.MEDIA_INFO_BUFFERING_START: 
       loadingDialog.setVisibility(View.VISIBLE); 
       break; 
      case MediaPlayer.MEDIA_INFO_BUFFERING_END: 
       loadingDialog.setVisibility(View.GONE); 
       break; 
     } 
     return false; 
    } 
}); 

NOTA: Existe un error conocido en Android. Cuando reproduces HLS, nunca llama a OnInfoListener ni a OnBuffering. revise este enlace OnInfoListener bug

+0

esto funciona perfecto! gracias –

+5

¿El hecho de que 'mediaPlayer' haya comenzado a almacenar en búfer garantiza que haya detenido la reproducción? No estoy seguro de esto. – shujj

+0

Te debo un millón;) – ZimaXXX

0

Puede usar un hilo que verifique la posición actual del MediaPlayer. Si la posición no cambia, puede concluir que el medio está en estado de almacenamiento en búfer. Aquí está el tutorial completo que escribí: http://www.ottodroid.net/?p=260

Cuestiones relacionadas