lunes, 28 de septiembre de 2015

Programando un reproductor de video en HTML5 - 2 de 2



Los métodos

La función presionar() incorporada en el Código 5-7 es la primera función que realmente realiza una tarea. Esta función ejecutará de acuerdo a la situación actual dos métodos específicos de esta API: play()y pause():

Código 5-7. Esta función inicia y pausa la reproducción del video.

function presionar(){
if(!medio.paused && !medio.ended) {
medio.pause();
reproducir.innerHTML='Reproducir';
window.clearInterval(bucle);
}else{
medio.play();
reproducir.innerHTML='Pausa';
bucle=setInterval(estado, 1000);
}
}

Los métodos play() y pause() son parte de una lista de métodos incorporados por HTML5 para procesamiento de medios. Los siguientes son los más relevantes:
  • play() :Este método comienza a reproducir el medio desde el inicio, a menos que el medio haya sido pausado previamente.
  • pause() :Este método pausa la reproducción.
  • load() :Este método carga el archivo del medio. Es útil en aplicaciones dinámicas para cargar el medio anticipadamente.
  • canPlayType(formato) :Con este método podemos saber si el formato del archivo es soportado por el navegador o no.


Las propiedades

La función presionar() también usa unas pocas propiedades para recabar información sobre el medio. Las siguientes son las más relevantes: 
  • paused :Esta propiedad retorna true (verdadero) si la reproducción del medio está actualmente pausada o no a comenzado.
  • ended :Esta propiedad retorna true (verdadero) si la reproducción del medio ha finalizado porque se llegó al final.
  • 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 sobre la posición en la cual el medio está siendo reproducido o especifica una nueva posición donde continuar reproduciendo.
  • error :Esta propiedad retorna el valor del error ocurrido. 
  • buffered :Esta propiedad ofrece información sobre la parte del archivo que ya fue cargada en el buffer. Nos permite crear un indicador para mostrar el progreso de la descarga. La propiedad es usualmente leída cuando el evento progress es disparado. Debido a que los usuarios pueden forzar al navegador a cargar el medio desde diferentes posiciones en la línea de tiempo, la información retornada por buffered es un array conteniendo cada parte del medio que ya fue descargada, no solo la que comienza desde el principio. 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. Esta propiedad y sus atributos están bajo desarrollo en este momento.


El código en operación

Ahora que ya conocemos todos los elementos involucrados en el procesamiento de video, echemos un vistazo a cómo trabaja la función presionar().
Esta función es ejecutada cuando el usuario presiona el botón “Reproducir” en nuestro reproductor. Este botón tendrá dos propósitos: mostrará el mensaje “Reproducir” para reproducir el video o “Pausa” para detenerlo, de acuerdo a las circunstancias. Por lo tanto, cuando el video fue pausado o no comenzó, presionar este botón comenzará o continuará la reproducción. Lo opuesto ocurrirá si el video está siendo reproducido, entonces presionar el botón pausará el video.
Para lograr esto el código detecta la situación del medio comprobando el valor de las propiedades paused y ended. En la primera línea de la función tenemos un condicional if para este propósito. Si el valor de medio.paused y medio.ended es falso, significará que el video está siendo reproducido, entonces el método pause() es ejecutado para pausar el video y el texto del botón es cambiado a “Reproducir” usando innerHTML. 
Si lo opuesto ocurre, el video fue pausado previamente o terminó de ser reproducido, entonces la condición será falsa (medio.paused o medio.ended es verdadero) y el método play() es ejecutado para comenzar o restaurar la reproducción del video. En este caso también realizamos una importante acción que es configurar un intervalo usando setInterval() para ejecutar la función estado() una vez por segundo de ahora en más.

Código 5-8. Esta función actualiza la barra de progreso una vez por segundo.

