domingo, 27 de septiembre de 2015

Programando un reproductor de video en HTML5 - 1 de 2



Si ha probado los anteriores códigos en diferentes navegadores, seguramente habrá notado que los diseños gráficos de los controles del reproductor difieren de uno a otro. 
Cada navegador tiene sus propios botones y barras de progreso, e incluso sus propias funciones. Esta situación puede ser aceptable en algunas circunstancias pero en un ambiente profesional, donde cada detalle cuenta, resulta absolutamente necesario que un diseño consistente sea preservado a través de dispositivos y aplicaciones, y también disponer de un control absoluto sobre todo el proceso.
HTML5 proporciona nuevos eventos, propiedades y métodos para manipular video e integrarlo al documento. De ahora en más, podremos crear nuestro propio reproductor de video y ofrecer las funciones que queremos usando HTML, CSS y Javascript. El video es ahora parte integral del documento.


El diseño

Todo reproductor de video necesita un panel de control con al menos algunas funciones básicas. En la nueva plantilla del Código 5-4, un elemento <nav> fue agregado luego de <video>. Este elemento <nav> contiene dos elementos <div> (botones y barra) para ofrecer un botón “Reproducir” y una barra de progreso.

Código 5-4. Plantilla HTML para nuestro reproductor de video.

<!DOCTYPE html>
<html lang="es">
<head>
<title>Reproductor de Video</title>
<link rel="stylesheet" href="reproductor.css">
<script src="reproductor.js"></script>
</head>
<body>
<section id="reproductor">
<video id="medio" width="720" height="400">
<source src="http://minkbooks.com/content/trailer.mp4">
<source src="http://minkbooks.com/content/trailer.ogg">
</video>
<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>

Además del video, esta plantilla también incluye dos archivos para acceder a códigos externos. Uno de ellos es player.css para los siguientes estilos CSS:

Código 5-5. Estilos CSS para el reproductor.

body{
text-align: center;
}
header, section, footer, aside, nav, article, figure, figcaption,
hgroup{
display : block;
}
#reproductor{
width: 720px;
margin: 20px auto;
padding: 5px;
background: #999999;
border: 1px solid #666666;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
}
nav{
margin: 5px 0px;
}
#botones{
float: left;
width: 100px;
height: 20px;
}
#barra{
position: relative;
float: left;
width: 600px;
height: 16px;
padding: 2px;
border: 1px solid #CCCCCC;
background: #EEEEEE;
}
#progreso{
position: absolute;
width: 0px;
height: 16px;
background: rgba(0,0,150,.2);
}

El Código 5-5 usa técnicas del Modelo de Caja Tradicional estudiado en el Capítulo 2 para crear la caja que contiene cada pieza del reproductor de video y ubicarla en el centro de la ventana. No hay nuevas propiedades o sorpresas en este código, es solo un grupo de propiedades CSS ya estudiadas y conocidas para proveer estilos a los elementos del reproductor. Sin embargo, existen dos propiedades que pueden resultar inusuales. La propiedad position, conocida por viejos programadores CSS, fue usada para superponer un elemento sobre otro (barra y progreso). Y la propiedad width, para el elemento <div> identificado como progreso, fue inicializada en 0. Esto se debe a que el elemento será utilizado para simular una barra de progreso que cambiará de tamaño a medida que el video es reproducido, y que, por supuesto, comenzará a crecer desde 0.
Hágalo usted mismo: Copie la nueva plantilla del Código 5-4 en el archivo HTML (video.html). Cree dos nuevos archivos vacíos para los estilos CSS y el código Javascript. Estos archivos deberían ser llamados reproductor.css y reproductor.js respectivamente. Copie el Código 5-5 dentro del archivo correspondiente y luego haga lo mismo para cada código Javascript listado de ahora en adelante.

El código

Es momento de escribir el código Javascript para nuestro reproductor. Existen diferentes formas de programar un reproductor de video, pero en este capítulo vamos solo a explicar cómo aplicar los necesarios eventos, métodos y propiedades para procesamiento básico de video. El resto quedará librado a su imaginación. 

