¿Cómo controlar el retraso de inicio de MediaPlayer?

En primer lugar, mi objetivo es reproducir un sonido en mis dispositivos con la misma hora de inicio. Incluso un retraso de 100ms es muy importante para mí. Así que debo ser muy cuidadoso en esa gestión de retraso.

Suponga que sincronizo todos mis dispositivos con el protocolo de tiempo de red. Estoy conectando 0.tr.pool.ntp.org y con demoras añadidas tengo un dato como ese:

  • La hora del sistema: 14: 45: 50.255000 (a) En mi dispositivo
  • Tiempo de NTP: 14: 46: 01.255000 (b)

Está funcionando bien. Tengo una clase BroadcastReceiver como receptor de alarma. Una vez más, por ejemplo, voy a reproducir un sonido a las 14: 50: 00.000 y la que se da a AlarmManager como ((14: 50: 00.000) – (a – b)) para la sincronización con el servidor NTP.

Hasta aquí todo es genial. Mi problema está comenzando con un retraso de casi 250ms (c) en BroadcastReceiver. Este retraso nunca es 1000ms ++. He resuelto este problema con el cambio de hora de alarma a ((14: 50: 00.000) – (a – b) – 1000ms), a continuación, en BroadcastReceiver i añadir un retraso de (1000ms – c) . Todavía es grande gracias a Dios 🙂

El paso final es jugar el sonido, es muy fácil apenas agrega este bloque del código:

MediaPlayer player = MediaPlayer.create(getBaseContext(), R.raw.mysound); player.setOnCompletionListener(new OnCompletionListener() { public void onCompletion(MediaPlayer player) { player.release(); } }); player.start(); 

Este código funciona, pero ¿qué pasa con el retraso? Decido medir este retraso al principio de mi aplicación y guardarlo para usarlo cuando llegue el momento. Yo uso ese método:

 private void synchronizeMediaPlayer(){ long startMs = new Date().getTime(); MediaPlayer player = MediaPlayer.create(getBaseContext(), R.raw.mysound); player.setOnCompletionListener(new OnCompletionListener() { public void onCompletion(MediaPlayer player) { player.release(); } }); player.start(); long finishMs = new Date().getTime(); delayPlayer = finishMs - startMs; // this is static variable for using in any class player.stop(); player.release(); } 

De acuerdo. Una vez más este delayPlayer nunca va 1000ms ++. A continuación, como se puede estimar, cambié la hora de alarma a ((14: 50: 00.000) – (a – b) – 1000ms – 1000ms) luego añadió un retardo de (1000ms – delayPlayer) antes de reproducir el sonido. Creo que esta es la forma más razonable.

Resultado: Ahora, después de todos estos pasos, mi sonido comienza con un pequeño retardo (como 50ms-250ms) entre los dispositivos. Medí todos los retrasos y controlé cada paso. Todo está bien, pero el único problema es delayPlayer . Pensé, está cambiando siempre con respecto al estado de los dispositivos (uso de la RAM, servicios del fondo, etc.). Francamente, comencé a pensar que estos cambios no dependen del estado del dispositivo. Porque lo medí con un intervalo de 1 minuto, luego vi que siempre está cambiando. Estos cambios son muy diferentes como; ahora 150ms, después de 1 min va 300ms.

¿Cómo puedo solucionar ese problema de retraso de MediaPlayer? Creo que los programadores increíbles pueden ayudarme.

Nota: Mi inglés puede no ser bueno. Lo siento por eso…

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.