function estado(){
if(!medio.ended){
var total=parseInt(medio.currentTime*maximo/medio.duration);
progreso.style.width=total+'px';
}else{
progreso.style.width='0px';
reproducir.innerHTML='Reproducir';
window.clearInterval(bucle);
}
}

La función estado() en el Código 5-8 es ejecutada cada segundo mientras el video es reproducido. También utilizamos un condicional if en esta función para controlar el estado del video. Si la propiedad ended retorna falso, calculamos qué tan larga la barra de progreso debe ser en pixeles y asignamos el valor al elemento <div> que la representa. 
En caso de que la propiedad sea verdadera (lo cual significa que la reproducción del video ha terminado), retornamos el valor de la barra de progreso a 0 pixeles, cambiamos el botón a “Reproducir”, y cancelamos el intervalo usando clearInterval. En este caso la función estado() no será ejecutada nunca más. 
Volvamos unos pasos para estudiar cómo calculamos el tamaño de la barra de progreso. 
Debido a que la función estado() será ejecutada cada segundo mientras el video se está reproduciendo, el valor del tiempo en el que el video se encuentra cambiará constantemente. 
Este valor en segundos es obtenido de la propiedad currentTime. También contamos con el valor de la duración del video en la propiedad duration, y el máximo tamaño de la barra de progreso en la variable maximo que definimos al principio. Con estos tres valores podemos calcular cuántos pixeles de largo la barra debería ser para representar los segundos ya reproducidos. La fórmula tiempo actual × maximo / duración total transformará los segundos en pixeles para cambiar el tamaño del elemento <div> que representa la barra de progreso.
La función para responder al evento click del elemento reproducir (el botón) ya fue creada. Ahora es tiempo de hacer lo mismo para responder a los clics hechos sobre la barra de progreso:

Código 5-9. Comenzar a reproducir desde la posición seleccionada por el usuario.

function mover(e){
if(!medio.paused && !medio.ended){
var ratonX=e.pageX-barra.offsetLeft;
var nuevoTiempo=ratonX*medio.duration/maximo;
medio.currentTime=nuevoTiempo;
progreso.style.width=ratonX+'px';
}
}

