Capítulo 5 Video y audio -2
Por el momento no existe un estándar para formatos de video y audio en la web. Existen varios contenedores y diferentes codificadores disponibles, pero ninguno fue totalmente adoptado y no hay consenso alguno de parte de los fabricantes de navegadores para lograr un estándar en el futuro cercano.
Los contenedores más comunes son OGG, MP4, FLV y el nuevo propuesto por Google, WEBM. Normalmente estos contenedores contienen video codificado con los codificadores Theora, H.264, VP6 o VP8, respectivamente. Esta es la lista de los más usados:
• OGG codificador de video Theora y audio Vorbis.
• MP4 codificador de video H.264 y audio AAC.
• FLV codificador de video VP6 y audio MP3. También soporta H.264 y AAC.
• WEBM codificador de video VP8 y audio Vorbis.
Los codificadores utilizados para OGG y WEBM son gratuitos, pero los utilizados para MP4 y FLV están patentados, lo que significa que si queremos usar MP4 o FLV para nuestras aplicaciones deberemos pagar. Algunas restricciones son anuladas para aplicaciones gratuitas.
El tema es que en este momento Safari e Internet Explorer no soportan la tecnología gratuita. Ambos solo trabajan con MP4 y solo Internet Explorer anunció la inclusión del codificador VP8 en el futuro. Esta es la lista de los navegadores más populares:
• Firefox codificador de video Theora y audio Vorbis.
• Google Chrome codificador de video Theora y audio Vorbis. También soporta codificador de video H.264 y audio AAC.
• Opera codificador de video Theora y audio Vorbis.
• Safari codificador de video H.264 y audio AAC.
• Internet Explorer codificador de video H.264 y audio AAC.
Un mayor soporte para el formato WEBM en el futuro podría mejorar la situación, pero probablemente no habrá un formato estándar por al menos los próximos dos o tres años y tendremos que considerar diferentes alternativas de acuerdo a la naturaleza de nuestra aplicación y nuestro negocio.
Audio no es un medio tan popular como video en Internet. Podemos filmar un video con una cámara personal que generará millones de vistas en sitios web como www.youtube.com, pero crear un archivo de audio que obtenga el mismo resultado es prácticamente imposible. Sin Embargo, el audio se encuentra aún disponible, ganando su propio mercado en shows de radio y podcasts en toda la red.
HTML5 provee un nuevo elemento para reproducir audio en un documento HTML. El elemento, por supuesto, es <audio> y comparte casi las mismas características del elemento <video>.
<!DOCTYPE html>
<html lang=»es»>
<head>
<title>Reproductor de Audio</title>
</head>
<body>
<section id=»reproductor»>
<audio src=»http://minkbooks.com/content/beach.mp3» controls> </audio>
</section>
</body>
</html>
Listado 5-11. HTML básico para reproducir audio.
El elemento <audio> trabaja del mismo modo y comparte varios atributos con el elemento <video>:
src Este atributo especifica la URL del archivo a ser reproducido. Al igual que en el elemento <video> normalmente será reemplazado por el elemento <source> para ofrecer diferentes formatos de audio entre los que el navegador pueda elegir. controls Este atributo activa la interface que cada navegador provee por defecto para controlar la reproducción del audio.
autoplay Cuando este atributo está presente, el audio comenzará a reproducirse automáticamente tan pronto como sea posible. loop Si este atributo es especificado, el navegador reproducirá el audio una y otra vez de forma automática.
preload Este atributo puede tomar tres valores diferentes: none, metadata o auto. El primero indica que el audio no debería ser cacheado, normalmente con el propósito de minimizar tráfico innecesario. El segundo valor, metadata, recomendará al navegador obtener información sobre el medio (por ejemplo, la duración). El tercer valor, auto, es el valor configurado por defecto y le aconseja al navegador descargar el archivo tan pronto como sea posible.
Una vez más debemos hablar acerca de codificadores, y otra vez debemos decir que el código en el Listado 5-11 debería ser más que suficiente para reproducir audio en nuestro documento, pero no lo es. MP3 está bajo licencia comercial, por lo que no es soportado por navegadores como Firefox u Opera. Vorbis (el codificador de audio del contenedor OGG) es soportado por esos navegadores, pero no por Safari e Internet Explorer. Por esta razón, nuevamente debemos aprovechar el elemento <source> para proveer al menos dos formatos entre los cuales el navegador pueda elegir:
<!DOCTYPE html>
<html lang=»es»>
<head>
<title>Reproductor de Audio</title>
</head>
<body>
<section id=»reproductor»>
<audio id=»medio» controls>
<source src=»http://minkbooks.com/content/beach.mp3«>
<source src=»http://minkbooks.com/content/beach.ogg«>
</audio>
</section>
</body>
</html>
Listado 5-12: dos fuentes para el mismo audio
El código en el Listado 5-12 reproducirá música en todos los navegadores utilizando los controles por defecto. Aquellos que no puedan reproducir MP3 reproducirán OGG y viceversa. Recuerde que MP3, al igual que MP4 para video, tienen uso restringido por licencias comerciales, por lo que solo podemos usarlos en circunstancias especiales, de acuerdo con lo determinado por cada licencia.
El soporte para los codificadores de audio libres y gratuitos (como Vorbis) se está expandiendo, pero llevará tiempo transformar este formato desconocido en un estándar.
La API para medios fue desarrollada tanto para video como para audio. Cada evento, método y propiedad incorporada para video funcionará también con audio. Debido a esto, solo necesitamos reemplazar el elemento <video> por el elemento <audio> en nuestra plantilla e instantáneamente obtenemos un reproductor de audio:
<!DOCTYPE html>
<html lang=»es»>
<head>
<title>Reproductor de Audio</title>
<link rel=»stylesheet» href=»reproductor.css»>
<script src=»reproductor.js»></script>
</head>
<body>
<section id=»reproductor»>
<audio id=»medio»>
<source src=»http://minkbooks.com/content/beach.mp3«>
<source src=»http://minkbooks.com/content/beach.ogg«>
</audio>
<nav>
<div id=»botones»>
<button type=»button» id=»reproducir»>Reproducir</button> </div>
<div id=»barra»>
<div id=»progreso»></div>
</div>
<div style=»clear: both»></div>
</nav>
</section>
</body>
</html>
Listado 5-13. Plantilla para el reproductor de audio.
En la nueva plantilla del listado 5-13, solo incorporamos un elemento <audio> y sus fuentes correspondientes, dejando el resto del código intacto, incluyendo los archivos externos. No necesitamos cambiar nada más, los eventos, métodos y propiedades son los mismos para los dos medios (audio y video).
Hágalo usted mismo: Cree un nuevo archivo llamado audio.html, copie el código del Listado 5-13 dentro de este archivo y ábralo en su navegador. Use los mismos archivos reproductor.css y reproductor.j s creados anteriormente para hacer funcionar su reproductor de audio.
Video y audio son parte esencial de la web. HTML5 incorpora todos los elementos necesarios para aprovechar estas herramientas y utilizarlas en nuestras aplicaciones web.
Elementos
HTML5 provee dos nuevos elementos HTML para procesar medios y una API específica para acceder a la librería de medios.
<video> Este elemento nos permite insertar un archivo de video en un documento HTML. <audio> Este elemento nos permite insertar un archivo de audio en un documento HTML.
La especificación también provee atributos para los elementos <video> y <audio>:
src Este atributo declara la URL del medio a ser incluido en el documento. Puede usar el elemento <source> para proveer más de una fuente y dejar que el navegador elija cual reproducir.
Controls Este atributo, si está presente, activa los controles por defecto. Cada navegador provee sus propias funciones, como botones para reproducir y pausar el medio, así como barra de progreso, entre otras.
autoplay Este atributo, si está presente, le indicará al navegador que comience a reproducir el medio lo más pronto posible. loop Este atributo hará que el navegador reproduzca el medio indefinidamente. preload Este atributo recomienda al navegador qué hacer con el medio. Puede recibir tres valores diferentes: none, metadata y auto. El valor none le dice al navegador que no descargue el archivo hasta que el usuario lo ordene. El valor metadata le recomienda al navegador descargar información básica sobre el medio. El valor auto le dice al navegador que comience a descargar el archivo tan pronto como sea posible.
Existen algunos atributos que son específicos para el elemento <video>:
poster Este atributo provee una imagen para mostrarla en lugar del video antes de ser reproducido.
width Este atributo determina el tamaño del video en pixeles. height Este atributo determina el tamaño del video en pixeles.
Los eventos más relevantes para esta API son:
progress Este evento es disparado periódicamente para informar el progreso en la descarga del medio.
canplaythrough Este evento es disparado cuando el medio completo puede ser reproducido sin interrupción.
canplay Este evento es disparado cuando el medio puede ser reproducido. A diferencia del evento previo, éste es disparado cuando solo parte del archivo fue descargado (solo los primeros cuadros de un video, por ejemplo). ended Este evento es disparado cuando la reproducción llega al final del medio. pause Este evento es disparado cuando la reproducción es pausada. play Este evento es disparado cuando el medio comienza a ser reproducido. error Este evento es disparado cuando ocurre un error. El evento es despachado desde el elemento <source> (si se encuentra presente) correspondiente a la fuente del medio que produjo el error.
Los métodos más comunes para esta API son:
play() Este método comienza o continúa la reproducción del medio.
pause() Este método pausa la reproducción del medio.
load() Este método descarga el archivo del medio. Es útil en aplicaciones dinámicas. canPlayType(formato) Este método indica si el formato del archivo que queremos utilizar es soportado por el navegador o no. Retorna una cadena vacía si el navegador no puede reproducir el medio y los textos «maybe» (quizás) o «probably» (probablemente) basado en la confianza que tiene de que el medio pueda ser reproducido o no.
Las propiedades más comunes de esta API son:
paused Esta propiedad retorna true (verdadero) si la reproducción del medio se encuentra pausada o no ha comenzado.
ended Esta propiedad retorna true (verdadero) si la reproducción llegó al final del medio. duration Esta propiedad retorna la duración del medio en segundos. currentTime Esta es una propiedad que puede retornar o recibir un valor para informar la posición en la cual el medio se encuentra reproduciendo o establecer una nueva posición donde comenzar a reproducir. error Esta propiedad retorna el valor del error cuando un error ocurre. buffered Esta propiedad ofrece información sobre la cantidad del archivo que fue descargado e introducido en el buffer. Retorna un array conteniendo datos sobre cada porción del medio que ha sido descargada. Si el usuario salta a otra parte del medio que no ha sido aún descargada, el navegador comenzará a descargar el medio desde ese punto, generando una nueva porción en el buffer. Los elementos del array son accesibles por medio de los atributos end() y start(). Por ejemplo, el código buffered.end(0) retornará la duración en segundos de la primera porción del medio encontrada en el buffer.