Para nuestro propósito, vamos a trabajar con unas pocas funciones simples que nos permitirán reproducir y pausar el video, mostrar una barra de progreso mientras el video es reproducido y ofrecer la opción de hacer clic sobre esta barra para adelantar o retroceder el video.


Los eventos

HTML5 incorpora nuevos eventos que son específicos de cada API. Para el procesamiento de video y audio, por ejemplo, los eventos fueron incorporados con el objetivo de informar sobre la situación del medio (el progreso de la descarga, si la reproducción del medio finalizó, o si la reproducción del medio es comenzada o pausada, entre otras). No vamos a utilizarlos en nuestros ejemplos pero serán necesarios para construir aplicaciones complejas. Estos son los más relevantes: 

progress :Este evento es disparado periódicamente para informar acerca del progreso de la descarga del medio. La información estará disponible a través del atributo buffered, como veremos más adelante.
canplaythrough :Este evento es disparado cuando el medio completo puede ser reproducido sin interrupción. El estado es establecido considerando la actual tasa de descarga y asumiendo que seguirá siendo la misma durante el resto del proceso. Existe otro evento más para este propósito, canplay, pero no considera toda la situación y es disparado tan pronto como algunas partes del medio se encuentran disponibles (luego de descargar los primeros cuadros de un video, por ejemplo).
ended :Es disparado cuando el reproductor llega al final del medio. 
pause :Es disparado cuando el reproductor es pausado.
play :Es disparado cuando el medio comienza a ser reproducido.
error Este evento es disparado cuando ocurre un error. Es relacionado con el elemento <source> correspondiente a la fuente del medio que produjo el error.
Para nuestro reproductor de ejemplo solo vamos a escuchar a los habituales eventos click y load.
IMPORTANTE: Eventos, métodos y propiedades para APIs están aún en proceso de desarrollo. En este libro vamos a estudiar solo aquellos que consideramos relevantes e indispensables para nuestros ejemplos. Para ver cómo la especificación está progresando con respecto a esto, visite nuestro sitio web y siga los enlaces correspondientes a cada capítulo.
Código 5-6. Función inicial.

function iniciar() {
maximo=600;
medio=document.getElementById('medio');
reproducir=document.getElementById('reproducir');
barra=document.getElementById('barra');
progreso=document.getElementById('progreso');
reproducir.addEventListener('click', presionar, false);
barra.addEventListener('click', mover, false);
}

El Código 5-6 presenta la primera función de nuestro reproductor de video. La función fue llamada iniciar debido a que será la función que iniciará la ejecución de la aplicación tan pronto como el documento sea completamente cargado. 
Debido a que esta es la primera función a ser ejecutada, necesitamos definir unas variables globales para configurar nuestro reproductor. Usando el selector getElementById creamos una referencia a cada uno de los elementos del reproductor para poder acceder a ellos en el resto del código más adelante. También declaramos la variable maximo para conocer siempre el máximo tamaño posible para la barra de progreso (600 pixeles).
Hay dos acciones a las que tenemos que prestar atención desde el código: cuando el usuario hace clic sobre el botón “Reproducir” y cuando hace clic sobre la barra de progreso para avanzar o retroceder el video. Dos escuchas para el evento click fueron agregadas con el propósito de controlar estas situaciones. Primero agregamos la escucha al elemento reproducir que ejecutará la función presionar() cada vez que el usuario haga clic sobre el botón “Reproducir”. La otra escucha es para el elemento barra. En este caso, la función mover() será ejecutada cada vez que el usuario haga clic sobre la barra de progreso.



Espero haber ayudado en algo. Hasta la próxima oportunidad!








2 comentarios:

  1. Muy buena explicación, recomendado para personas que ya cuentan con conocimientos básicos, porfavor continua realizando post de este tipo, también un pequeño aporte yo aprendi a programar en esta escuela de cursos de programación http://www.grupocodesi.com y la verdad me encantarón ya que aprendi muy bien y post como estos refuerzan mis conocimientos
    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Rodolfo morales, gracias por la visita y el aporte de tu comentario.
      Éxitos!! Hasta cualquier momento!

      Eliminar