Sincronización de sonido cuando la tasa de audio es irregular

Entradas anteriores sobre este tema:

Hoy me he encontrado con un caso nuevo: tasa de audio irregular con huecos en las marcas de tiempo.

La fuente original en este caso está montada a base de trozos de audio, y entre unos audios y otros hay huecos. Dichos huecos no son trozos de audio en silencio, sino que ni siquiera existen tramas de audio durante esos segundos. Es decir, revisando las marcas temporales de las tramas de audio, vemos que hay huecos.

¿Qué ocurre cuando un reproductor se encuentra con esos huecos?. Pues que simplemente meterá silencio. Bien.

El problema surge cuando exportamos una pista de sonido con huecos en las marcas temporales a un formato que no incluye marcas temporales o bien que las normaliza. El efecto es que esos huecos desaparecen. Desaparecen esas pausas.

Cuando hemos exportado la pista de audio para procesarla y volver a unirla a la pista de vídeo (o a otras pistas de audio), vamos a tener problemas de sincronización. Estos fallos de sincronización no se solucionarán simplememente añadiendo un offset de tiempo al principio de la pista, como he explicado en Determinar automáticamente el desfase de audio en un fichero MKV (III), porque el desajuste en variable a lo largo de la pista de sonido.

Lo que queremos es exportar la pista de sonido manteniendo los silencios. Es decir, si en el fichero original hay silencios debido a que hay huecos en las marcas temporales, en el fichero de audio exportado deben aparecer silencios codificados como sonido a cero.

El detalle a entender es que en la fuente original no es que haya un silencio, sino que directamente no existe sonido en absoluto para esa marca temporal. En el fichero de audio exportado existirá un silencio codificado como sonido a cero. El efecto es el mismo, pero la codificación y la forma de trabajar es diferente.

Podemos usar ffmpeg para extraer el sonido manteniendo los silencios mediante el mecanismo de añadir sonido a cero, de esta manera:

$ ffmpeg -i FUENTE.mkv -af aresample=async=1 SONIDO.wav

Aquí instruímos a ffmpeg para que utilice el filtro de audio aresample con la configuración async=1. Esta configuración indica que ffmpeg debe rellenar con silencio los huecos de marcas temporales que encuentre. Es decir, hace exactamente lo que queremos que haga.