Memoria PFC

6,310 views

Published on

Memoria del Proyecto de Fin de Carrera llamado "LeELa player". Es un reproductor de video programado en Java con JVLC.

Published in: Technology, Education
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,310
On SlideShare
0
From Embeds
0
Number of Embeds
62
Actions
Shares
0
Downloads
1
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Memoria PFC

  1. 1. Ingeniería Informática Escuela Técnica Superior de Ingeniería Informática Curso académico 2008-2009 Proyecto Fin de Carrera LeELa player: Learning English Language Autor: Mario Rodríguez Martín Tutores: Micael Gallego Carrillo y Francisco Gortázar Bellas Junio 2009
  2. 2. Copyright Esta memoria forma parte del Proyecto de Fin de Carrera de la titulación de Ingeniería Informática en la Escuela Técnica Superior de Ingeniería Informática de la Universidad Rey Juan Carlos de Madrid, realizado por Mario Rodríguez Martín en Junio de 2009. ©Copyright 2009, MRM. Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los términos de la licencia “Reconocimiento-Compartir bajo la misma licencia 3.0 España”, proporcionada por CREATIVE COMMONS. Se incluye una copia de la licencia en el apéndice de este documento. 2
  3. 3. A mis padres y mis abuelos 3
  4. 4. - Listen lady, I only speak two languages: English and bad English. Korben Dallas, The fifth element 4
  5. 5. Agradecimientos Me gustaría dar las gracias a mis amigos de dentro y fuera de la Universidad por preocuparse y preguntarme qué tal llevaba el proyecto en todo momento, cuando lo estaba desarrollando. Incluso lo probaron y me dieron algunos consejos para mejorarlo. A XYBeR, por hacer que viera un poco de luz cuando empecé a desarrollar la aplicación y no conseguía hacerla funcionar. Por último y no menos importante, a mi tutor, Micael, por guiarme durante todo el proceso de desarrollo. 5
  6. 6. Resumen Hoy en día se considera completamente necesario conocer un segundo o incluso un tercer idioma, además del nativo, para poder ser competitivo en el campo laboral. Además, también es recomendable comprender otras lenguas si te gusta viajar al extranjero, ya que agradecerás poder comunicarte con facilidad con la gente de allí. Y como el idioma que se considera internacional es el inglés, es imprescindible entenderlo y hablarlo con soltura. Pero aprender otro idioma puede convertirse en un sufrimiento, aparte de que se vuelve cada vez más complicado con el paso los años, y cualquier método que ayude a su estudio de forma eficiente puede ser interesante de llevar a cabo. Por estos motivos se pretende desarrollar una herramienta para que cualquiera pueda mejorar sus idiomas, en especial el inglés. Una vez que se tiene conocimiento de las nociones gramaticales básicas, lo realmente interesante es poner en práctica lo aprendido. Una forma típica es escuchar a personas nativas, y qué mejor manera que hacerlo que de una forma entretenida como recomiendan muchos profesores: viendo películas en versión original subtitulada (VOS). De esta manera uno se acostumbra a escuchar cómo habla la gente de verdad en cualquier situación, como si estuvieras allí mismo. Lo que se consigue es aprender tanto pronunciación como vocabulario o frases hechas. El problema viene que mucha gente no se atreve a ver una película en VOS porque no les apetece estar todo el rato leyendo. Otros, en cambio, la ven, pero sólo dedican atención al texto y olvidan las voces, por lo que no obtienen mucho beneficio. En este punto es cuando se explica la utilidad de la nueva herramienta. Permitiría un control total y a tiempo real de los subtítulos. Podrías activarlos y desactivarlos según te convenga, obligándote a esforzarte en entender lo que dicen. Podrías no tenerlos activados, pero si no comprendes una frase puedes consultarla, e incluso hacer que la repitan. Podrías poner dos pistas de subtítulos a la vez, por ejemplo, español e inglés simultáneamente, para comparar. Además podrías evaluar tu progreso: empezarías viendo una película inglesa con los subtítulos en español, luego con los subtítulos en inglés y finalmente sin subtítulos. La recomendación sería ver películas que se hayan rodado en el idioma que quieras practicar para no tener complicaciones con el doblaje, ya otra ventaja es que aunque la herramienta se centra en el aprendizaje del inglés, el funcionamiento es el mismo si quieres mejorar cualquier otro idioma, bastaría tener una película hablada en dicho idioma y los correspondientes subtítulos. Por último, ya que la herramienta sería un reproductor multimedia, también se puede practicar con canciones. En este caso, la mayoría de las veces las traducciones literales de las letras no tienen mucho sentido, pero aún así es muy útil para mejorar el oído y la pronunciación. Además, hay que tener en cuenta que escuchar un par de canciones es más ligero que ver una película, o que puede llegar a ser bastante entretenido poder aprenderte la letra de tus canciones favoritas. 6
  7. 7. Índice general 1. Introducción 11 1.1. Herramientas relacionadas 11 1.2. Otros reproductores multimedia 16 1.3. Limitaciones encontradas 17 1.4. Características propias 17 2. Metodología 18 2.1. Proceso Unificado (PUD) 18 2.2. Extreme Programming (XP) 20 2.3. Elección de la metodología 21 3. Tecnologías 22 3.1. Lenguaje de programación 22 3.1.1. Orientación a Objetos 22 3.1.2. Java 23 3.2. Librerías de multimedia 24 3.2.1. Java Media Framework (JMF) 24 3.2.2. GStreamer 25 3.2.3. Freedom for Media in Java (FMJ) 26 3.2.4. JVLC 26 3.3. Librerías gráficas 28 3.3.1. Abstract Window Toolkit (AWT) 28 3.3.2. Standard Widget Toolkit (SWT) 28 3.3.3. Java Swing 29 3.3.4. Iconos 30 3.4. Entornos de programación 31 3.4.1. Eclipse y sus plugins 31 3.4.2. NetBeans 32 3.5. Gestión del proyecto 33 3.5.1. Repositorio de versiones 33 3.5.2. SourceForge.net 33 3.5.3 Website 34 7
  8. 8. 3.6. Java Networking Launching Protocol (JNLP) 35 3.7. Subtítulos 36 3.7.1. SubRip: srt 37 3.7.2. Lyrics: lrc 38 4. Descripción informática 39 4.1. Especificación de requisitos 39 4.1.1. Interfaz de usuario 39 4.1.2. Requisitos funcionales 39 4.1.3. Requisitos no funcionales 41 4.2. Diseño 42 4.2.1. Casos de uso 44 4.2.2. Diagrama de clases 48 4.2.3. Descripción de las clases 49 4.2.4. Otros diagramas 51 4.3. Implementación 52 4.4. Pruebas 61 4.5. Uso de la herramienta 63 4.5.1. Ejecutar la aplicación 63 4.5.2. Cargar subtítulos 63 4.5.3. Controles 64 5. Conclusiones y trabajos futuros 69 Bibliografía 70 6. Apéndice 72 6.1. GNU General Public License version 3.0 (GPLv3) 72 6.2. Licencia de Creative Commons 84 8
  9. 9. Índice de figuras 1.1.1 Portadas de la revista Speak Up 11 1.1.2 ABAEnglish 2.0 12 1.1.3 Buensoft Inglés 2004 13 1.1.4 Before You Know It 14 1.1.5 Speaking Hangman 0.2.0 15 2.1.1 Estructura del PUD 19 2.2.1 Prácticas de XP 21 3.2.1.1 Interfaz de JM Studio 24 3.2.2.1 Logo de GStreamer 25 3.2.2.1 Flujo para un reproductor ogg básico 25 3.2.3.1 FMJ: Freedom for Media in Java 26 3.2.4.1 Interfaz de VLC media player 26 3.2.4.2 Logo de VideoLAN 27 3.3.3.1 El menú de la izquierda es tapado por el botón 29 3.3.3.2 El menú de la izquierda no es tapado por el botón 30 3.3.4.1 Set de iconos 30 3.3.4.2 Logo de GIMP 30 3.3.4.3 Logo diseñado con GIMP 30 3.4.1.1 Eclipse Ganymede 31 3.4.2.1 NetBeans IDE 6.5 32 3.5.3.1 Página de inicio del website 34 3.6.1 Archivo para probar JNLP 35 3.7.1.1 Diálogos en formato .srt 37 3.7.2.1 Letra de canción en formato .lrc 38 4.2.1 Relación Áreas - Vistas 43 4.2.2 JUDE: UML modeling tool 43 4.2.1.1 Diagrama de casos de uso 44 4.2.2.1 Diagrama de clases 48 4.2.4.1 Diagrama de secuencia 51 4.5.3.1 Interfaz completa 64 9
  10. 10. 4.5.3.2 Menú “Archivo” 65 4.5.3.3 Menú “Reproducción” 66 4.5.3.4 Menú “Subtítulos” 67 4.5.3.5 Menú “Ayuda” 68 10
  11. 11. 1. INTRODUCCIÓN 1. Introducción El objetivo de este proyecto construir un reproductor de vídeo con el que se pueda aprender inglés gracias a los subtítulos. Para definir la funcionalidad de la aplicación se han instalado y probado algunos productos ya existentes. 1.1. Herramientas relacionadas A continuación se pasará a describir algunas aplicaciones que son utilizadas para aprender inglés mediante diferentes métodos. Speak Up Quizás represente el método para aprender inglés más similar al que va a emplear la herramienta que se pretende desarrollar, aunque no se trate de una aplicación informática. Speak Up [1] es una revista mensual, que lleva más de 20 años en los kioskos, escrita en inglés y con unos 83.000 lectores en España. Suele estar acompañada con un CD con audio donde se puede escuchar algunos de los artículos o entrevistas publicadas. Pero lo que más nos interesa no son los artículos, sino las películas. Con cada número viene una película en versión original. En un principio era una cinta VHS en VOS, lo que limitaba las posibilidades durante la reproducción. En la actualidad se adjunta un DVD, con lo que hay más opciones durante el visionado de la película. En la figura 1.1.1 se pueden observar algunas portadas recientes. Figura 1.1.1: Portadas de la revista Speak Up. 11
  12. 12. 1. INTRODUCCIÓN Curso de Inglés ABAEnglish 2.0 El curso de Inglés ABAEnglish [2] permite elegir entre 6 niveles de dificultad: Beginners (principiantes), Lower intermediate (intermedio-bajo), Intermediate (intermedio), Upper intermediate (intermedio-alto), Advanced (avanzado) y Business (negocios), cada uno de los cuales dispone de 24 unidades. Sólo la primera unidad del primer nivel está disponible en la versión gratuita. Para saber tu nivel se dispone de un test on-line gratuito con el que se pueden evaluar tus conocimientos de gramática y compresión oral y escrita. Se puede practicar vocabulario, gramática, ortografía, pronunciación, etc. Cada unidad incluye un vídeo animado de una situación típica que puede ocurrir en la vida real. El vídeo contiene subtítulos en inglés y en español, pero no se pueden usar simultáneamente. También se puede acceder sólo al audio del vídeo, para escuchar las frases por separado y repetirlas todas las veces que quieras. En la figura 1.1.2 se pueden ver dos ejercicios de la primera unidad. Figura 1.1.2: ABAEnglish 2.0. 12
  13. 13. 1. INTRODUCCIÓN Buensoft Inglés 2004 Buensoft Inglés 2004 [3] propone un método que intenta que el aprendizaje del inglés se realice de forma amena y entretenida. Funciona mediante módulos que se descargan desde su página web. La versión gratuita es limitada, pero se puede ampliar a la versión básica a través de un registro. También tienes la opción de comprar más unidades separadas en los niveles 1, 2 y 3 o actualizar las que ya tengas. Puedes elegir palabras o frases en español y te aparece una ventana con la traducción y el audio con la pronunciación. Dispone de un administrador de usuarios, por lo que pueden usarlo varias personas y se guardan los progresos por separado. Tiene juegos como El ahorcado, Space Invaders, Snake, encontrar parejas o ejercicios de mecanografía. Se muestra algún ejemplo en la figura 1.1.3. Figura 1.1.3: Buensoft Inglés 2004. 13
  14. 14. 1. INTRODUCCIÓN Before You Know It 3.5 Before You Know It [4] es muy práctico para aprender vocabulario y pronunciación de forma eficiente, porque usa listas de palabras relacionadas con ciertos campos lingüísticos y expresiones características en determinados ámbitos. La versión gratuita no tiene periodo de expiración. La versión de pago proporciona muchas más expresiones, además de otras funciones como editar tus propias frases para luego poder compartirlas con otros usuarios. Su método consiste en que dispone de un sistema de fichas para repasar lo aprendido. Estas fichas se agrupan por temas, como se observa en la figura 1.1.4. Una peculiaridad es que puedes ralentizar la velocidad del audio con la pronunciación. Figura 1.1.4: Before You Know It. 14
  15. 15. 1. INTRODUCCIÓN Speaking Hangman 0.2.0 Speaking Hangman [5] está programado en Java. Sirve para jugar a El ahorcado con palabras en inglés y español. Proporciona tres niveles de dificultad, basándose en estadísticas sobre las palabras más usadas comúnmente. En las versiones gratuitas del nivel 1 (Basic) puedes practicar con más de 450 palabras, mientras que el nivel 2 (Intermediate) tiene unas 1.000 palabras. El nivel 3 (Advanced) sólo está disponible en la versión CD y viene con más de 7.000 palabras en inglés y español. Puedes escuchar la pronunciación en inglés y consultar su traducción mediante un enlace a WordReference [6], que proporciona un diccionario gratuito on-line muy bien valorado por los internautas. Por sus características es adecuado para aprender vocabulario, pero no gramática. En la figura 1.1.5 se puede ver que su interfaz es bastante sencilla. Figura 1.1.5: Speaking Hangman 0.2.0. 15
  16. 16. 1. INTRODUCCIÓN 1.2. Otros reproductores multimedia A continuación se enumerarán los reproductores multimedia más populares hoy en día, así como algunas de sus características más destacables. Todos ellos se distribuyen gratuitamente y proporcionan las descargas de sus instaladores desde sus respectivos sitios webs oficiales. - Windows Media Player [7]: Con un diseño sencillo ofrece nuevas formas de organizar archivos de música, vídeos, imágenes y grabaciones de TV. Permite sincronizaciones con equipos portátiles para poder ejecutarlo desde diferentes localizaciones. - VLC media player [8]: Es considerado por la mayoría como el mejor reproductor multimedia actualmente. Viene con un conjunto de códecs propio que permiten reproducir cualquier archivo. Tiene una interfaz simple, que complementa con opciones avanzadas como streaming para enviar señales a través de Internet, controles útiles como seleccionar entre las diversas pistas de audio de los vídeos que tengan más de una, y la posibilidad de abrir archivos incompletos. - QuickTime Player [9]: Reproductor de archivos con extensión .mov, el formato de video estándar de Apple. Acepta resoluciones muy altas, por lo que la calidad de imagen es superior comparada con otros formatos. También requiere un mayor uso del procesador. - BS.Player [10]: Reproductor muy fiable para archivos DivX. Posee todas las características básicas: multilingüe, lista con los últimos vídeos, interfaz customizable, soporte para vídeos duales, etc. Permite capturar cualquier frame con una gran calidad. Existe la opción de mantener dos pistas de subtítulos al mismo tiempo: primarios y secundarios, pero los secundarios no se refrescan correctamente. - FLV Player [11]: Proporciona los controles necesarios para reproducir vídeos desarrollados con la tecnología de Adobe Flash Video (.flv) sin necesidad de cargarlos desde el servidor. - GOM Media Player [12]: Evita tener que instalar códecs por separado porque incluye la mayoría que existen, y además te permite elegir entre los que tengas instalados anteriormente. Sus ventajas son que permite la reproducción de archivos .avi dañados o incompletos, y la opción de elegir entre tres modos de visualización: normal, alta calidad y modo TV. - Media Player Classic Homecinema [13]: Es el sucesor del Media Player Classic. Incluye mejoras como eliminar el efecto tearing (perder la sincronía entre la tarjeta gráfica y el monitor), añadir nuevos códecs o soportar renderizado EVR. Entre sus características destaca la posibilidad de reproducir un vídeo con el audio de otro archivo diferente. - Winamp [14]: Reproductor muy funcional en el que destaca su aspecto visual, personalizable mediante máscaras, con todas las opciones siempre visibles: ecualizador, biblioteca, lista de reproducción, etc. Reproduce cualquier archivo multimedia si están instalados los códecs correspondientes. Con Winamp Remote se puede acceder a bibliotecas remotas desde un ordenador conectado a Internet. 16
  17. 17. 1. INTRODUCCIÓN 1.3. Limitaciones encontradas Las principales limitaciones encontradas en las herramientas analizadas han sido que se limitan mucho a conceptos teóricos, como el estudio de la gramática, o a pronunciación de palabras sueltas para aprender vocabulario. Pero lo que se pretende es aprender y mejorar el inglés a través de situaciones y conversaciones más realistas, como las que ocurren en una película. No interesa repetir una y otra vez la misma frase o expresión, sino escuchar una conversación, esforzarse por entenderla y sólo en última instancia repetir o consultar lo que han dicho. En el caso de los reproductores multimedia tradicionales, no existe la opción de poder repetir la última frase o mantener 2 pistas de subtítulos al mismo tiempo. Sólo BS.Player acepta subtítulos primarios y secundarios. 1.4. Características propias El objetivo principal del proyecto es desarrollar un reproductor de archivos de vídeo, por lo que los requisitos básicos son que incluya los controles necesarios para abrir los archivos multimedia disponibles en el ordenador y realizar las acciones comunes sobre ellos, como parar o pausar la reproducción, avanzar y retroceder, subir y bajar el volumen, ver y controlar el progreso del tiempo, etc. Todas estas posibilidades se deben realizar a través de una interfaz gráfica lo más simple e intuitiva posible. Las características propias principales de la aplicación serán las relativas al manejo de los subtítulos. Existirán las opciones de repetir y/o consultar una frase cuando no la entiendas, así como poder ver simultáneamente 2 pistas de subtítulos sincronizadas, una con la traducción de la otra. Además, debido al tipo de herramienta (un reproductor multimedia), no se acabarán nunca las lecciones. Basta con que consigas un archivo de vídeo de una película, en el idioma que quieras practicar, con el formato adecuado y los correspondientes archivos de texto con los subtítulos. 17
  18. 18. 2. METODOLOGÍA 2. Metodología Cada proyecto software tiene características diferentes al resto y por ello es necesario adaptar la metodología, también el llamada proceso de desarrollo software, adaptada a su complejidad. Esta metodología indica la serie de tares que se deben realizar entre la idea inicial t el resultado final deseado. Para la realización de este proyecto se ha elegido el desarrollo denominado Extreme Programming (XP) o Programación Extrema, que se comentará en el apartado 2.2. Antes se explicarán los conceptos más significativos del Proceso Unificado de Desarrollo (PUD) en el apartado 2.1, para que se puedan observar las diferencias entre dos de las metodologías más empleadas en la actualidad y opuestas entre sí. 2.1. Proceso Unificado (PUD) El Proceso Unificado de Desarrollo [15] reúne las tres metodologías de desarrollo basadas en el paradigma de la orientación a objetos: OOSE: Object Oriented Software Engineering, Ivar Jacobson (Casos de Uso). OMT: Object Modeling Technique, James Rumbaugh, (Análisis). Booch, Grady Booch (Diseño). Está basado en componentes, lo que quiere decir que el sistema software en construcción está formado por componentes software interconectados a través de interfaces bien definidos. Utiliza el lenguaje UML para expresar gráficamente todos los diagramas que definen el sistema del software. Los aspectos que caracterizan al Proceso Unificado son tres: • Dirigido por Casos de Uso: Una interacción con el usuario es un caso de uso, que captura los requisitos funcionales. Conducen el proceso de desarrollo mediante modelos de diseño e implementación, creados por los desarrolladores, y mediante pruebas. Además estos modelos evolucionan junto a la arquitectura del sistema y se validan para que sean conformes a los casos de uso. • Centrado en la arquitectura: El concepto de arquitectura software incluye los aspectos estáticos y dinámicos más significativos del sistema, tales como: plataforma (BBDD, SO, protocolo de comunicación,...), aspectos legales, componentes reutilizables disponibles, requisitos no funcionales, etc. Es una vista del diseño completo que hace visibles las características principales. • Iterativo e incremental: Todo sistema informático es complejo y suele durar desde meses hasta años. Por lo que lo más eficiente es dividir el proyecto en pequeñas fases. Al terminar cada fase hay que revisarla y probarla. Las fases se dividen en iteraciones, y cada iteración se basa en la anterior, por lo que se produce un incremento, que no siempre es aditivo. 18
  19. 19. 2. METODOLOGÍA El ciclo de vida del software se divide en 4 fases, cada una de las cuales tiene varias iteraciones. Una iteración representa un ciclo de desarrollo completo que consta de: requisitos, análisis, diseño, implementación y pruebas. El énfasis en cada flujo de trabajo es diferente dependiendo de la fase en que se encuentre. Las fases son: concepción, elaboración, construcción y transición. La concepción es definir el alcance del proyecto, definir los casos de uso y analizar los riesgos. La elaboración es proyectar un plan, definir las características y cimentar la arquitectura. La construcción es crear el producto y la transición es transferir el producto a sus usuarios. En la figura 2.1.1 se puede ver gráficamente la estructura y la distribución del flujo de trabajo. Figura 2.1.1: Estructura del PUD. 19
  20. 20. 2. METODOLOGÍA 2.2. Extreme Programming (XP) La Programación Extrema o Extreme Programing (XP) [16] es una de las llamadas “Metodologías Ágiles" de desarrollo de software más populares hoy en día. Inicialmente fue descrita por Kent Beck cuando trabajaba en la Chrysler Corporation. En la XP se da por supuesto que no se puede prever todo antes de empezar a codificar, que es imposible capturar todos los requisitos del sistema, ni saber qué es todo lo que tiene que hacer, ni hacer un diseño correcto al principio. La idea principal de esta metodología consiste en trabajar estrechamente con el cliente, haciéndole pequeñas versiones frecuentemente. El objetivo de estas versiones es conseguir que funcione de la forma más simple y con el mínimo código. Cuando el cliente le transmite al programador lo que quiere, el programador puede hacer una estimación del tiempo que va a tardar, pero, lógicamente, la planificación deberá revisarse y modificarse continuamente a lo largo del proyecto. Cada vez que se consigue codificar y que funcione una versión de usuario, se le muestra al cliente para la pruebe y añada las posibles modificaciones que crea convenientes. De esta forma se evita perder tiempo desarrollando una aplicación que no sea la que el cliente esperaba. Este ciclo se va repitiendo una y otra vez hasta que el cliente se de por satisfecho y cierre el proyecto. La Programación Extrema agrupa 13 prácticas básicas que se deben cumplir para asegurar el éxito del proyecto. Se pueden ver los nombres originales en la figura 2.2.1: 1. Equipo completo 2. Planificación continua 3. Test del cliente 4. Versiones pequeñas 5. Diseño simple 6. Programación por parejas 7. Desarrollo guiado por pruebas automáticas 8. Mejora continua del diseño 9. Integración continua 10. El código es de todos 11. Normas de codificación comunes 12. Utilizar metáforas 13. Mantener un ritmo sostenible. 20
  21. 21. 2. METODOLOGÍA Figura 2.2.1: Prácticas de XP. La Programación Extrema consta de unos valores, unos principios fundamentales y unas prácticas. Los principios fundamentales en los que se basa son: • Feedback: Retroalimentación veloz. • Modificaciones incrementales. • Refactorización: Trabajo de calidad. • Asunción de simplicidad. • Respeto: Comunicación entre desarrolladores. 2.3. Elección de la metodología Se ha preferido la Programación Extrema como metodología para seguir durante este proyecto porque va a ser desarrollado por una sola persona, y con una duración aproximada de 150 horas (el PFC equivale a 15 créditos). Por las características prácticas de la aplicación es recomendable que el cliente, en este caso tutor, pueda probar la aplicación funcionando desde el comienzo, para que guíe al programador, le aconseje por dónde debe continuar y corrija los errores con la máxima rapidez posible. 21
  22. 22. 3. TECNOLOGÍAS 3. Tecnologías 3.1. Lenguaje de programación Uno de los requisitos que se proponía en el enunciado del PFC era que la aplicación se debía programar en el lenguaje Java, que en este caso se ha compilado bajo la plataforma Java Standard Edition (J2SE) con la versión JDK 6. Java pertenece al paradigma de la programación orientada a objetos (OO). A continuación se explicarán los principios básicos de la OO, así como las características propias del lenguaje Java. 3.1.1. Orientación a Objetos La programación orientada a objetos [17] es más moderna que la programación secuencial y que la programación imperativa. Consiste en una manera más intuitiva de programar gracias a que proporciona conceptos y herramientas para modelar y representar el mundo real. La programación OO maneja una serie de conceptos básicos: • Clase: Descripción mediante una abstracción de los datos (atributos) y de las operaciones (métodos) que describen el comportamiento de un cierto conjunto de elementos homogéneos, cuyas características comunes sirven para crear en el dominio de la computadora un reflejo del mundo real. Las clases asumen el principio de encapsulación: vista pública o interfaz (operaciones a las que responden los objetos de la clase) y vista privada o implementación (datos y manipulaciones sobre esos datos). • Objeto: Agrupa datos más procesos. Tiene un enfoque antropomórfico (orientado al hombre). Representa un ejemplar concreto (instancia) de una clase que responde al comportamiento, definido por los métodos de la clase a la que pertenece, adecuándose al estado de los atributos de la clase a la que pertenece. • Mensaje: Invocación de una operación sobre un objeto. • Atributo: Cada uno de los datos de una clase. • Método: Definición de una operación sobre un objeto o servicio que proporciona una clase. • Estado: conjunto de los valores de los atributos que tiene un objeto, por pertenecer a una clase, en un instante dado. • Herencia: Transmisión de la vista pública (métodos públicos) y de la vista privada (atributos, métodos privados y definición de los métodos) de una clase (padre) a otra (hija), la cual puede extenderse. • Polimorfismo: Posibilidad de asignar un objeto a una referencia de la misma clase o de cualquiera de las clases base. Su comportamiento vendrá determinado por la clase que se instancia, no por la referencia utilizada. 22
  23. 23. 3. TECNOLOGÍAS La programación OO sin herencia ni polimorfismo se denomina Programación Basada en Objetos. Además la programación OO cumple totalmente las bases de la programación: • Abstracción: Proceso mental de extracción de las características esenciales de algo, ignorando los detalles superfluos. • Encapsulación: Proceso por el que se ocultan los detalles del soporte de las características de una abstracción. • Modularidad: Proceso de descomposición de un sistema en un conjunto de módulos débilmente acoplados (independientes) y altamente cohesivos. • Jerarquía (de clasificación): Proceso de estructuración por el que se produce una organización de un conjunto de elementos en grados o niveles de responsabilidad, de incumbencia o de composición, entre otros. 3.1.2. Java Java [18] es un lenguaje de programación orientado a objetos desarrollado por Sun Microsystems a principios de los años 90. Tiene una sintaxis basada en C y C++, pero con un modelo de objetos más simple. Aumenta la seguridad gracias a que elimina herramientas de bajo nivel que suelen inducir a muchos errores, como la manipulación directa de punteros, o la gestión dinámica de memoria, que se evita con el recolector de basura (automatic garbage collector): el programador determina cuándo se crean los objetos, pero es el entorno en tiempo de ejecución (Java runtime) el responsable de gestionar el ciclo de vida de estos objetos y liberar la memoria. Es un lenguaje fuertemente tipado y que se considera robusto porque realiza verificaciones tanto en tiempo de ejecución como en tiempo de compilación. Una característica muy relevante es la independencia de la plataforma, lo que provoca que las aplicaciones sean portables. Significa que programas escritos en el lenguaje Java pueden ejecutarse igualmente en cualquier tipo de hardware, tal como reza el axioma de Java: “Write once, run everywhere”. Para ello, se compila el código fuente escrito en lenguaje Java, para generar un código conocido como bytecode: instrucciones máquina simplificadas específicas de la plataforma Java. Esta pieza se considera que está entre el código fuente y el código máquina que entiende el dispositivo destino. El bytecode es ejecutado entonces en la máquina virtual (JVM), un programa escrito en código nativo de la plataforma destino (que es el que entiende su hardware), que ejecuta el código. Se debe tener presente que, aunque hay una etapa explícita de compilación, el bytecode generado es interpretado o convertido a instrucciones máquina del código nativo por el compilador JIT (Just In Time). Además, se suministran bibliotecas adicionales para acceder a las características de cada dispositivo (como los gráficos, ejecución mediante threads, la interfaz de red, etc.) de forma unificada. Sun Microsystems liberó la mayor parte de sus tecnologías Java bajo la licencia GNU GPL, de acuerdo con las especificaciones del Java Community Process, de tal forma que prácticamente todo el Java de Sun es ahora software libre, al igual que la biblioteca de clases de Sun que se requiere para ejecutar los programas. 23
  24. 24. 3. TECNOLOGÍAS 3.2. Librerías de multimedia Se consultaron y probaron las 4 principales librerías que permiten trabajar con material multimedia, para poder comparar y decidir cuál sería la más adecuada para desarrollar la herramienta. A continuación se describen las características principales de cada una de ellas y el porqué se descartaron o no. 3.2.1. Java Media Framework (JMF) Java Media Framework [19] proporciona herramientas para la captura, procesamiento y almacenamiento de datos multimedia. La API de JMF permite añadir a aplicaciones y applets construidos con la tecnología de Java audio, vídeo y demás elementos multimedia. En un principio, este paquete opcional, con el que se puede capturar, grabar (de un micrófono o una cámara de vídeo), distribuir y codificar múltiples formatos de audio y vídeo, extiende la plataforma estándar de Java (J2SE) proveyendo a los desarrolladores de multimedia un conjunto de herramientas para desarrollar una tecnología escalable y multi-plataforma. Entre sus características se pueden destacar: estabilidad debida a que funciona sobre la máquina virtual Java (JVM), sencillez en cuanto a los comandos necesarios para realizar complejas tareas multimedia, y que permite la manipulación de elementos multimedia de vídeo y audio locales, así como la retransmisión y recepción en tiempo real de flujos (streaming) de vídeo y audio a través de la red mediante el protocolo RTP (Real-time Transport Protocol). Al instalar la librería, se proporciona un sencillo reproductor multimedia llamado JM Studio, que se muestra en la figura 3.2.1.1 Pero la realidad es que Sun Microsystems dejó de apoyar este proyecto. La última versión, la 2.1.1e, no ha evolucionado desde el año 2003, por lo que se ve incapaz de reproducir la mayoría de los archivos actuales por problemas con los códecs. Figura 3.2.1.1: Interfaz de JM Studio. 24
  25. 25. 3. TECNOLOGÍAS 3.2.2. GStreamer Gstreamer [20] es un framework libre multiplataforma, escrito en C usando la biblioteca GObject, para construir componentes gráficos que manejan archivos multimedia. Estas aplicaciones soportan desde sencillas grabaciones Ogg/Vorbis y flujos de audio y vídeo hasta complejas mezclas de sonido y edición y procesamiento no lineal de vídeo. Las aplicaciones tienen la ventaja de obtener mejoras y nuevas funcionalidades que surjan en relación a la tecnología de códecs y filtros de forma transparente. Los desarrolladores pueden añadir nuevos códecs y filtros escribiendo un sencillo plugin con una interfaz clara y genérica, que podrá ser cargado dinámicamente. Dispone de una documentación muy elaborada, en la que se explican todos pasos para programar cualquier servicio de este tipo, incluyendo código de ejemplo y gráficos explicativos de cómo se conectan los diferentes componentes, como se puede ver en la figura 3.2.2.2. El acceso a la librería se puede realizar desde varios lenguajes de programación, como: C, Python, Perl o Ruby. Sin embargo, tanto como para Java como para .NET o C++ se encuentra en desarrollo, por lo que se descartó implementar la aplicación con este framework, a pesar de sus múltiples posibilidades. Para ver un ejemplo de GStreamer en ejecución se puede utilizar la herramienta gst-launch-x.xx, donde x.xx se refiere a la versión correspondiente. Figura 3.2.2.1: Logo de GStreamer. Figura 3.2.2.2: Flujo para un reproductor ogg básico. 25
  26. 26. 3. TECNOLOGÍAS 3.2.3. Freedom for Media in Java (FMJ) FMJ [21] es un proyecto de código abierto con el objetivo de crear una alternativa a Java Media Framework, pero manteniendo una API compatible con JMF. Pretende producir un sencillo API/Framework que pueda ser usado para capturar, grabar, procesar y distribuir contenido audiovisual a través de múltiples plataformas. Sin embargo, y aunque el sitio web proporciona mucha documentación del código en formato javadoc, no es fácil encontrar aplicaciones desarrolladas con este proyecto, que apenas avanza desde finales del año 2007. Se puede ver la cabecera del sitio web en la figura 3.2.3.1. Figura 3.2.3.1: FMJ: Freedom for Media in Java. 3.2.4. JVLC VideoLAN [22] es un proyecto software que produce código libre y abierto para vídeo, hecho público bajo la Licencia de Documentación Libre GNU. Empezó como un proyecto de un estudiante del “École Centrale Paris” y ahora tiene desarrolladores en más de 20 países. Su principal producto software es el reproductor multi-plataforma VLC media player, aunque también gestionan varios proyectos más. Sus proyectos están en continua evolución, corrigiendo errores y añadiendo nuevas prestaciones. VLC media player es un reproductor multimedia, altamente portable, que soporta diversos formatos de audio y vídeo (MPEG-1, MPEG-2, MPEG-4, divX, mp3, ogg, etc.), además de DVD’s, VCD’s y varios protocolos de streaming. También puede ser usado como servidor de flujo de datos audiovisuales en unicast o multicast sobre IPv4 o IPv6 en una red con elevado ancho de banda. No necesita ningún códec o programa externo para funcionar. En la figura 3.2.4.1 se puede observar que su interfaz es bastante completa en cuanto a opciones y menús disponibles. Figura 3.2.4.1: Interfaz de VLC media player. 26
  27. 27. 3. TECNOLOGÍAS JVLC representa las librerías que proporciona el proyecto VideoLAN para trabajar en aplicaciones programadas con Java que quieran usar las posibilidades que ofrece la tecnología VLC. Mi experiencia personal me asegura que el VLC media player es un reproductor muy fiable, que reconoce gran cantidad de formatos y no suele dar problemas con los códecs, además de implementar todas las funciones básicas que necesitaba para mi proyecto, así como otras no tan sencillas como es la selección de la pista de audio en archivos de vídeo duales. Aunque la documentación es mejorable, hay que destacar la existencia de un foro, muy bien administrado, para resolver problemas y dudas. Como curiosidad decir que el sitio web oficial estuvo caído unos días (por suerte, en esas fechas ya había acabado prácticamente la aplicación) tras sufrir un ataque malintencionado. Debido a todas las ventajas que ofrecía y a que al poco de comenzar a desarrollar la aplicación, con un poco de código, conseguí reproducir vídeo, elegí esta tecnología para crear la herramienta. Figura 3.2.4.2: Logo de VideoLAN. En lo referente a las versiones, se comenzó con la 0.9.2. Posteriormente, se actualizó a la 0.9.6, y ahora la aplicación que se puede descargar funciona bajo la versión 0.9.9. Con esto se demuestra la evolución continua de esta librería. VLC media player no es el único proyecto actualmente en desarrollo para VideoLAN. Algunos de los proyectos más destacados son: libdvdcss (una librería programada en C para acceder a DVD’s sin preocuparse por el descifrado), VLC Skin Editor (una aplicación para diseñar máscaras que personalicen el VLC media player) o x264 (una librería para codificar flujos de vídeo H264/AVC). 27
  28. 28. 3. TECNOLOGÍAS 3.3. Librerías gráficas Debido al carácter didáctico de la aplicación, que está dirigida a cualquier tipo de usuario, el diseño de la interfaz gráfica de usuario (GUI) tiene mucha importancia y su uso ha de ser sencillo e intuitivo. Para crear la GUI se han combinado algunos componentes y eventos de la librería AWT con otros de Java Swing. A continuación se explican las características de estas librerías, junto con las de SWT. 3.3.1. Abstract Window Toolkit (AWT) Abstract Window Toolkit (AWT) [23] es una librería original de Java, independiente de la plataforma, que proporciona un kit de herramientas para gestionar el sistema de ventanas, gráficos e interfaces de usuario. Forma parte de la versión J2SE, y es comúnmente usada en la implementación de dispositivos móviles (J2ME). AWT suministra un nivel de abstracción muy fino sobre la interfaz de usuario nativa subyacente. Por ejemplo, al crear un checkbox con AWT se provoca que AWT llame directamente a la subrutina nativa subyacente que crea un checkbox. Sin embargo, un checkbox en un sistema operativo determinado no tiene ni el mismo comportamiento ni apariencia que en cualquier otro. Un programa cuya GUI está programada usando AWT parece una aplicación nativa del sistema operativo en el que se ejecuta. La ventaja de este modelo es que suministra un alto grado de fidelidad al kit de herramientas nativo subyacente y mejor integración con las aplicaciones nativas. El inconveniente es que las aplicaciones no se ven exactamente igual en todas las plataformas. Se ha usado esta librería principalmente para crear la barra de menú con sus opciones y los gestores de eventos de los botones. 3.3.2. Standard Widget Toolkit (SWT) Standard Widget Toolkit (SWT) [24] es un kit de herramientas gráficas para trabajar bajo la plataforma de Java. En un principio, fue desarrollado por IBM y ahora es mantenido por la organización Eclipse. Está diseñado para proporcionar un acceso eficiente, portable y sencillo a interfaces gráficas de usuario adecuadas al sistema operativo en el que están implementadas. Recupera la idea original de la biblioteca AWT de utilizar componentes nativos, con lo que adopta un estilo más consistente en todas las plataformas, pero evita caer en las limitaciones de ésta. Esto la diferencia de la biblioteca Swing, que está codificada enteramente en Java y tiene el inconveniente de no ofrecer una experiencia idéntica a la de una aplicación nativa. Sin embargo, el precio a pagar por esa mejora es la dependencia, a nivel de aspecto visual y no de interfaz de programación, de la aplicación resultante del sistema operativo sobre el cual se ejecuta. Para visualizar los elementos de la GUI, la implementación SWT accede a las librerías nativas de la GUI del sistema operativo usando JNI (Java Native Interface), de una manera similar a la que esos programas usan las API’s específicas de los sistemas operativos. Los programas que usan SWT son portables, pero la implementación del kit de herramientas, a pesar de estar escrita en Java, es diferente para cada plataforma. El kit de herramientas está bajo la licencia de Licencia Pública de Eclipse, como Iniciativa de Código Abierto de acuerdo con la licencia código abierto. 28
  29. 29. 3. TECNOLOGÍAS 3.3.3. Java Swing Swing [25] es una biblioteca gráfica para Java. Incluye la mayoría de los widgets necesarios en una GUI, tales como cajas de texto, botones, desplegables, menú, tablas, etc. Surgió a raíz de los problemas que provocaba la librería AWT, cuyo comportamiento de los controles varía mucho de un sistema a otro y se vuelve muy difícil construir aplicaciones portables. Con Java Swing se consigue que las aplicaciones tengan el mismo comportamiento independientemente de la plataforma en la que se ejecuten. Es muy importante comprender el hecho de que Swing es una extensión del AWT, y no un sustituto encaminado a reemplazarlo. Sigue un simple modelo de programación por hilos, sus componentes se consideran ligeros y posee las siguientes características principales: • Independencia de plataforma. • Extensibilidad. Es una arquitectura altamente modulada: los usuarios pueden proveer sus propias implementaciones modificadas para sobrescribir las implementaciones por defecto, y así extender clases existentes proveyendo alternativas de implementación para elementos esenciales. • Orientada a componentes. • Customizable: El desarrollador puede configurar a su gusto todos los parámetros de los componentes (bordes, colores, tamaños, márgenes, decoración,…). A partir de Java 6 Update 12 se permite mezclar componentes Swing con elementos AWT sin que haya efectos no deseados [26]. Anteriormente, los elementos AWT aparecían siempre por encima de los componentes Swing, ignorando la ordenada Z. Este problema se debía a que interpretación de la arquitectura de las dos librerías era muy diferente, ya que AWT proporciona componentes pesados o heavyweight (por ser nativos), mientras que los componentes de Swing se consideran ligeros o lightweight. Se puede ver un ejemplo comparativo en las figuras 3.3.3.1, antes de Java 6 u12, y 3.3.3.2, con las mejoras que incluye Java 6 u12. El menú de la izquierda es Swing, y el de la derecha y el botón son AWT. Figura 3.3.3.1: El menú de la izquierda es tapado por el botón. 29
  30. 30. 3. TECNOLOGÍAS Figura 3.3.3.2: El menú de la izquierda no es tapado por el botón. 3.3.4. Iconos Para que el uso de los botones de la interfaz gráfica sea más intuitivo se han utilizado iconos con símbolos mundialmente conocidos y cuya interpretación se considera obvia. Estos iconos [27] se pueden ver en la figura 3.3.4.1. Figura 3.3.4.1: Set de iconos. El logo del programa, que también se usará como icono en la interfaz de la aplicación, se ha diseñado con GIMP 2.6 (GNU Image Manipulation Program) [28], que es un programa libre y gratuito para la edición de imágenes digitales, muy potente y que acepta multitud de formatos: .jpg, .gif, .png, .ico, .bmp, .eps, etc. Se puede ver el resultado final en la figura 3.3.4.3. Figura 3.3.4.2: Logo de GIMP. Figura 3.3.4.3: Logo diseñado con GIMP. 30
  31. 31. 3. TECNOLOGÍAS 3.4. Entornos de programación Todo proyecto de desarrollo software necesita un entorno donde escribir, compilar, depurar y ejecutar el código. Este proyecto Java, en un principio, se comenzó en el entorno de Eclipse, pero más tarde se pasó a desarrollar en NetBeans por problemas al importar las librerías y los plugins necesarios para el correcto funcionamiento de la biblioteca JVLC. 3.4.1. Eclipse y sus plugins Eclipse [29] es una comunidad de código abierto, cuyos proyectos se centran en construir un entorno de desarrollo integrado (IDE) compuesto de librerías, herramientas y compiladores extensibles para construir, desarrollar y mantener el software durante su ciclo de vida. La Fundación Eclipse es una organización sin ánimo de lucro mantenida por sus miembros que hospeda los proyectos de Eclipse y ayuda a mantener en una comunidad abierta un ecosistema de productos y servicios complementarios. Para realizar las primeras pruebas con código se empleó la versión Ganymede (equivalente a la 3.4), que incluye, entre otras funcionalidades: editor de texto, resaltado de sintaxis, compilación en tiempo real, pruebas unitarias con JUnit, control de versiones con CVS e integración con Ant. Por otro lado, se requería la instalación de un par de plugins: • Subversive [30]: Para el control de versiones se prefirió usar un repositorio de Subversion (SVN) en lugar del CVS. • CheckStyle [31]: Para que el código cumpliera las reglas de estilo era recomendable tener un chequeador de código. Figura 3.4.1.1: Eclipse Ganymede. 31
  32. 32. 3. TECNOLOGÍAS 3.4.2. NetBeans NetBeans [32] es un IDE gratuito y de código abierto, programado en Java, para desarrolladores de software. Proporciona las herramientas necesarias para crear aplicaciones para profesionales, empresas, dispositivos móviles, webs y de escritorio, escritas en Java, C/C++, e incluso lenguajes interpretados como PHP, JavaScript, Groovy y Ruby. NetBeans permite que las aplicaciones sean desarrolladas a partir de un conjunto de componentes llamados módulos. Un módulo es un archivo Java que contiene clases para interactuar con las API’s de NetBeans y un archivo llamado manifest file que lo identifica como módulo. Debido a que los módulos pueden ser desarrollados independientemente, las aplicaciones basadas en esta plataforma pueden ser extendidas fácilmente por otros desarrolladores de software. Se ha utilizado la versión 6.5, que, entre otras cosas, ya incluía la opción de mantener el proyecto en un repositorio SVN. Figura 3.4.2.1: NetBeans IDE 6.5. 32
  33. 33. 3. TECNOLOGÍAS 3.5. Gestión del proyecto 3.5.1. Repositorio de versiones En cualquier proyecto software es necesario llevar un control del código según se va desarrollando la aplicación. Para ello es necesario depositar el proyecto en un repositorio de versiones al que pueden acceder todos los interesados. La utilización básica del repositorio consiste en: subir los cambios que has hecho (Commit), descargar o actualizar con los cambios que han ido haciendo los demás (Update), comparar tú versión con la del repositorio (Synchronize) o consultar todas las versiones anteriores (History). De esta manera se consigue un desarrollo ordenado y seguro. Como mi aplicación la he desarrollado yo solo, la acción más empleada fue Commit, y de esta manera, mi tutor podía ver el código siempre actualizado con la última versión. Al comienzo se utilizó este repositorio: http://www.gavab.es/svn/playeringles/. Cuando la aplicación ya era funcional y se abrió una cuenta en SourceForge.net, se pasó a este otro: https://leelaplayer.svn.sourceforge.net/svnroot/leelaplayer/. 3.5.2. SourceForge.net SourceForge [33] es un software de colaboración para la administración de desarrollos. SourceForge.net es el website para software de código abierto más grande del mundo. Proporciona un servicio gratuito que consiste en una central de desarrollos de software que controla y gestiona varios proyectos de software libre para compartirlos con una audiencia global y además, actúa como un repositorio de código fuente. Para poder dejar mi proyecto en SourceForge.net primero me tuve registrar para crearme una cuenta y luego dar de alta el proyecto indicando una breve descripción y algunas de sus características: Development Status : 4 - Beta License : GNU General Public License version 3.0 (GPLv3) Programming Language : Java Topic : Education, Display User Interface : Java Swing En la página del proyecto (http://sourceforge.net/projects/leelaplayer/) se puede encontrar un enlace para descargar un archivo comprimido .rar con todo lo necesario para ejecutar la aplicación localmente, capturas de pantalla de la interfaz, el repositorio con el código y un enlace al website. También se almacena en la cuenta un archivo .jar y su correspondiente JNLP para poder ejecutarlo out of the box, además de un tutorial en formato HTML (http://mariorodriguez.users.sourceforge.net/leela/tutorialEsp.html). Todos estos archivos se subieron mediante el protocolo SFTP (SSH File Transfer Protocol o Secure File Transfer Protocol) con el programa WinSCP 3 [34] a un servidor FTP que proporciona SourceForge, llamado frs.sourceforge.net. 33
  34. 34. 3. TECNOLOGÍAS 3.5.3. Website La página oficial del PFC está programada con la tecnología XWiki y se encuentra en: https://www.gavab.es/wiki/bin/view/PlayerIngles/. XWiki es una versión wiki basada en Java con una completa lista de herramientas (control de versiones, ficheros anexos, etc.) y que cuenta con un motor de base de datos. Este website se ha ido editando en todo momento desde el comienzo del proyecto para mantenerlo actualizado con los progresos realizados. La página inicial se muestra en la figura 3.5.3.1. Su estructura interna se divide en 5 apartados, más enlaces a la descargar de SourceForge.net, la ejecución mediante JNLP y el tutorial: • Inicio: Contiene un resumen del PFC y los enlaces más importantes. • Gestión: Información relativa al repositorio, los IDE y las licencias. • Planificación: Todas las tareas necesarias ordenadas por la fecha prevista. • Tecnología: Librerías de vídeo, GUI’s, instaladores, etc. • Demos: Contiene 2 vídeos de la aplicación funcionando: uno capturado con el programa HyperCam 2 [35], y otro grabado con una videocámara para poder capturar el audio y el vídeo. Estos vídeos se subieron a YouTube [36] y a TinyPic [37], respectivamente. Figura 3.5.3.1: Página de inicio del website. 34
  35. 35. 3. TECNOLOGÍAS 3.6. Java Networking Launching Protocol (JNLP) Java Networking Launching Protocol (JNLP) [38] es una especificación usada por Java Web Start (JWStart o JavaWS) que permite tener centralizado en un servidor web un programa, evitando los problemas de distribución e instalación que tiene una aplicación tradicional. JavaWS no usa applets, ya que descarga aplicaciones Java normales y necesita la máquina virtual JVM. Al iniciar el proceso de ejecución, se pide autorización al usuario. Además, las aplicaciones deben estar firmadas electrónicamente para asegurar la autenticidad y la integridad de los datos y que no se produzcan ataques de tipo Man-in-the-middle o envenenamiento de DNS. Un archivo .jnlp tiene formato XML, y emplea una sintaxis específica que incluye diversos elementos (etiquetas), algunos obligatorios y otros opcionales [39]. Para realizar las pruebas de funcionamiento se necesitó crear con la herramienta keytool de Java un almacén de claves que se usó para firmar tanto la aplicación, como las dos las librerías jvlc-core.jar y jna.jar. Esta firma tiene validez durante 6 meses. También se instaló un servidor Tomcat: Apache – Tomcat 6.0 [40] para depositar todos los ficheros necesarios. El contenido del fichero de prueba .jnlp se puede ver en la figura 3.6.1. En el fichero real cambia la dirección de codebase. Debido a que la aplicación debe acceder a librerías externas y a diversos plugins para su correcto funcionamiento, si se desea ejecutar mediante esté método es necesario tener instalado el VLC media player. <?xml version="1.0" encoding="utf-8"?> <!-- Archivo JNLP para la aplicacion LeELa player 1.0 --> <jnlp spec="1.0+" codebase="http://localhost:8080/jnlp" href="leela.jnlp"> <information> <title>LeELa player 1.0</title> <vendor>MRM</vendor> <homepage href="https://www.gavab.es/wiki/bin/view/PlayerIngles/"/> <description>Reproductor de video para aprender ingles</description> <description kind="short">LeELa player 1.0</description> <icon href="logo.png"/> <icon kind="splash" href="logo.png"/> <offline-allowed/> </information> <security> <all-permissions/> </security> <resources> <j2se version="1.6+"/> <jar href="jvlc-leela.jar" download="eager"/> <jar href="lib/jvlc-core.jar" download="eager"/> <jar href="lib/jna.jar" download="eager"/> </resources> <application-desc/> </jnlp> Figura 3.6.1: Archivo para probar JNLP. 35
  36. 36. 3. TECNOLOGÍAS 3.7. Subtítulos Un subtítulo es un texto que aparece en el borde inferior de una imagen, normalmente integrados en ella, aportando información adicional sobre la misma o traduciendo una narración o diálogo hablados en un idioma extranjero. Son muy apreciados por los cinéfilos, ya que les permiten disfrutar de las voces originales de los personajes en películas producidas en cualquier país. Los subtítulos representan una parte principal en el desarrollo de este proyecto, ya que serán el medio de consulta que empleará el usuario cuando no comprenda lo que se dice en la película. A diferencia de los subtítulos incrustados en los fotogramas, llamados permanentes, esta aplicación los trata por separado. Son llamados flotantes o seleccionables, y permiten ser manejados con independencia de la película. Una peculiaridad de la aplicación es la opción de usar dos pistas simultáneamente, una con el texto original y la otra con la traducción. Existen una gran variedad de formatos. Se consideran de texto plano los que no emplean marcadores o tags. Éstos son los más compatibles porque son fáciles de convertir de un formato a otro, con programas como el Subtitle Workshop [41], que proporciona una herramienta gratuita para editarlos muy completa y eficiente ya que soporta todos los formatos. Los tags, que están divididos en dos partes: apertura y cierre, proporcionan funciones avanzadas, como añadir efectos o editar los posibles estilos del texto. Los formatos de subtítulos más habituales son: • SubRip (.srt): Se explican en el apartado 3.7.1. • MicroDVD (.sub): De texto plano, son los únicos en los que los tiempos dependen del framerate del video. • SubStation Alpha (.ssa) y Advanced SubStation Alpha (.ass): Son scripts que se dividen internamente en 3 secciones: información del script y del vídeo; información sobre los estilos (tipo de letra, tamaño, color, alineamiento, codificación, etc.); y los diálogos con los tiempos y su respectivo estilo. • Universal Subtitle Format: Tienen formato XML. También se dividen en 3 secciones (metadatos, estilos y diálogos). Aceptan imágenes en formato bitmap. Era un proyecto ambicioso, ya que debido a su potencial pretendían convertirse en el formato definitivo, pero su desarrollo está parado. • Lyrics (.lrc): Se explican en el apartado 3.7.2. 36
  37. 37. 3. TECNOLOGÍAS 3.7.1. SubRip: srt El .srt es el formato de subtítulos de texto plano más popular y el más utilizado para subtitular películas y series. Su sintaxis es muy sencilla: cada entrada consta de una numeración correlativa, el intervalo de inicio y fin, y el texto correspondiente. Este formato ha ido evolucionando, y a día de hoy se le pueden agregar tags básicos: cursiva, negrita y colores. Sin embargo, el analizador sólo tiene en cuenta las etiquetas que indican cursiva (<i></i>), porque son las únicas que se consideran suficientemente relevantes en la acción que transcurre en la pantalla: indican que el texto que representan lo está diciendo alguien que no está en primer plano (la voz del narrador, una televisión o una radio encendidas, una canción de fondo, etc.). En la figura 3.7.1.1 se pueden ver dos ejemplos, original y traducido, del inicio de la misma película. 1 1 00:01:52,594 --> 00:01:54,928 00:01:52,000 --> 00:01:54,334 Yeah, hello. You're Steve? Sí, hola. ¿Eres Steve? 2 2 00:01:55,089 --> 00:01:56,943 00:01:54,495 --> 00:01:56,350 Steven. Hi. Steven. Hola. 3 3 00:01:57,041 --> 00:01:59,080 00:01:56,447 --> 00:01:58,487 - Sit down. - Siéntate. - Roberto? - ¿Roberto? 4 4 00:02:03,728 --> 00:02:05,615 00:02:03,134 --> 00:02:05,021 - I'm all wound up. - Estoy muy tenso. - Yeah. - Sí. Figura 3.7.1.1: Diálogos en formato .srt. 37
  38. 38. 3. TECNOLOGÍAS 3.7.2. Lyrics: lrc Los archivos con extensión .lrc son de texto plano y sirven para mostrar la letra o alguna información sobre la reproducción de una pista de audio. Se utilizan en los sistemas de karaoke. Al comienzo del archivo puede haber metainformación con datos de la canción (título, artista, álbum, etc.), que es ignorada por el analizador. A diferencia de los subtítulos con formato .srt, sólo indican el instante en el que debe aparecer la frase, pero no cuándo se debe ocultar. El analizador decide que la frase se debe ocultar 100 milisegundos antes de que aparezca la siguiente. A continuación, en la figura 3.7.2.1, se adjunta un ejemplo. Se pueden descargar letras de canciones de la siguiente web: http://www.lrcdb.org/index.php En ocasiones es necesario modificar estos archivos para que el intervalo temporal tenga el formato requerido: [nn:nn.nn]. Esto se puede realizar con cualquier editor de texto básico (Bloc de notas, gedit) haciendo uso de la opción “Reemplazar”. [ti:Wonderwall] [ar:Oasis] [au:Written by Noel Gallagher] [al:(What's The Story) Morning Glory] [by:Adam Liwski] [ve:V2.20] [00:02.00]Wonderwall - Oasis [00:07.80] [00:08.10]Written by Noel Gallagher [00:13.90] [00:14.20]From album "(What's The Story) Morning Glory" [00:20.00] [00:22.00]Today is gonna be the day that they're gonna throw it back to you [00:27.00]By now you shoulda somehow realized what you gotta do [00:33.00]I don't believe that anybody feels the way I do about you now [00:44.00]Back beat, the word is on the street that the fire in your heart is out Figura 3.7.2.1: Letra de canción con formato .lrc. 38
  39. 39. 4. DESCRIPCIÓN INFORMÁTICA 4. Descripción informática 4.1. Especificación de requisitos La especificación de requisitos es una fase primordial en el ciclo de vida del software, aunque requiera menos tiempo que el diseño o la implementación. Se debe realizar al comienzo ya que es la forma que tiene el desarrollador de entender lo que quiere exactamente el cliente. Una clasificación típica diferencia entre requisitos funcionales y requisitos no funcionales. 4.1.1. Interfaz de usuario El diseño y la usabilidad de la interfaz gráfica de usuario (GUI) cobran mucha importancia en este proyecto ya que la aplicación va destinada a cualquier tipo de usuario, por lo que debe ser fácil de usar para alguien que apenas tenga conocimientos informáticos. Básicamente consta de una barra de menú en la que se encuentran clasificadas todas las opciones que están disponibles, unos iconos con símbolos reconocidos internacionalmente con los controles más comunes, y la pantalla de vídeo. Tanto las confirmaciones o las consultas, como los mensajes de error, aparecen comunicados en nuevas ventanas. 4.1.2. Requisitos funcionales A continuación se especifican los requisitos funcionales considerados para que la aplicación cumpla los objetivos. - REQF1: Reproducir archivos multimedia (vídeos y canciones) con todos los formatos comunes (.avi, .mp3) que sea posible. - REQF2: Aceptar subtítulos (.srt o .lrc) que irán sincronizados con la reproducción. - REQF3: Contar con una barra de menú en la que aparezcan todas las opciones que tiene el programa, clasificadas en menús típicos (Archivo, Reproducción, Ayuda, etc.). - REQF4: Mostrar una ventana para poder buscar y seleccionar el archivo multimedia que se desea reproducir. - REQF5: Mostrar una ventana para poder buscar y seleccionar el archivo con los subtítulos que se desean cargar. - REQF6: Poder cargar 2 pistas de subtítulos (principal y secundaria). - REQF7: Si el archivo con los subtítulos no tiene el formato correcto indicar con un mensaje cuál es la línea que da el primer error. 39
  40. 40. 4. DESCRIPCIÓN INFORMÁTICA - REQF8: Poder sincronizar los subtítulos introduciendo el tiempo que se desea ajustar. - REQF9: Tener una opción para ocultar / mostrar la caja con los subtítulos. - REQF10: Tener un botón para activar / desactivar los subtítulos cargados. - REQF11: Tener un botón (Consulta) para consultar la última frase que han dicho en la pantalla. Se mostrará en una ventana, si hay subtítulos cargados. - REQF12: Tener un botón (Repetir) para repetir la última frase que han dicho en la pantalla, si hay subtítulos cargados. - REQF13: Tener una opción para que los botones Consulta y Repetir estén siempre visibles. - REQF14: Tener un botón para poder pausar / reanudar la reproducción actual. - REQF15: Tener un botón para poder detener por completo la reproducción actual, que borrará los subtítulos cargados anteriormente y permitirá cargar nuevos subtítulos y añadir más elementos a la lista de reproducción. - REQF16: Tener un botón para poder avanzar en la reproducción actual (10 segundos). - REQF17: Tener un botón para poder retroceder en la reproducción actual (10 segundos). - REQF18: Tener un botón para poder pasar al siguiente elemento en la lista de reproducción. - REQF19: Tener un botón para poder pasar al anterior elemento en la lista de reproducción. - REQF20: Tener una caja de texto con el nombre del archivo que se está reproduciendo. - REQF21: Tener una barra deslizadora para controlar el progreso de la reproducción actual. - REQF22: Tener un botón para silenciar el volumen. - REQF23: Tener una barra deslizadora para controlar el volumen. - REQF24: Tener una opción para alternar entre la pista 1 y la pista 2 del audio. - REQF25: Tener una opción para consultar los elementos de la lista de reproducción. - REQF26: Tener una opción para desplegar un tutorial que explique el uso de la aplicación. - REQF27: Tener una opción para salir del programa. 40
  41. 41. 4. DESCRIPCIÓN INFORMÁTICA 4.1.3. Requisitos no funcionales A continuación se especifican los requisitos no funcionales. REQNF1: Fiabilidad La fiabilidad de la aplicación depende del procesamiento de los archivos multimedia que proporciona la librería JVLC. REQNF2: Disponibilidad No existen atributos del sistema para este apartado. REQNF3: Mantenibilidad No existen atributos del sistema para este apartado. REQNF4: Portabilidad La aplicación es portable ya que corre bajo la máquina virtual de Java (JVM). Se puede ejecutar localmente o desde Internet. REQNF5: Tiempo de respuesta Viene determinado por la capacidad del procesador donde se ejecuta la aplicación. REQNF6: Utilización de memoria La librería JVLC gestiona los archivos multimedia de la misma manera que VLC media player. El contenido de los archivos con los subtítulos se mantiene por completo en memoria una vez analizado correctamente. REQNF7: Manejo de errores Cuando los archivos con subtítulos no tienen una extensión válida o el formato no es correcto se comunica el error mediante un mensaje. REQNF8: Registro de errores Si Java Runtime Environment detecta un error al abrir o reproducir un archivo, la ejecución de la aplicación finalizará y se reporta el error en un archivo de texto llamado hs_err_pidxxx.txt (donde xxx representa el número de identificación del proceso), que explica al detalle el problema surgido. 41
  42. 42. 4. DESCRIPCIÓN INFORMÁTICA 4.2. Diseño El diseño de la aplicación se ha especificado en UML (Unified Modeling Language) [42]. UML es un lenguaje de modelado que permite la construcción de distintos modelos. Un modelo es una representación en algún medio que captura los aspectos importantes del sistema modelado desde un determinado punto de vista. Los propósitos de los modelos son: • Pensar sobre un diseño de un sistema. • Capturar decisiones de diseño de un sistema. • Explorar posibles soluciones a un problema económicamente. • Generar productos de trabajo útiles. • Documentar. UML es autodescriptivo porque puede especificarse por medio de un diagrama de clases de UML. Está formado por los siguientes bloques de construcción: • Elementos: bloques básicos. - Estructurales: Clases, Casos de Uso, etc. - Comportamiento: Interacción, Estados, etc. - Agrupación: Paquetes. - Anotación: Notas. • Relaciones: ligan los elementos. - Dependencia (Relación de Uso). - Asociación (Relación estructural). - Generalización (Representación de la herencia). - Realización. • Diagramas: agrupan colecciones de elementos ligados, aportando un significado adicional. Ofrecen distintas perspectivas de una abstracción de la realidad. 42
  43. 43. 4. DESCRIPCIÓN INFORMÁTICA Un concepto importante en UML son las vistas. Una vista es un subconjunto de construcciones de modelado que se enfocan en un aspecto particular del sistema. Se puede ver la relación entre las áreas y sus vistas correspondientes en la figura 4.2.1. Área Vista Diagramas Principales Conceptos Estructural Vista Estática Diagrama de Clases Clase, asociación, generalización, dependencia, realización, interfaz. Vista de Casos de Diagrama de Casos Casos de uso, actor, asociación, Uso de Uso extensión, inclusión, generalización. Vista de Diagrama de Componente, interfaz, Implementación Componentes dependencia, realización. Vista de Diagrama de Nodo, componente, dependencia, Despliegue Despliegue localización. Dinámica Vista de Máquina Diagrama de Estados Estado, evento, transición, acción. de Estados (ciclo de vida de objeto) Vista de Diagrama de Estado, actividad, transición, Actividades Actividades concurrencia (fork), reunión (join). Vista de Diagrama de Interacción, objeto, mensaje, Interacción Secuencia activación. Diagrama de Colaboración, interacción, rol de Colaboración colaboración, mensaje. Gestión del Vista de Gestión Diagrama de Clases Paquete, subsistema, modelo. Modelo del Modelo Extensibilidad Todos Todos Restricciones, estereotipos, valores etiquetados. Figura 4.2.1: Relación Áreas - Vistas. Todos los diagramas que definen el diseño de la aplicación se han realizado con el programa JUDE Community 5.0 [43]. Figura 4.2.2: JUDE: UML modeling tool. 43
  44. 44. 4. DESCRIPCIÓN INFORMÁTICA 4.2.1. Casos de uso Una interacción con el usuario representa un caso de uso. Un caso de uso es una función del sistema que da al usuario un resultado útil, y captura los requisitos funcionales. Conducen el proceso de desarrollo a través de modelos de diseño e implementación y pruebas. Estos modelos se desarrollan y evolucionan junto a la arquitectura del sistema. En la figura 4.2.1.1 se puede ver el diagrama de casos de uso de la aplicación. Figura 4.2.1.1: Diagrama de casos de uso. 44
  45. 45. 4. DESCRIPCIÓN INFORMÁTICA A continuación se describirán los casos de uso al detalle. En cada caso se indicarán los eventos generados por el usuario y los generados por la aplicación. En todos los casos se supone que la ejecución del programa ya se ha iniciado. Reproducir película o canción - Camino estándar: Usuario Aplicación 1. Click en “Abrir archivo” 2. Mostrar ventana para examinar 3. Seleccionar archivo y “Abrir” 4. Comienza la reproducción - Camino alternativo 1: El usuario cancela la operación - Camino alternativo 2: El archivo no es válido Usuario Aplicación 4. Se cierra la aplicación 5. Se crea archivo .txt con el error Cargar subtítulos .lrc o .srt - Camino estándar: Usuario Aplicación 1. Click en “Cargar subtítulos” 2. Mostrar ventana para examinar 3. Seleccionar archivo y “Cargar” 4. Analizar archivo 5. Subtítulos cargados en memoria 6. Mostrar confirmación - Camino alternativo 1: El usuario cancela la acción - Camino alternativo 2: El formato no es correcto Usuario Aplicación 5. Mostrar mensaje con el error 45
  46. 46. 4. DESCRIPCIÓN INFORMÁTICA Practicar idioma con película o canción - Camino estándar: Usuario Aplicación 1. [P.I.] Cargar subtítulos .lrc o .srt 2. [P.I.] Reproducir película o canción 3. Click en “Mostrar subtítulos” 4. Hacer visible la ventana con subtítulos 5. Click en el botón para activarlos 6. Activar los subtítulos - Camino alternativo 1: El usuario cancela la acción - Camino alternativo 2: El usuario desactiva los subtítulos Usuario Aplicación 7. Click en el botón para desactivarlos 8. Desactivar los subtítulos - Camino alternativo 3: El usuario oculta los subtítulos Usuario Aplicación 7. Click en “Mostrar subtítulos” 8. Ocultar la ventana con los subtítulos Sincronizar subtítulos - Camino estándar: Usuario Aplicación 1. [P.I.] Cargar subtítulos .lrc o .srt 2. Click en “Sincronizar” 3. Mostrar una ventana para introducir nº 4. Introducir el tiempo en milisegundos 5. Sincronizar los subtítulos cargados - Camino alternativo 1: El usuario cancela la acción - Camino alternativo 2: El usuario introduce un valor no numérico Usuario Aplicación 5. Mostrar mensaje con el error 46
  47. 47. 4. DESCRIPCIÓN INFORMÁTICA Repetir frase - Camino estándar: Usuario Aplicación 1. Click en “Repetir” 2. Retrasar reproducción hasta la frase anterior - Camino alternativo 1: No hay subtítulos cargados Usuario Aplicación 2. Mostrar mensaje con el error Consultar frase - Camino estándar: Usuario Aplicación 1. Click en “?” 2. Mostrar un mensaje con el último comentario de la reproducción - Camino alternativo 1: No hay subtítulos cargados Usuario Aplicación 2. Mostrar mensaje en blanco 47
  48. 48. 4. DESCRIPCIÓN INFORMÁTICA 4.2.2. Diagrama de clases En la figura 4.2.2.1 se muestra el diagrama de clases de la aplicación. Se puede observar que es un diseño bastante sencillo. Se ha separado la parte dedicada a la GUI con sus opciones, de lo referente al tratamiento de los subtítulos. Figura 4.2.2.1: Diagrama de clases. 48
  49. 49. 4. DESCRIPCIÓN INFORMÁTICA 4.2.3. Descripción de las clases A continuación se pasa a explicar la función de cada clase y los requisitos que se van cumpliendo. Principal Esta clase contiene el método main() de la aplicación. Se encarga de inicializar las ventanas principal VLCPlayerFrame y la de los subtítulos VLCSubtFrame. Indica el tamaño que deben tener, la posición que deben ocupar respecto a la pantalla y cómo deben comportarse al finalizar la aplicación. VLCPlayerFrame Esta clase implementa la interfaz gráfica de usuario con todas sus funcionalidades: abrir archivo, cargar subtítulos, mostrar y ocultar subtítulos, parar la reproducción, reanudar, repetir frase, consultar frase, avanzar, retrasar, ir a anterior, ir a siguiente, cambiar audio, ver lista, ver instrucciones, sincronizar subtítulos y salir de la aplicación. Inicializa el menú de opciones, coloca la pantalla y los botones y les asigna sus métodos correspondientes. Algunas de las opciones sólo están disponibles bajo determinadas circunstancias. Se encarga de cumplir los requisitos: REQF1, REQF3, REQF4, REQF5, REQF9, REQF11, REQF12, REQF13, REQF14, REQF15, REQF16, REQF17, REQF18, REQF19, REQF20, REQF21, REQF22, REQF23, REQF24, REQF25, REQF26 y REQF27. VLCSubtFrame Esta clase implementa la ventana donde aparecen los subtítulos. Si la ventana está visible, debe aparecer siempre por encima de todo lo demás para que puedan leerse en todo momento los subtítulos, incluso cuando el vídeo esté a pantalla completa. Cada una de las dos pistas de subtítulos tiene un botón para activarlos y desactivarlos si se han cargados anteriormente. Se encarga de cumplir los requisitos: REQF6 y REQF10. 49
  50. 50. 4. DESCRIPCIÓN INFORMÁTICA PonedorSubtitulos Esta clase implementa un hilo de ejecución paralelo a la aplicación que se encarga de actualizar las cajas de texto de la ventana VLCSubtFrame a través de VLCPlayerFrame. Consulta el tiempo y el estado de la reproducción, y decide el texto que debe escribir. Si hay subtítulos cargados, el thread arranca cuando se añade un nuevo vídeo y muere cuando finaliza o se pulsa el botón Stop. También implementa un método sincronizar para ajustar los subtítulos al audio del vídeo. Se encarga de cumplir el requisito: REQF8. Subtitulos Esta clase se encarga de validar los archivos de texto que contienen los subtítulos. Analiza el archivo y lo guarda en un ArrayList de sentencias, que será al que acceda el PonedorSubtitulos. Si el archivo no está bien formado se indicará la primera línea que da el error. Acepta archivos con formato .srt y .lrc. También implementa un método repetir(), que después de consultar la reproducción actual y la lista de frases, devuelve el tiempo al que tiene que regresar el vídeo para volver a escuchar la última frase que han dicho. Se encarga de cumplir los requisitos: REQF2 y REQF7. Sentencia Esta clase representa cada comentario de la película con todas sus propiedades: frase (el contenido textual de lo que dicen en la película), inicio (el instante para cuando debe aparecer en los subtítulos), fin (el instante para cuando debe desaparecer de los subtítulos) y si tiene formato cursiva. ActualizarProgreso Esta clase representa la barra de progreso de la reproducción del vídeo. Implementa la función de actualizar su valor mediante un hilo de ejecución paralelo a la ejecución principal que se dedica a consultar periódicamente el tiempo del vídeo. Se encarga de cumplir el requisito: REQF21. GestorEventosRollOver Esta clase implementa unas funcionalidades para el ratón. Simplemente se utiliza para cambiar el color del texto de los botones cuando pasa el ratón por encima. 50
  51. 51. 4. DESCRIPCIÓN INFORMÁTICA 4.2.4. Otros diagramas En la figura 4.2.4.1 se puede ver un diagrama de secuencia esquemático de una reproducción típica de un vídeo con subtítulos. Figura 4.2.4.1: Diagrama de secuencia. 51
  52. 52. 4. DESCRIPCIÓN INFORMÁTICA 4.3. Implementación La aplicación obtendrá los recursos que necesita para funcionar correctamente de diferente manera si se va a ejecutar localmente o remotamente a través del archivo JNLP. A continuación explicarán los métodos más relevantes del código de cada clase. Principal main(): Inicializa la ventana con los subtítulos y se coloca centrada en la parte inferior gracias al método tk.getScreenSize(), que devuelve el tamaño de la pantalla. Con el método setAlwaysOnTop(true) lo que se consigue es que permanezca siempre en primer plano, aunque se ponga el vídeo a pantalla completa. Se inicializa la ventana principal con un tamaño determinado, gracias al método setBounds() y centrada con setLocationRelativeTo(). … Toolkit tk = Toolkit.getDefaultToolkit(); Dimension tamanyo = tk.getScreenSize(); subtFrame = new VLCSubtFrame(); subtFrame.setLocation((int)(tamanyo.getWidth()- subtFrame.getWidth())/2, (int)tamanyo.getHeight()-90); subtFrame.setResizable(false); subtFrame.setVisible(false); subtFrame.setAlwaysOnTop(true); … vlcFrame = new VLCPlayerFrame(); vlcFrame.setBounds(0, 0, 640, 740); vlcFrame.setLocationRelativeTo(null); minimo = new Dimension (vlcFrame.getWidth(), vlcFrame.getHeight()); vlcFrame.setMinimumSize(minimo); vlcFrame.setBackground(color); vlcFrame.setVisible(true); vlcFrame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent ev) { vlcFrame.salir(); } }); 52
  53. 53. 4. DESCRIPCIÓN INFORMÁTICA VLCPlayerFrame Extiende la clase java.awt.Frame. initComponents(): Crea la parte más importante de la aplicación: la pantalla de vídeo. Esta pantalla estará en un Canvas, encargado de contener la salida de vídeo del objeto JVLC. El Canvas, a su vez estará, dentro en un JPanel. Se inicializan los 4 atributos necesarios de un objeto JVLC en la variable arg. Los plugins necesarios (conjunto de archivos .dll en Windows y .so en Linux) los obtendrá de la carpeta local o de la instalación del VLC media player, dependiendo del tipo de ejecución. A partir del objeto JVLC se crea el objeto que representa la lista de reproducción (Playlist) y el sonido (Audio). … this.panelVideo = new JPanel(); this.jvcanvas = new Canvas(); this.jvcanvas.setSize(550, 550); this.panelVideo.add(this.jvcanvas); if (!VLCPlayerFrame.jnlp) { String[] arg = {"--intf=dummy", "--ignore-config", "--no-plugins-cache", "--plugin-path=plugins"}; this.jvlc = new JVLC(arg); } else { if (Platform.isWindows()) { File plg = new File("C:Archivos de programaVideoLANVLCplugins"); if (plg.exists()) { String[] argW = {"--intf=dummy", "--ignore-config", "--no-plugins-cache", "--plugin-path= C:Archivos de programaVideoLANVLCplugins"}; this.jvlc = new JVLC(argW); } else { plg = new File("C:Program filesVideoLANVLCplugins"); if (plg.exists()) { String[] argW = {"--intf=dummy", "--ignore-config", "--no-plugins-cache", "--plugin-path= C:Program filesVideoLANVLCplugins"}; this.jvlc = new JVLC(argW); } else { String msg = "No se ha encontrado instalado "VLC media player""; JOptionPane.showMessageDialog(null, msg, "ERROR", JOptionPane.OK_OPTION); System.exit(0); } } } } this.jvlc = new JVLC(arg); playlist = new Playlist(this.jvlc); this.audio = new Audio(this.jvlc); … 53
  54. 54. 4. DESCRIPCIÓN INFORMÁTICA Se usan la clase GridBagConstraints para indicar mediante coordenadas la posición de los elementos dentro de la GUI y la clase Insets para indicar los márgenes externos entre estos elementos. Para añadir los iconos a los botones se emplea la clase javax.swing.ImageIcon. Para configurar los eventos asociados a los componentes se usa la clase ActionListener y se implementa el método actionPerfomed para los JButton, o la clase ChangeListener con el método stateChanged para los JSlider. … Insets insets = new Insets (3,3,3,3); … this.stopButton = new JButton(""); this.stopButton.setEnabled(false); try { Icon icono = new javax.swing.ImageIcon( javax.imageio.ImageIO.read(this.getClass(). getResourceAsStream("/stop.png"))); this.stopButton.setIcon(icono); } catch (Exception e) { e.printStackTrace(); this.stopButton.setText("Stop"); } this.stopButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { parar(); } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.insets = insets; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; add(this.stopButton, gridBagConstraints); … Se utilizan las clases JButton para los botones, JLabel para las etiquetas, JSlider para el control del volumen y el progreso del vídeo y JTextField para contener el nombre del archivo [44]. showFileChooser(): Este método se encarga de abrir una ventana para buscar y seleccionar el archivo multimedia que se quiere cargar. Para ello crea un JFileChooser, que se inicializa con la última ruta utilizada, guardada en una variable estática. Una vez añadido el nuevo elemento a playlist, esta comienza a reproducirse, se activan y desactivan los botones correspondientes y se ejecutan, con el método start(), los hilos de los subtítulos si están cargados y el hilo encargado de actualizar la barra de progreso después de establecerle un valor máximo con la duración del vídeo. showSubt1Chooser(): También usa un JFileChoser para seleccionar el archivo con los subtítulos. Si los subtítulos están bien formados y pasan el analizador se confirma con un mensaje y quedan almacenados en una variable del tipo Subtitulos. Se activan los botones de la ventana VLCSubtFrame. 54
  55. 55. 4. DESCRIPCIÓN INFORMÁTICA initMenu(): Para realizar la barra de menú se ha utilizado la librería AWT para que no tenga problemas de visibilidad con respecto a la pantalla de vídeo. Para sus correspondientes elementos se han empleado las clases MenuBar, Menu, MenuItem y CheckBoxMenuItem. Para organizar los ítems en un mismo menú y que se mejore su apariencia se añaden separadores con insertSeparator(). Le asigna a cada elemento su gestor de eventos añadiendo un ActionListener que implementa el actionPerformed. En el caso del botón que muestra y oculta la ventana con los subtítulos se añade un ItemListener que implementa un itemStateChanged. initSincronizar(): Es un JFrame que tiene un JTextField donde se introducen los milisegundos que se quieren desplazar los subtítulos cargados. initConsultar(): Hace visible una ventana con dos JButton, con los eventos para consultar la última frase o repetirla. parar(): Se para la reproducción con el método togglePause() de Playlist y se pone a cero la barra de progreso con setValue() y el tiempo del vídeo con el método setTime() de la clase MediaInstance. Si el PonedorSubtitulos estaba ejecutándose se finaliza y se pone a null: si estaban dormidos se despiertan con el método interrupt(), en la siguiente iteración saldrán del bucle porque no se cumplirá la condición, y así se podrán cargar otros diferentes. if (!pausa) VLCPlayerFrame.playlist.togglePause(); VLCPlayerFrame.parado = true; VLCPlayerFrame.pausa = true; VLCPlayerFrame.playlist. getMediaInstance().setTime(0); if ((VLCPlayerFrame.ponerSubt1 != null) && (VLCPlayerFrame.ponerSubt1.isDormido())) VLCPlayerFrame.ponerSubt1.interrupt(); … if ((VLCPlayerFrame.subt1 != null) || (VLCPlayerFrame.ponerSubt1 != null)) { VLCPlayerFrame.subt1 = null; VLCPlayerFrame.ponerSubt1 = null; VLCSubtFrame.button1.setEnabled(false); sinc1.setEnabled(false); } … barraProgreso.setValue(0); barraProgreso.setEnabled(false); cargar.setEnabled(true); examinarButton.setEnabled(true); abrir.setEnabled(true); VLCSubtFrame.subtitulos1.setText("SIN CARGAR"); VLCPlayerFrame.fraseActual = null; 55
  56. 56. 4. DESCRIPCIÓN INFORMÁTICA avanzar(), retrasar(): Se usan los métodos setTime() de la clase MediaInstance para editar el tiempo en el que se encuentra el vídeo: se le suma o se le resta al tiempo actual 10.000 milisegundos. Si el PonedorSubtitulos está dormido se despierta con interrupt(). public void avanzar(int n) { if (!parado) { VLCPlayerFrame.playlist.getMediaInstance(). setTime(VLCPlayerFrame.playlist.getMediaInstance() .getTime() + n); if ((VLCPlayerFrame.ponerSubt1 != null) && (VLCPlayerFrame.ponerSubt1.isDormido())) { VLCPlayerFrame.ponerSubt1.interrupt(); } if ((VLCPlayerFrame.ponerSubt2 != null) && VLCPlayerFrame.ponerSubt2.isDormido())) { VLCPlayerFrame.ponerSubt2.interrupt(); } } } siguiente(), previo(): Se usan los métodos next() o prev() de Playlist para moverse por los elementos de la lista de reproducción. Se actualiza el contador que indica cuál es el elemento actual dentro de la lista, el JSlider con el progreso y el JTextField con el nombre del archivo. if (!parado) { VLCPlayerFrame.cont++; if (VLCPlayerFrame.cont >= VLCPlayerFrame.lista.size()) VLCPlayerFrame.cont = 0; this.dirArchivo.setText (VLCPlayerFrame.lista.get(cont)); barraProgreso.setValue(0); VLCPlayerFrame.playlist.next(); Thread.sleep(1000); barraProgreso.setMaximum((int)VLCPlayerFrame.playlist. getMediaInstance().getLength()); VLCPlayerFrame.actualizar = new ActualizarProgreso(this.barraProgreso); VLCPlayerFrame.actualizar.start(); } 56

×