2011-10-24 31 views
14

Estoy creando un video para mi sitio web con HTML5. Lo ideal sería tener solo un archivo de video silencioso y cinco pistas de audio diferentes en diferentes idiomas que se sincronicen con el video.Múltiples pistas de audio para video HTML5

Luego tendría un botón que permite a los usuarios cambiar entre las pistas de audio, incluso mientras se reproduce el video; y la pista de audio correcta cobraría vida (sin que el video se detenga o comience de nuevo o algo así, como una selección de pista de audio de DVD).

Puedo hacer esto simplemente en Flash, pero no quiero. Tiene que haber una forma de hacerlo en HTML5 puro o HTML5 + jQuery. Estoy pensando que reproduciría todos los archivos de audio a 0 volumen, y solo aumentaría el volumen de la pista activa ... pero no sé cómo hacer eso, y mucho menos manejarlo cuando el usuario hace una pausa o rebobina el video ...

¡Gracias de antemano!

Respuesta

3

Si está dispuesto a descargar las cinco pistas, ¿por qué no simplemente mezclarlas en el video? Los videos no están limitados a una sola pista de audio (incluso AVI podría hacer múltiples pistas de audio). Entonces la sincronización debe ser manejada por ti. Simplemente habilitar/deshabilitar las pistas de audio según sea necesario.

+1

¿Cómo exactamente controlaría eso con JavaScript, entonces? :) –

+2

@EmphramStavanger: http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#media-elements da un elemento 'audioTracks', y luego puede usar' .enable() 'y' .disable() 'en cada pista. No he probado esto yo mismo. – derobert

+0

¡Impresionante, lo comprobaré! –

8

La sincronización entre audio y video es mucho más compleja que simplemente iniciar el audio y el video al mismo tiempo. Las tarjetas de sonido se reproducirán a velocidades ligeramente diferentes. (Lo que es 44.1 kHz para mí, en realidad podría ser 44.095 kHz.)

A menudo, el video se sincroniza con la transmisión de audio, pero el reproductor es el que maneja esto. Al cargar varios objetos para la reproducción, los está sacando de la sincronización.

La única forma en que esto funcionará es si puede encontrar una manera de controlar las diferentes secuencias de audio del reproductor de video. No sé si esto es posible.

En su lugar, propongo que codifique el video varias veces, con las diferentes secuencias. Puede usar FFMPEG para esto e incluso automatizar el proceso, dependiendo de su flujo de trabajo. El cambio entre las transmisiones se convierte en un problema, pero la mayoría de los reproductores de video son lo suficientemente robustos como para adivinar el desplazamiento de bytes en el archivo, cuando se le da la velocidad de bits.

Si solo necesita dos idiomas, puede simplemente ajustar el balance entre un canal de audio estéreo izquierdo y derecho.

+0

¿Qué es tan difícil para los navegadores mux las transmisiones sobre la marcha en una sola antes de reproducirlo como lo hace ffmpeg? – themihai

+0

@themihai Cuando tiene un archivo de video con una pista de video y varias pistas de audio, todas están sincronizadas a un punto de referencia común. Cuando tiene varios archivos separados, no lo son. No puedes alinear 8 objetos de audio, decirles que jueguen, y esperar que jueguen simultáneamente ya que todos tienen su propia decodificación, almacenamiento en búfer, etc., y eso suponiendo que el navegador incluso intente reproducirlos todos simultáneamente. En realidad, usted llama a jugar, y el navegador hace su trabajo cuando le da la gana (dentro de un tiempo razonable para parecer instantáneo). – Brad

+0

@themihai Con FFmpeg, puede tomar todas esas pistas, muxarlas en el mismo archivo y darles ese punto de referencia común. Como alternativa que alguien propuso aquí, Web Audio API se puede utilizar para programar la reproducción de forma precisa. Es decir, todo el audio se decodifica primero en muestras de PCM, que luego se pueden iniciar al mismo tiempo. En ese punto, la referencia del reloj es el dispositivo de salida. – Brad

3

Se puede hacer con Web Audio API.

Parte de mi programa escucha eventos de elementos de video y detiene o reinicia las pistas de audio creadas con la API de audio web. Esto me da la capacidad de activar y desactivar cualquiera de las pistas en perfecta sincronización.

Existen algunos inconvenientes.

No hay soporte de Web Audio API en Internet Explorers a excepción de Edge.

La técnica funciona solo con audio en búfer y eso es limitante. Hay algunos problemas con archivos grandes: https://bugs.chromium.org/p/chromium/issues/detail?id=71704

+0

Aún así, gracias por la sugerencia de 'mediagroup'. Ahora tiene un poco mejor soporte que en el momento de su escritura;) – SimonSimCity

+0

Me alegra ser de ayuda. También es bueno ver que las especificaciones se traen a la vida :) – Nek

+0

mediagroup ha sido desaprobado/anulado (al menos por Chrome) – themihai