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
Respuesta
@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.
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
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. –
Registre OnBufferingUpdate oyente.
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
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.
, 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
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
- 1. Detecta si un VideoVIew está almacenando en el buffer
- 2. ¿Cómo puedo saber dónde está mongoDB almacenando datos? (no está en el valor predeterminado/data/db!)
- 3. Cómo saber cuándo Windows está inactivo
- 4. ¿Cómo está todo el mundo almacenando conexiones?
- 5. Android MediaPlayer se está preparando demasiado tiempo
- 6. Java - ¿Cómo saber cuándo está esperando el hilo?
- 7. Cómo silenciar MediaPlayer en Android
- 8. ¿Cómo saber cuándo el dispositivo iOS está enchufado?
- 9. Android MediaPlayer atorado en prepare()
- 10. ¿Cómo saber cuándo termina el TTS?
- 11. android MediaPlayer no está reproduciendo el archivo mp3
- 12. ¿Cómo puedo saber cuándo WindowsFormsHost está redimensionando en WPF?
- 13. RTP en Android MediaPlayer
- 14. AndroId MediaPlayer prepareAsync método
- 15. Android MediaPlayer - cómo jugar en STREAM_ALARM?
- 16. Cómo saber si el dispositivo está durmiendo
- 17. C# - ¿Cómo saber cuándo Windows está "resuelto" después del inicio?
- 18. Cómo reproducir mp3 + g en mediaplayer android
- 19. ¿Está almacenando imágenes en SQL Server?
- 20. ¿Está almacenando Crystal Reports en archivos XML?
- 21. Cómo vaciar (borrar) el buffer de logcat en Android
- 22. ¿Cómo saber si la tarjeta SD está montada en Android?
- 23. ¿Cómo puedo saber si la pantalla está activada en Android?
- 24. Cómo separar/liberar Surfaceview desde android mediaplayer
- 25. Android MediaPlayer Detener y jugar
- 26. ¿Cómo saber cuándo se ha pausado el MPMoviePlayerController en iPhone?
- 27. Servicio Android que controla MediaPlayer
- 28. getClass(). GetClassLoader(). GetResourceAsStream() está almacenando en caché el recurso
- 29. Obtener mediaPlayer del videoView en Android
- 30. Transmisión a la MediaPlayer Android
¿Alguna actualización sobre esto? Estoy tratando de hacer un reproductor de video en tiempo real. Todos los comentarios son bienvenidos. – Sen