Una escucha para el evento click fue agregada al elemento barra para responder cada vez que el usuario quiera comenzar a reproducir el video desde una nueva posición. 
La escucha usa la función mover() para responder al evento cuando es disparado. Puede ver esta función en el Código 5-9. Comienza con un if, al igual que las anteriores funciones, pero esta vez el objetivo es controlar que la acción se realice sólo cuando el video está siendo reproducido. Si las propiedades paused y ended son falsas significa que el video está siendo reproducido y el código tiene que ser ejecutado.
Debemos hacer varias cosas para calcular el tiempo en el cual el video debería comenzar a ser reproducido. Necesitamos determinar cuál era la posición del ratón cuando el clic sobre la barra fue realizado, cuál es la distancia en pixeles desde esa posición hasta el comienzo de la barra de progreso y cuantos segundos esa distancia representa en la línea de tiempo.
Los procesos para agregar una escucha (o registrar un evento), tales como addEventListener(), siempre envían un valor que hacer referencia al evento. Esta referencia es enviada como un atributo a la función que responde al evento. 
Tradicionalmente la variable e es usada para almacenar este valor. En la función del Código 5-9 usamos esta variable y la propiedad pageX para capturar la posición exacta del puntero del ratón al momento en el que el clic fue realizado. El valor retornado por pageX es relativo a la página, no a la barra de progreso o la ventana. Para saber cuántos pixeles hay desde el comienzo de la barra de progreso y la posición del puntero, tenemos que substraer el espacio entre el lado izquierdo de la página y el comienzo de la barra. Recuerde que la barra está localizada en una caja que se encuentra centrada en la ventana. Los valores dependerán de cada situación en particular, por lo tanto supongamos que la barra está localizada a 421 pixeles del lado izquierdo de la página web y el clic fue realizado en el medio de la barra.
Debido a que la barra tiene una longitud de 600 pixeles, el clic fue hecho a 300 pixeles desde el comienzo de la barra. Sin embargo, la propiedad pageX no retornará el valor 300, sino 721. Para obtener la posición exacta en la barra donde el clic ocurrió, debemos substraer de pageX la distancia desde el lado izquierdo de la página hasta el comienzo de la barra (en nuestro ejemplo, 421 pixeles). Esta distancia puede ser obtenida mediante la propiedad offsetLeft. Entonces, usando la formula e.pageX - barra.offsetLeft conseguimos exactamente la posición del puntero del ratón relativa al comienzo de la barra. En nuestro ejemplo, la fórmula en números sería: 721 – 421 = 300.
Una vez obtenido este valor, debemos convertirlo a segundos. Usando la propiedad duration, la posición exacta del puntero del ratón en la barra y el tamaño máximo de la barra construimos la fórmula ratonX × video.duration / maximo y almacenamos el resultado dentro de la variable nuevoTiempo. Este resultado es el tiempo en segundos que la posición del puntero del ratón representa en la línea de tiempo. 
El siguiente paso es comenzar a reproducir el video desde la nueva posición. La propiedad currentTime, como ya mencionamos, retorna la posición actual del video en segundos pero también avanza o retrocede el video a un tiempo específico si un nuevo valor le es asignado. Con el código medio.currentTime=nuevoTiempo movemos el video a la posición deseada.
Lo único que resta por hacer es cambiar el tamaño del elemento progreso para reflejar en pantalla la nueva situación. Utilizando el valor de la variable ratonX cambiamos el tamaño del elemento para alcanzar exactamente la posición done el clic fue hecho. 
El código para nuestro reproductor de video ya está casi listo. Tenemos todos los eventos, métodos, propiedades y funciones que nuestra aplicación necesita. Solo hay una cosa más que debemos hacer, un evento más que debemos escuchar para poner nuestro código en marcha:

Código 5-10. Escuchando al evento load.

window.addEventListener('load', iniciar, false);

Podríamos haber usado la técnica window.onload para registrar el manejador del evento, y de hecho hubiese sido la mejor opción para hacer nuestros códigos compatibles con viejos navegadores. Sin embargo, debido a que esta serie de publicaciones es acerca de HTML5, decidimos usar el nuevo estándar addEventListener(). 
Hágalo usted mismo: Copie todos los códigos Javascript desde el Código 5-6 dentro del archivo reproductor.js. Abra el archivo video.html con la plantilla del Código 5-4 en su navegador y haga clic en el botón “Reproducir”. Intente utilizar la aplicación desde diferentes navegadores.

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








4 comentarios:

  1. Excelente tutorial, bastante bueno, muy recomendado, veo que tienes varios posts de excelente calidad, ojala y sigas trabajando con este tipo de informaciòn, tambièn les comparto estos cursos de programaciòn bastante buenos !! http://www.grupocodesi.com

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

      Eliminar
  2. donde puedo ver el resultado de tu programacion .. es muy interesante

    ResponderEliminar
    Respuestas
    1. Hola Jesus Garayar, gracias por la visita y el aporte de tu comentario!
      Si estás siguiendo la serie de publicaciones de este tema, te darás cuenta como obtener y visualizar los resultados de esta publicación paso a paso. Por lo pronto, no he mostrado resultados para que los usuarios se animen a probarlo y participen con sus comentarios. :)
      Éxitos! Hasta cualquier instantes!

      Eliminar

       

Etiquetas

