¿Por qué mi vídeo va por detrás del audio cuando lo reproduzco en mi teléfono Android?

Es la forma en que Android reproduce el vídeo. Probablemente signifique que tu dispositivo Android tiene poca potencia para ese tipo de vídeo. No he analizado Android en esto recientemente, ya que mis dispositivos han sido lo suficientemente rápidos como para no ser un problema.

Problema de sincronización estática

Si estás viendo un retraso entre el audio y el vídeo que es fijo, podría ser un fallo en el flujo de medios que estás reproduciendo, o podría ser alguna parte de ese formato de vídeo que tu reproductor Android no entiende. En cualquier caso, algunos reproductores permiten ajustar la sincronización entre los flujos de audio y vídeo.

Un ejemplo es MX Player (MX Player - Apps on Google Play). Yo mismo lo he usado de vez en cuando, y es un reproductor bastante básico. Pero ofrece varias opciones de reproducción que no necesariamente están en su reproductor por defecto. Por un lado, puedes ajustar la sincronización de audio/vídeo a través de las opciones del menú de este reproductor, lo que puede ayudar.

Otra parte del problema puede ser que en cualquier dispositivo móvil, la reproducción de audio y vídeo están intrínsecamente separadas. Eso es porque los dispositivos móviles tienen todos decodificadores de hardware para la reproducción de vídeo. No es que la CPU no pueda decodificarlo necesariamente, pero el decodificador de hardware utilizará mucha menos energía. Lo mismo ocurre en la mayoría de los sistemas: incluso Windows admite la decodificación por hardware, aunque normalmente se realiza en la GPU en lugar de en un motor MPEG dedicado.

Por lo tanto, parte de esta separación puede significar que tu software no está rastreando completamente la latencia de reproducción entre el audio y el vídeo, dependiendo de las características específicas de tu flujo de medios. Ya he mencionado el ajuste de sincronización, que te permite adelantar o retener el audio para arreglar la sincronización con el vídeo. También puedes probar uno de los otros modos de reproducción. La última vez que lo comprobé, MX Player admite una reproducción por "Software", y algo llamado "Hardware+".

Problema de sincronización de la marcha

Hay otro problema que parece derivarse también de esta división hardware/software en Android (y no, no es necesariamente exclusivo de Android). No es necesariamente el caso de que todos los reproductores estén escritos para soportar correctamente la reproducción de medios en sus reproductores por defecto, porque en el mejor de los casos, "simplemente funcionan" sin ninguna codificación especial.

Así que coge tu ordenador rápido. Envías el siguiente fotograma de vídeo y el siguiente buffer de audio a reproducir. Cuando el actual está terminado, dos hilos independientes cada uno de ellos buscan su siguiente elemento para ser reproducido o mostrado. Pero esto espera que el siguiente cuadro de vídeo esté listo cuando sea el momento de reproducir el siguiente trozo de audio. Si eso no ocurre, el audio tiene que ser reproducido o se oye un fallo, pero el vídeo no cambiará hasta que la decodificación esté completa en ese fotograma actual. El sistema no puede evitar retrasarse, aunque sólo en raras ocasiones la decodificación de un fotograma de vídeo no se produzca en la ranura asignada para ello.

Esto también ilustra que, para una correcta reproducción, el vídeo tiene que estar sincronizado con el audio. Somos mucho más sensibles al audio, incluso un fallo de 1ms se nota. Por lo tanto, en un reproductor de PC adecuado, que no pretende ser un reproductor perfecto, sino simplemente uno bueno, el audio informa al vídeo. Si tu decodificador de vídeo no puede decodificar un fotograma dentro de la franja de tiempo asignada, la acción correcta es que muestre ese fotograma actual, se salte el siguiente y comience a decodificar el siguiente. Eso hará que se salte un fotograma para mantener la sincronización A/V, y la mayoría de las veces ni siquiera lo notarás.

Pero lo que parecía ocurrir en Android, al menos con los reproductores por defecto, es que los flujos de audio y vídeo se ejecutaban de forma independiente el uno del otro, lo que se soporta sabiendo justo cómo funciona la decodificación por hardware. En un flujo de medios digitales correctamente formateado, esto funciona siempre que el sistema pueda seguir el ritmo del vídeo. Si no es así, lo que se obtiene es un flujo de audio que poco a poco va "caminando por delante" del flujo de vídeo.

Así que eso parece ser lo que estás experimentando. Esto también podría curarse eligiendo un modo de reproducción diferente en un reproductor de vídeo complementario como MX Player. No tengo ningún interés específico en que utilices MX Player, simplemente te informo de que sé que tiene opciones que pueden resolver tu problema.

Si la reproducción por software resuelve el problema, ten en cuenta que va a consumir más energía que la reproducción por hardware. También es probable que se resienta si intentas reproducir un vídeo demasiado "grande" para tu dispositivo. Yo tenía una tableta Android bastante temprana, incluso antes de que saliera Honeycomb, y estaba jugando con el tipo de reproducción de vídeo que podía manejar, cuando me encontré por primera vez con estos problemas de sincronización. Por aquel entonces, incluso un flujo de bits moderado de 1080p era demasiado para el hardware de aquella época. Es posible que encuentres limitaciones similares en los dispositivos Android de gama baja que intentan reproducir flujos HEVC en 4K. Que también son un reto para muchos PC, sin soporte de hardware.