Academy (23) Accediendo a datos con ADO .NET (31) Acceso a la red (30) Algoritmo (34) Algoritmos en JAVA (2) Ampliación de clases (2) APRENDA A PROGRAMAR COMO SI ESTUVIERA EN PRIMERO - Autores : IKER AGUINAGA (3) APRENDA A PROGRAMAR COMO SI ESTUVIERA EN PRIMERO - Autores : IKER AGUINAGA (10) Aprendiendo a desarrollar en Windows 8 (5) Aprendiendo UML en 24 Horas (Autor : Joseph Schmuller ) (30) Arquitectura (29) Arquitectura del Computador (3) Arquitectura del Computador - Historia de la informática (1) Asignación de direcciones IP (18) Aspectos fundamentales de bases de datos (5) Auditoría de la dirección (2) Auditoría de Sistemas (3) Auditoría Informática - Un enfoque práctico - Mario G . Piattini y Emilio del Peso (7) Avanzado (23) Base de Datos (67) Básico (23) Bios (29) Business Productivity Online Suite - BPOS (3) Capa de Red (22) Capa de Transporte (16) Capítulo 1 - Documentos HTML5 (6) Capítulo 10. API Web Storage (2) Capítulo 11. API IndexedDB (4) Capítulo 12. API File (1) Capítulo 2. Estilos CSS y modelos de caja (7) Capítulo 3. Propiedades CSS3 (4) Capítulo 4. Javascript (6) Capítulo 5. Video y audio (6) Capítulo 6. Formularios y API Forms (8) Capítulo 7. API Canvas (5) Capítulo 8. API Drag and Drop (2) Capítulo 9. API Geolocation (2) CCNA1 v5.0 (195) CCNA1 v6.0 (23) CCNA2 v5.0 (26) CCNA3 v5.0 (25) CCNA4 v5.0 (23) CD-ROM (3) Chapter 1 How does Xamarin.Forms fit in? (7) Chapter 2 Anatomy of an app (5) Cisco (297) Cloud Computing (3) CNNA v5.0 Routing & Switching (216) CNNA v6.0 Routing & Switching (2) Codigo (2) Computadora (32) Configuración (29) Configuración de un sistema operativo de red (21) Control (29) Creación de tipos de datos y tablas (3) Creación y Administración de bases de datos (3) Creando la Interface de la Aplicación Windows (50) Creating Mobile Apps with Xamarin.Forms (13) Cuenta (29) Curso (32) Curso Aprendiendo a Programar (25) Datos (3) Desarrollando en Windows 8 - AVANZADO (2) Desarrollando en Windows 8 - BÁSICO (3) Desarrollando en Windows 8 - INTERMEDIO (2) Desarrollo (2) Desarrollo .Net (21) Desarrollo avanzado de Windows Store Apps usando C# (1) Desarrollo basado en conceptos de Ingeniería de Software para Visual Studio (2) DESARROLLO DE APLICACIONES WINDOWS CON MICROSOFT .NET (37) DESARROLLO DE APLICACIONES WINDOWS CON MICROSOFT .NET (Autor: Luis Dueñas Huaroto) (29) Desarrollo en Microsoft Visual Studio (44) Desarrollo en Microsoft Visual Studio - AVANZADO (15) Desarrollo en Microsoft Visual Studio - BÁSICO (14) Desarrollo en Microsoft Visual Studio - INTERMEDIO (18) Desarrollo en Windows Phone 8 (13) Diagnostico (4) Diagrama (3) Diagramas de actividades (2) Diagramas de colaboraciones (2) Diagramas de secuencias (2) Digital (2) Diplomado (2) Disco (29) Disco Duro (4) Diseño de aplicaciones de Windows 8 en HTML 5 (7) Dispositivos Electrónicos (11) Doctorado (2) Ejemplos (3) Ejemplos de algoritmos (27) El camino hacia el CSS3 (3) El diseño web flexible (6) El elemento de diseño Canvas (3) El enfoque de los sistemas (3) El flujo de un programa (2) El gran libro de HTML5 - CSS3 y Javascript - Autor: Juan Diego Gauchat (55) El principio de organicidad (7) Electrónica (2) Elementos de un sistema (5) Empresas (2) Entrada y salida (4) Entropía y neguentropía (7) Estrategia (2) Estructura de un programa Java (12) Estructuras de almacenamiento (10) Estructuras de control (6) Estructuras de las tablas en SQL Server (2) Estructuras fundamentales de los datos (2) Ethernet (21) Evolución y Familias de los Microprocesadores (15) Exámen (23) Exploración de la red (23) Extensión de clases (4) Facebook (4) Familia Intel (15) Forefront (8) Función (3) Funciones de una red (12) Funciones de una red informática (1) Fundamentos de C# para absolutos principiantes (17) Fundamentos de programación en Java (50) Generaciones de la computadora (5) Gestión (3) Gestión de riesgos - Auditoría de Sistemas (1) GONZALO MARTÍNEZ (1) Grupos Facebook (1) Harvard (29) Historia de las computadoras (11) HTML5 y CSS3 - Autor: Christophe Aubry (99) HTML5 y CSS3 aplicadal texto (7) HTML5 y CSS3 para los formularios (15) Imágenes (2) Implementación de Windows 7 (11) Información (31) Informática (29) Ingeniería (4) Instalar (29) Inteligencia (2) Inteligencia de Negocios con SQL Server (3) Intermedio (23) Internet (29) Internet Explorer 9 (3) Introducción a ASP.NET 5 (8) Introducción a Java (7) Introducción a jQuery (8) Introducción a la Auditoría de Sistemas (2) Introducción a la teoría general de sistemas (Oscar Johansen Bertoglio) (39) Introducción a Networking (2) Introducción a Window Forms (5) Introducción al acceso a datos con ADO .NET (9) Investigación de Operaciones (12) Java (52) Jump Start de consultas en las bases de datos de Microsoft SQL Server 2012 (8) La definición de un Sistema (6) La evolución del HTML y del CSS (3) La nueva sintaxis HTML5 (12) LA QUINTA DISCIPLINA en la práctica (Autor : Peter Senge) (28) Las animaciones en CSS3 (5) Las transformaciones CSS3 (11) Las transiciones con CSS3 (8) Licenciamiento Microsoft (3) Local Area Network (LAN) - Red de Area Local (2) Lógico (2) Los elementos de la estructura en html5 (9) Los elementos multimedia: audio y vídeo (2) Los estilos de caja en CSS3 (13) Los nuevos selectores de CSS3 (6) Maestría (2) Mantenimiento de Mouse y Teclado (2) Manual de Microsoft SQL Server - Full Transact SQL (68) Manual de soporte técnico para escuelas sobre windows 7 (42) Marco Teorico de Investigación de Operaciones (6) Medios de Almacenamiento (11) Medios de Networking (2) Mejorando la Interface de las Aplicaciones Windows (26) Memoria Tipos y Clases (5) Método (2) Metodología (1) Microsoft (324) Microsoft Lync 2010 (7) Microsoft Silverlight 4.0 (2) Microsoft Virtual Academy (356) Modelo (2) Modelo OSI y TCP-IP (2) Modelos con poco grado de dificultad de Programación Lineal - Investigación de Operaciones (13) Modelos con razonable grado de dificultad de Programación Lineal - Investigación de Operaciones (10) Modelos de desafio de Programación Lineal - Investigación de Operaciones (5) Modelos difíciles de Programación Lineal - Investigación de Operaciones (5) Modelos Fáciles de Programación Lineal - Investigación de Operaciones (13) Modelos lineales con solver (3) Modulo (23) Movimiento (2) Mozilla (29) MS SQL Server (77) MS Virtualization para Profesionales VMware - Gestión (3) MS Virtualization para Profesionales VMware- Plataforma (4) MVA (263) Negocio (2) Nivel Avanzado Desarrollo .Net (6) Nivel Básico Desarrollo .Net (11) Nivel Intermedio Desarrollo .Net (8) Normas técnicas peruanas y su evolución - Auditoría de Sistemas (1) Nube Privada - Avanzado (6) Nube Privada - Básico (6) Nube Privada - Intermedio (6) Office 365 (3) Optimización de Escritorio (10) Optimización de Escritorio - Avanzado (4) Optimización de Escritorio - Básico (3) Optimización de Escritorio - Intermedio (3) ORACLE 10g - ADMINISTRACIÓN Y ANÁLISIS (3) Oracle 10g y el Grid Computing (3) Organización aleatoria y secuencial (1) Partes principales de la Mainboard (12) Perceptron (2) Perfil (2) Periféricos de Entrada / Salida (15) Pesi (2) PHP y MySQL - Manual de aprendizaje para crear un sitio web - Autor : Olivier ROLLET (79) Plan (2) Plataforma (29) PMBOK (24) PMBOK - Guía de los fundamentos para la dirección de proyectos (24) PMBOK - INFLUENCIA DE LA ORGANIZACIÓN Y CICLO DE VIDA DEL PROYECTO (6) PMBOK - Introducción (11) PMBOK - PROCESOS DE LA DIRECCIÓN DE PROYECTOS (5) Prevención - Herramientas e Instrumentos de Medida (9) Principios básicos de enrutamiento y switching (169) Proceso (2) Proceso de auditoría de sistemas informáticos (2) Programación en Android - Auor : Salvador Gómez Oliver (46) Programación paso a paso de C# - Autor : Nacho Cabanes (16) Protocolos y comunicaciones de red (17) Proyecto (2) Qué es un sistema (4) Red de Área Local Inalámbrica (WLAN) (4) Redes (30) Redes inalámbricas - WIRELESS - Conocimiento general (15) Redes neuronales (2) Redes y Comunicaciones (45) Reparación de Fuentes - UPS - Estabilizadores (10) Reparación de Impresoras (9) Reparación de Monitores (16) Router (29) Seguridad en la Nube (3) Seminario (23) Server (24) Sharepoint 2010 - Nivel Básico (6) Sharepoint 2010 - Niveles Avanzados (18) Sharepoint 2010 - Niveles Avanzados - Básico (8) Sharepoint 2010 - Niveles Avanzados - Intermedio (9) Sinergia y recursividad (4) Sistema (33) Sistema de Cableado Estructurado (9) Software (30) SOLUCIÓN GRÁFICA DE MODELOS DE PROGRAMACIÓN LINEALES - INVOPE (8) Soporte a Infraestructura (3) SQL (38) SQL Azure - Introducción (3) Subsistemas de control (4) Tablas (4) Tarjeta Principal del Sistema (10) Tarjetas de Interfaces (7) Tecnología (31) Tecnologías LAN (1) TEORÍA GENERAL DE SISTEMAS (1) Tic (2) Tipo (2) TML5 y CSS3 - Autor: Christophe Aubry (12) Trabajando con el Formulario (7) Un diseño HTML5/CSS3: dConstruct 2011 (3) Un diseño HTML5/CSS3: FlipThru (2) Un diseño HTML5/CSS3: The Cat Template (2) Usando Controles Windows Forms (12) Usando Herramientas de Datos de Visual Studio (6) Ventas (2) Virtualización Hyper - V Nivel Básico (5) Virtualización Hyper - V Nivel Intermedio (5) What’s New in Windows 8.1 Security (4) Window (29) Windows 7 Segunda Fase - AVANZADO (4) Windows 7 Segunda Fase - BÁSICO (6) Windows 7 Segunda Fase - INTERMEDIO (4) Windows 8 - Vista Previa (4) Windows 8.1 To Go (2) Windows Azure (3) Windows Phone 7 (2) Windows Server 2008 R2 (3) Windows Server 2012 - Gestión y Automatización (3) Windows Server 2012 R2 Essentials (7) Windows Server 2012: Almacenamiento (5) Windows Server 2012: Identidad y Acceso (4) Windows Server 2012: Revisión Técnica (7) Xamarin (1)

Páginas vistas en total según Google