• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Memoria PFC
 

Memoria PFC

on

  • 7,827 views

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

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

Statistics

Views

Total Views
7,827
Views on SlideShare
7,811
Embed Views
16

Actions

Likes
3
Downloads
0
Comments
0

6 Embeds 16

http://mariorodriguez.users.sourceforge.net 7
http://thepunisher666.com 3
http://www.linkedin.com 3
http://www.lmodules.com 1
http://www.docshut.com 1
https://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Memoria PFC Memoria PFC Document Transcript

    • 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
    • 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
    • A mis padres y mis abuelos 3
    • - Listen lady, I only speak two languages: English and bad English. Korben Dallas, The fifth element 4
    • 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
    • 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
    • Í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
    • 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
    • Í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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 4. DESCRIPCIÓN INFORMÁTICA cambiarAudio(): Alterna entre las pistas 1 y 2 del audio de un vídeo mediante el método setTrack() de la clase Audio. repetir(): Se hace una llamada al método repetir() de la clase Subtitulos, y se actualiza el tiempo del vídeo con el valor obtenido y el método setTime(). Es necesario tener subtítulos cargados, y tienen preferencia los subtítulos principales. if (!parado) { int actual = (int)VLCPlayerFrame.playlist.getMediaInstance().getTime(); if (VLCPlayerFrame.subt1 != null) { int nuevo = VLCPlayerFrame.subt1.repetir(actual); VLCPlayerFrame.playlist.getMediaInstance().setTime(nuevo); if (VLCPlayerFrame.ponerSubt1.isDormido()) VLCPlayerFrame.ponerSubt1.interrupt(); if ((VLCPlayerFrame.ponerSubt2 != null) && (VLCPlayerFrame.ponerSubt2.isDormido())) VLCPlayerFrame.ponerSubt2.interrupt(); } else { if (VLCPlayerFrame.subt2 != null) { int nuevo = VLCPlayerFrame.subt2.repetir(actual); VLCPlayerFrame.playlist.getMediaInstance().setTime(nuevo); if (VLCPlayerFrame.ponerSubt2.isDormido()) VLCPlayerFrame.ponerSubt2.interrupt(); } else { String msg = "Para usar esta opción necesita tener cargados subtítulos."; JOptionPane.showMessageDialog(null, msg, "Repetir", JOptionPane.OK_OPTION); } } } salir(): Muestra un mensaje de despedida y hace una llamada al método System.exit(0). verInstrucciones(): Comprueba la plataforma en la que se ejecuta la aplicación. En el caso de Windows, lanza el tutorial en formato HTML con el navegador predeterminado. En otro caso, muestra un JTextField dentro de un JPanel indicando la url donde se encuentra el tutorial on-line. 57
    • 4. DESCRIPCIÓN INFORMÁTICA VLCSubtFrame Extiende la clase java.awt.Frame. initComponents(): Crea un JButton y un JTextFile por cada una de las 2 pistas de subtítulos. En el actionPerformed de los botones se controla si el PonedorSubtitulos se activa o desactiva. Se personalizan los JTextFile con el color de fondo (setBackground(java.awt.Color)), el estilo (setFont(java.awt.Font)) y color de la fuente (setDisabledTextColor(java.awt.Color)) y el alineamiento (setHorizontalAlignment(CENTER)). Este Frame no tendrá decoración (marco) para no tapar más de lo necesario la reproducción (setUndecorated(true)). GridBagConstraints gridBagConstraints; subtitulos1 = new JTextField(60); subtitulos1.setHorizontalAlignment(JTextField.CENTER); subtitulos1.setText("SIN CARGAR"); subtitulos1.setEnabled(false); subtitulos1.setBackground(Color.BLACK); subtitulos1.setDisabledTextColor(Color.YELLOW); subtitulos1.setFont(VLCPlayerFrame.fuente); … setLayout(new GridBagLayout()); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = GridBagConstraints.BOTH; add(subtitulos1, gridBagConstraints); button1 = new JButton("Subt 1"); button1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try { if (VLCPlayerFrame.ponerSubt1 != null) { if (VLCPlayerFrame.ponerSubt1.isActivado()) { VLCPlayerFrame.ponerSubt1.setActivado(false); setSubtitulos1("DESACTIVADOS"); } else { VLCPlayerFrame.ponerSubt1.setActivado(true); setSubtitulos1(""); } } } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error Subt1", "ERROR", JOptionPane.OK_OPTION); e.printStackTrace(); } } }); button1.setEnabled(false); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; add(button1, gridBagConstraints); 58
    • 4. DESCRIPCIÓN INFORMÁTICA PonedorSubtitulos Extiende la clase Thread. sincronizar(): Recorre el ArrayList de Sentecia y edita los tiempos de inicio y fin sumando o restando la cantidad indicada en el parámetro de entrada. run(): Implementa un bucle que finaliza cuando acaban los subtítulos o cuando se para la reproducción. Consulta el tiempo del video con getTime() y busca en el ArrayList de Sentecia el intervalo correspondiente y se almacena la frase. Si están activados se modifica el contenido del JTextField del VLCSubtFrame. Con el métod sleep() la ejecución se detiene durante un momento. Este tiempo se calcula con el inicio y el final de la frase. Si la reproducción se pausa, se llama al método yield(), que también suspende la ejecución hasta que se despierta el hilo desde algún otro lugar. while ((!VLCPlayerFrame.parado) && (i < this.lista.size())) { inicio = this.lista.get(i).getInicio(); fin = this.lista.get(i).getFin(); if (i > 0) finPrev = this.lista.get(i-1).getFin(); if (i < (this.lista.size()-1)) inicioSig = this.lista.get(i+1).getInicio(); String texto = new String(this.lista.get(i).getFrase()); actual = (int)VLCPlayerFrame.playlist.getMediaInstance().getTime(); if ((i > 0) && (actual < finPrev)) i--; else { if ((i < (this.lista.size()-1)) && (actual > inicioSig)) i++; else { if (this.lista.get(i).isCursiva()) this.cajaTexto.setFont(VLCPlayerFrame.fuenteK); if (inicio > actual) { this.sleep(inicio-actual); if (this.principal) VLCPlayerFrame.fraseActual = new String (this.lista.get(i).getFrase()); if (this.activado) this.cajaTexto.setText(texto); this.sleep(fin - inicio); else { if (this.principal) VLCPlayerFrame.fraseActual = new String (this.lista.get(i).getFrase()); if (this.activado) this.cajaTexto.setText(texto); if (fin > actual) this.sleep(fin - actual); } while ((!VLCPlayerFrame.parado) && (VLCPlayerFrame.pausa)) this.yield(); if (this.activado) this.cajaTexto.setText(""); if (this.lista.get(i).isCursiva()) this.cajaTexto.setFont(VLCPlayerFrame.fuente); } i++; } } 59
    • 4. DESCRIPCIÓN INFORMÁTICA Subtitulos validarSrt(), validarLrc(): Valida un archivo .srt o .lrc y va almacenando las entradas en un ArrayList de Sentencia. Lee el archivo línea alínea y comprueba si la numeración y el formato del intervalo son correctos. Si no es válido proporciona un mensaje de error con JOptionPane.showMessageDialog(null, msg, "ERROR", JOptionPane.OK_OPTION). Implementa los métodos necesarios para convertir un formato de tiempo determinado en un total de milisegundos. … FileReader fr = new FileReader (new File(“archivo.srt”)); BufferedReader br = new BufferedReader(fr); while ((linea = br.readLine()) != null) { … Sentencia sentencia = new Sentencia (inicio, fin, texto); this.sentencias.add(sentencia); } fr.close(); … repetir(): Recibe un int que representa los milisegundos en los que se encuentra la reproducción. Busca según los tiempos en el ArrayList la sentencia que se acaba de decir, localiza el tiempo exacto en que apareció ese comentario y devuelve ese instante retrasado un segundo para poder volver a escucharlo. Sentencia Es una clase con 4 atributos: frase (String), inicio (int), fin (int) y cursiva (boolean) que representan los comentarios. Implementa los métodos get y set correspondientes. ActualizarProgreso Extiende la clase Thread. run(): Cada medio segundo consulta el tiempo en el que se encuentra el vídeo con una llamada a getTime() de la clase MediaInstance, y con ese valor actualiza su valor en el JSlider. Si queda menos de 1 segundo para la finalización de la reproducción actual, la para. GestorEventosRollOver mouseExited(), mouseEntered(): Implementan la interfaz MouseListener. Cambia el color del texto de los botones cuando el puntero del ratón entra y sale del botón, usando el método setForeground(java.awt.Color). 60
    • 4. DESCRIPCIÓN INFORMÁTICA 4.4. Pruebas Para comprobar el correcto funcionamiento de la aplicación se realizaron diversas pruebas. A continuación aparecen los archivos multimedia que se han probado con éxito: Prueba 1 - Tipo de archivo: Clip de vídeo - Tamaño: 700 MB - Extensión: .avi - Velocidad de transmisión: 129 kbps - Formato de audio: MPEG Layer-3 Prueba 2 - Tipo de archivo: Clip de vídeo - Tamaño: 250 MB - Extensión: .avi - Velocidad de transmisión: 128 kbps - Formato de audio: MPEG Layer-3 - Audio: Dual (Spanish-English) Prueba 3 - Tipo de archivo: VLC media file - Tamaño: 3’54 MB - Extensión: .flv Prueba 4 - Tipo de archivo: Archivo de audio MP3 - Tamaño: 4’69 MB - Extensión: .mp3 - Velocidad de transmisión: 168 kbps Prueba 5 - Tipo de archivo: Archivo AAC - Tamaño: 4’13 MB - Extensión: .aac Prueba 6 - Tipo de archivo: VLC media file - Tamaño: 5’05 MB - Extensión: .m4a 61
    • 4. DESCRIPCIÓN INFORMÁTICA En las pruebas 1 y 4 se añadieron subtítulos con extensión .srt y .lrc, respectivamente. Se comprobó su correcto funcionamiento, así como sus opciones (Sincronizar, Repetir, Consultar). También se probó a cargar subtítulos con errores y se observó que el analizador localiza el error correctamente. También se probaron archivos con formato .mpg. Se observó que estos archivos multimedia se reproducen, pero dan problemas al editar su tiempo controlando la barra de progreso. Este problema no se ha tratado porque corresponde a la gestión de los archivos por parte de la librería JVLC y queda fuera de los objetivos del proyecto: Prueba 7 - Tipo de archivo: VLC media file - Tamaño: 29’9 MB - Extensión: .mpg Prueba 8 - Tipo de archivo: Archivo de película - Tamaño: 9’29 MB - Extensión: .mpeg 62
    • 4. DESCRIPCIÓN INFORMÁTICA 4.5. Uso de la herramienta En este apartado se describe un tutorial que proporciona las instrucciones necesarias para poder ejecutar y utilizar la aplicación de forma correcta y eficiente. 4.5.1. Ejecutar la aplicación Ejecutar el archivo jvlc-leela.jar con la máquina virtual de Java (JVM). Esto se puede realizar de varias maneras como: “Menú contextual del archivo (Botón derecho) / Abrir con / Java ™ Platform SE binary” o por la consola de comandos mediante la instrucción java –jar jvlc-leela.jar. Si se desea ejecutar sin necesidad de descargarse la aplicación, se hace uso de la tecnología JNLP. Para que esto funcione, es un requisito indispensable tener instalado el reproductor VLC media player. 4.5.2. Cargar subtítulos Para ver una película o escuchar una canción con subtítulos, primero se cargan los subtítulos en “Archivo / Cargar subtítulos / Seleccionar el archivo” en la pista principal (Subtítulos 1) o en la pista secundaria (Subtítulos 2). Luego se abre el archivo de vídeo en “Archivo / Abrir archivo… / Seleccionar el archivo”. Para ver y ocultar los subtítulos: “Subtítulos / Mostrar subtítulos”. Aparecerá una ventana en la parte inferior de la pantalla que estará siempre visible. Los botones (Subt 1 y Subt 2) que hay al lado de las pistas de subtítulos sirven para activarlos y desactivarlos al pulsarlos. Si se desea cargar nuevos subtítulos es necesario para la reproducción. Los formatos aceptados para los subtítulos son los que tienen extensión .srt para películas y .lrc para letras de canciones. Si el formato no es correcto se indica la primera línea que provoca el error mediante un mensaje en una nueva ventana. No se aceptan directorios que contengan tildes en alguna palabra de la ruta. Las rutas con tildes no son reconocidas correctamente por la librería JVLC. 63
    • 4. DESCRIPCIÓN INFORMÁTICA 4.5.3. Controles La explicación de los controles y opciones se completa con capturas de pantalla. En la figura 4.5.3.1 se pueden ver todas las ventanas activadas. En la figuras 4.5.3.2, 4.5.3.3, 4.5.3.4 y 4.5.3.5 se aprecian los menús desplegados “Archivo”, “Reproducción”, “Subtítulos” y “Ayuda”, respectivamente. PLAY / PAUSE Activar y pausar la reproducción actual. STOP Parar la reproducción actual y poner el progreso a cero, además de eliminar los subtítulos cargados. Es necesario para añadir más elementos a la lista de reproducción y para cargar nuevos subtítulos. VOLUMEN El volumen se controla arrastrando con el ratón la barra deslizadora. SILENCIO Si se pulsa el altavoz, la reproducción se queda sin volumen. Si se vuelve a pulsar, se recupera. Figura 4.5.3.1: Interfaz completa. 64
    • 4. DESCRIPCIÓN INFORMÁTICA Archivo / Abrir archivo... Mostrar una ventana para seleccionar el archivo de audio o vídeo que se desea reproducir. Archivo / Cargar subtítulos Mostrar una ventana para seleccionar el archivo de texto con el contenido de los subtítulos. Se puede elegir cargar los subtítulos principales o los secundarios. Archivo / Salir Cerrar la aplicación. Figura 4.5.3.2: Menú “Archivo”. 65
    • 4. DESCRIPCIÓN INFORMÁTICA Reproducción / Siguiente Pasar a reproducir el siguiente elemento en la lista de reproducción. Reproducción / Previo Pasar a reproducir el anterior elemento en la lista de reproducción Reproducción / Avanzar Avanzar 10 segundos la reproducción actual. Reproducción / Retrasar Retrasar 10 segundos la reproducción actual Reproducción / Repetir Repetir la última frase. Sólo es posible si hay subtítulos cargados. Reproducción / Cambio de audio Es útil para archivos duales. Si está activada la pista 1 pasa a la 2, y viceversa. Reproducción / Lista de reproducción Mostrar en una ventana todos archivos añadidos a la lista de reproducción. Figura 4.5.3.3: Menú “Reproducción”. 66
    • 4. DESCRIPCIÓN INFORMÁTICA Subtítulos / Sincronizar Mostrar una ventana en la que se puede introducir un número que representa en milisegundos el tiempo necesario para ajustar los subtítulos a la imagen. Subtítulos / Mostrar subtítulos Si la ventana de los subtítulos está oculta la muestra, y si no, la oculta. Subtítulos /¿Qué ha dicho? Muestra en una ventana la última frase según el contenido de los subtítulos principales. Figura 4.5.3.4: Menú “Subtítulos”. 67
    • 4. DESCRIPCIÓN INFORMÁTICA Ayuda / Instrucciones Abrir este tutorial en un navegador, o en su defecto, una ventana con la url del tutorial on-line. Ayuda / Botones de consulta Mostrar una ventana con los botones ¿Qué ha dicho? y Repetir. Ayuda / Acerca de… Mostrar una ventana con datos de la aplicación. Figura 4.5.3.5: Menú “Ayuda”. 68
    • 5. CONCLUSIONES Y TRABAJOS FUTUROS 5. Conclusiones y trabajos futuros Las conclusiones obtenidas al finalizar el proyecto han sido que la programación relativa a las tecnologías multimedia es tan interesante como compleja. Los programas que existen en la actualidad para reproducir archivos de vídeo tienen muchas funcionalidades, cuya implementación está muy elaborada. En cuanto a las diversas aplicaciones para aprender idiomas, cada una sigue un método diferente, pero todas intentan hacerlo de una forma eficaz y sobretodo amena, para que los usuarios no las vean como una actividad obligada y aburrida. A la conclusión del proyecto se han conseguido realizar con éxito los objetivos previstos al inicio del desarrollo y se ha cumplido con los requisitos impuestos para la aplicación. Como trabajos futuros y posibles mejoras en la aplicación se pueden tener en cuenta los siguientes aspectos: Personalización de usuarios utilizando una base de datos donde se almacene el nivel de cada usuario, su progreso y cualquier información que se considere relevante. Poder seleccionar entre varios niveles de dificultad que permitan usar los subtítulos de forma más eficiente, como ocultando palabras sencillas o evitando mostrar frases que se repiten. Mejorar el analizador para que acepte más tipos de formatos de subtítulos, como los formatos con etiquetas para editar el estilo del texto. 69
    • BIBLIOGRAFÍA Bibliografía [1] Speak Up: http://www.rbaedipresse.es/revista.php?id=36 [2] ABAEnglish: http://www.abaenglish.com/Clases-ingles.html [3] Buensoft: http://www.buensoft.com/spanish/index.htm [4] BYKI: http://www.byki.es/byki_descr.shtml [5] Speaking Hangman: http://www.athenasoft.net/hangman/index.en.php [6] WordReference: http://www.wordreference.com/definition/ [7] Windows Media Player: http://www.microsoft.com/windows/windowsmedia/player/11/default.aspx [8] VLC media player: http://www.videolan.org/ [9] QuickTime Player: http://www.apple.com/quicktime/ [10] BS.Player: http://www.bsplayer.org/ [11] FLV Player: http://www.martijndevisser.com/blog/flv-player/ [12] GOM Media Player: http://www.gomlab.com/eng/ [13] Media Player Classic Homecinema: http://mpc-hc.sourceforge.net/index.html [14] Winamp: http://www.winamp.com/ [15] I. Jacobson, G. Booch, y J. Rumbaugh: The unified software development process, Massachusetts: Addison-Wesley (1999) [16] XP: http://www.extremeprogramming.org/ [17] Timothy Budd: An introduction to object-oriented programming, Addison-Wesley [18] Bruce Eckel: Thinking in Java, Prentice Hall [19] JMF: http://java.sun.com/javase/technologies/desktop/media/jmf/ [20] GStreamer: http://www.gstreamer.net/ [21] FMJ: http://fmj-sf.net/ [22] VideoLAN: http://www.videolan.org/project/ [23] AWT: http://java.sun.com/products/jdk/awt/ [24] SWT: http://www.eclipse.org/swt/ [25] Swing: http://java.sun.com/docs/books/tutorial/uiswing/ [26] Java 6 u12: http://java.dzone.com:80/news/a-farewell-heavyweightlightwei [27] Iconos: http://www.iconarchive.com/category/application/button-icons-by-deleket.html [28] GIMP: http://www.gimp.org/ [29] Eclipse: http://www.eclipse.org/ 70
    • BIBLIOGRAFÍA [30] Subversive: http://download.eclipse.org/technology/subversive/0.7/update-site [31] Checkstyle: http://eclipse-cs.sourceforge.net/update [32] NetBeans: http://www.netbeans.org/ [33] SourceForge: http://sourceforge.net/ [34] WinSCP: http://winscp.net [35] HyperCam: http://www.hyperionics.com/hc/index.asp [36] YouTube: http://www.youtube.com/ [37] TinyPic: http://es.tinypic.com/ [38] JNLP: http://java.sun.com/developer/technicalArticles/Programming/jnlp/ [39] Sintaxis JNLP: http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/syntax.html [40] Tomcat: http://tomcat.apache.org/ [41] Subtitle Workshop: http://www.urusoft.net/products.php?cat=sw&lang=2 [42] G. Booch, J. Rumbaugh y I. Jacobson: The unified modeling language user guide, Reading, MA: Addison-Wesley (1999) [43] JUDE COMMUNITY: http://jude-users.com/en/ [44] M. Gallego y M. S. Montalvo: Interfaces gráficas en Java, Editorial universitaria Ramón Areces (2005) 71
    • 6. APÉNDICE 6. Apéndice 6.1. GNU General Public License version 3.0 (GPLv3) Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. http://fsf.org/ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. 72
    • 6. APÉNDICE Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate 73
    • 6. APÉNDICE copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. 74
    • 6. APÉNDICE You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: o a) The work must carry prominent notices stating that you modified it, and giving a relevant date. 75
    • 6. APÉNDICE o b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. o c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. o d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: o a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. o b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. o c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. o d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may 76
    • 6. APÉNDICE be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. o e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an 77
    • 6. APÉNDICE implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: o a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or o b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or o c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or o d) Limiting the use for publicity purposes of names of licensors or authors of the material; or o e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or o f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. 78
    • 6. APÉNDICE If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. 79
    • 6. APÉNDICE An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. 80
    • 6. APÉNDICE If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. 81
    • 6. APÉNDICE Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. 82
    • 6. APÉNDICE END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/>. Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: <program> Copyright (C) <year> <name of author> This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. 83
    • 6. APÉNDICE 6.2. Licencia de Creative Commons Reconocimiento-CompartirIgual 3.0 España LA OBRA O LA PRESTACIÓN (SEGÚN SE DEFINEN MÁS ADELANTE) SE PROPORCIONA BAJO LOS TÉRMINOS DE ESTA LICENCIA PÚBLICA DE CREATIVE COMMONS (CCPL O LICENCIA). LA OBRA O LA PRESTACIÓN SE ENCUENTRA PROTEGIDA POR LA LEY ESPAÑOLA DE PROPIEDAD INTELECTUAL Y/O CUALESQUIERA OTRAS NORMAS QUE RESULTEN DE APLICACIÓN. QUEDA PROHIBIDO CUALQUIER USO DE LA OBRA O PRESTACIÓN DIFERENTE A LO AUTORIZADO BAJO ESTA LICENCIA O LO DISPUESTO EN LA LEY DE PROPIEDAD INTELECTUAL. MEDIANTE EL EJERCICIO DE CUALQUIER DERECHO SOBRE LA OBRA O LA PRESTACIÓN, USTED ACEPTA Y CONSIENTE LAS LIMITACIONES Y OBLIGACIONES DE ESTA LICENCIA, SIN PERJUICIO DE LA NECESIDAD DE CONSENTIMIENTO EXPRESO EN CASO DE VIOLACIÓN PREVIA DE LOS TÉRMINOS DE LA MISMA. EL LICENCIADOR LE CONCEDE LOS DERECHOS CONTENIDOS EN ESTA LICENCIA, SIEMPRE QUE USTED ACEPTE LOS PRESENTES TÉRMINOS Y CONDICIONES. 1. Definiciones a. La obra es la creación literaria, artística o científica ofrecida bajo los términos de esta licencia. b. En esta licencia se considera una prestación cualquier interpretación, ejecución, fonograma, grabación audiovisual, emisión o transmisión, mera fotografía u otros objetos protegidos por la legislación de propiedad intelectual vigente aplicable. c. La aplicación de esta licencia a una colección (definida más adelante) afectará únicamente a su estructura en cuanto forma de expresión de la selección o disposición de sus contenidos, no siendo extensiva a éstos. En este caso la colección tendrá la consideración de obra a efectos de esta licencia. d. El titular originario es: i. En el caso de una obra literaria, artística o científica, la persona natural o grupo de personas que creó la obra. ii. En el caso de una obra colectiva, la persona que la edite y divulgue bajo su nombre, salvo pacto contrario. ii. En el caso de una interpretación o ejecución, el actor, cantante, músico, o cualquier otra persona que represente, cante, lea, recite, interprete o ejecute en cualquier forma una obra. iv. En el caso de un fonograma, el productor fonográfico, es decir, la persona natural o jurídica bajo cuya iniciativa y responsabilidad se realiza por primera vez una fijación exclusivamente sonora de la ejecución de una obra o de otros sonidos. v. En el caso de una grabación audiovisual, el productor de la grabación, es decir, la persona natural o jurídica que tenga la iniciativa y asuma la 84
    • 6. APÉNDICE responsabilidad de las fijaciones de un plano o secuencia de imágenes, con o sin sonido. vi. En el caso de una emisión o una transmisión, la entidad de radiodifusión. vii. En el caso de una mera fotografía, aquella persona que la haya realizado. viii. En el caso de otros objetos protegidos por la legislación de propiedad intelectual vigente, la persona que ésta señale. e. Se considerarán obras derivadas aquellas obras creadas a partir de la licenciada, como por ejemplo: las traducciones y adaptaciones; las revisiones, actualizaciones y anotaciones; los compendios, resúmenes y extractos; los arreglos musicales y, en general, cualesquiera transformaciones de una obra literaria, artística o científica. Para evitar la duda, si la obra consiste en una composición musical o grabación de sonidos, la sincronización temporal de la obra con una imagen en movimiento (synching) será considerada como una obra derivada a efectos de esta licencia. f. Tendrán la consideración de colecciones la recopilación de obras ajenas, de datos o de otros elementos independientes como las antologías y las bases de datos que por la selección o disposición de sus contenidos constituyan creaciones intelectuales. La mera incorporación de una obra en una colección no dará lugar a una derivada a efectos de esta licencia. g. El licenciador es la persona o la entidad que ofrece la obra o prestación bajo los términos de esta licencia y le concede los derechos de explotación de la misma conforme a lo dispuesto en ella. h. Usted es la persona o la entidad que ejercita los derechos concedidos mediante esta licencia y que no ha violado previamente los términos de la misma con respecto a la obra o la prestación, o que ha recibido el permiso expreso del licenciador de ejercitar los derechos concedidos mediante esta licencia a pesar de una violación anterior. i. La transformación de una obra comprende su traducción, adaptación y cualquier otra modificación en su forma de la que se derive una obra diferente. La creación resultante de la transformación de una obra tendrá la consideración de obra derivada. j. Se entiende por reproducción la fijación directa o indirecta, provisional o permanente, por cualquier medio y en cualquier forma, de toda la obra o la prestación o de parte de ella, que permita su comunicación o la obtención de copias. k. Se entiende por distribución la puesta a disposición del público del original o de las copias de la obra o la prestación, en un soporte tangible, mediante su venta, alquiler, préstamo o de cualquier otra forma. l. Se entiende por comunicación pública todo acto por el cual una pluralidad de personas, que no pertenezcan al ámbito doméstico de quien la lleva a cabo, pueda tener acceso a la obra o la prestación sin previa distribución de ejemplares a cada una de ellas. Se considera comunicación pública la puesta a disposición del 85
    • 6. APÉNDICE público de obras o prestaciones por procedimientos alámbricos o inalámbricos, de tal forma que cualquier persona pueda acceder a ellas desde el lugar y en el momento que elija. m. La explotación de la obra o la prestación comprende la reproducción, la distribución, la comunicación pública y, en su caso, la transformación. m. Los elementos de la licencia son las características principales de la licencia según la selección efectuada por el licenciador e indicadas en el título de esta licencia: Reconocimiento, CompartirIgual. o. Una licencia equivalente es: i. Una versión posterior de esta licencia de Creative Commons con los mismos elementos de licencia. ii. La misma versión o una versión posterior de esta licencia de cualquier otra jurisdicción reconocida por Creative Commons con los mismos elementos de la licencia (ejemplo: Reconocimiento-CompartirIgual 3.0 Japón). iii. La misma versión o una versión posterior de la licencia de Creative Commons no adaptada a ninguna jurisdicción (Unported) con los mismos elementos de la licencia. iv. Una de las licencias compatibles que aparece en http://creativecommons.org/compatiblelicenses y que ha sido aprobada por Creative Commons como esencialmente equivalente a esta licencia porque, como mínimo: a. Contiene términos con el mismo propósito, el mismo significado y el mismo efecto que los elementos de esta licencia. b. Permite explícitamente que las obras derivadas de obras sujetas a ella puedan ser distribuidas mediante esta licencia, la licencia de Creative Commons no adaptada a ninguna jurisdicción (Unported) o una licencia de cualquier otra jurisdicción reconocida por Creative Commons, con sus mismos elementos de licencia. 2. Límites de los derechos. Nada en esta licencia pretende reducir o restringir cualesquiera límites legales de los derechos exclusivos del titular de los derechos de propiedad intelectual de acuerdo con la Ley de propiedad intelectual o cualesquiera otras leyes aplicables, ya sean derivados de usos legítimos, tales como la copia privada o la cita, u otras limitaciones como la resultante de la primera venta de ejemplares (agotamiento). 3. Concesión de licencia. Conforme a los términos y a las condiciones de esta licencia, el licenciador concede, por el plazo de protección de los derechos de propiedad intelectual y a título gratuito, una licencia de ámbito mundial no exclusiva que incluye los derechos siguientes: a. Derecho de reproducción, distribución y comunicación pública de la obra o la prestación. b. Derecho a incorporar la obra o la prestación en una o más colecciones. 86
    • 6. APÉNDICE c. Derecho de reproducción, distribución y comunicación pública de la obra o la prestación lícitamente incorporada en una colección. d. Derecho de transformación de la obra para crear una obra derivada siempre y cuando se incluya en ésta una indicación de la transformación o modificación efectuada. e. Derecho de reproducción, distribución y comunicación pública de obras derivadas creadas a partir de la obra licenciada. f. Derecho a extraer y reutilizar la obra o la prestación de una base de datos. g. Para evitar cualquier duda, el titular originario: i. Conserva el derecho a percibir las remuneraciones o compensaciones previstas por actos de explotación de la obra o prestación, calificadas por la ley como irrenunciables e inalienables y sujetas a gestión colectiva obligatoria. ii. Renuncia al derecho exclusivo a percibir, tanto individualmente como mediante una entidad de gestión colectiva de derechos, cualquier remuneración derivada de actos de explotación de la obra o prestación que usted realice. Estos derechos se pueden ejercitar en todos los medios y formatos, tangibles o intangibles, conocidos en el momento de la concesión de esta licencia. Los derechos mencionados incluyen el derecho a efectuar las modificaciones que sean precisas técnicamente para el ejercicio de los derechos en otros medios y formatos. Todos los derechos no concedidos expresamente por el licenciador quedan reservados, incluyendo, a título enunciativo pero no limitativo, los derechos morales irrenunciables reconocidos por la ley aplicable. En la medida en que el licenciador ostente derechos exclusivos previstos por la ley nacional vigente que implementa la directiva europea en materia de derecho sui generis sobre bases de datos, renuncia expresamente a dichos derechos exclusivos. 4. Restricciones. La concesión de derechos que supone esta licencia se encuentra sujeta y limitada a las restricciones siguientes: a. Usted puede reproducir, distribuir o comunicar públicamente la obra o prestación solamente bajo los términos de esta licencia y debe incluir una copia de la misma, o su Identificador Uniforme de Recurso (URI). Usted no puede ofrecer o imponer ninguna condición sobre la obra o prestación que altere o restrinja los términos de esta licencia o el ejercicio de sus derechos por parte de los concesionarios de la misma. Usted no puede sublicenciar la obra o prestación. Usted debe mantener intactos todos los avisos que se refieran a esta licencia y a la ausencia de garantías. Usted no puede reproducir, distribuir o comunicar públicamente la obra o prestación con medidas tecnológicas que controlen el acceso o el uso de una manera contraria a los términos de esta licencia. Esta sección 4.a también afecta a la obra o prestación incorporada en una colección, pero ello no implica que ésta en su conjunto quede automáticamente o deba quedar sujeta a los términos de la misma. En el caso que le sea requerido, previa comunicación del licenciador, si usted incorpora la obra en una colección y/o crea 87
    • 6. APÉNDICE una obra derivada, deberá quitar cualquier crédito requerido en el apartado 4.c, en la medida de lo posible. b. Usted puede distribuir o comunicar públicamente una obra derivada en el sentido de esta licencia solamente bajo los términos de la misma u otra licencia equivalente. Si usted utiliza esta misma licencia debe incluir una copia o bien su URI, con cada obra derivada que usted distribuya o comunique públicamente. Usted no puede ofrecer o imponer ningún término respecto a la obra derivada que altere o restrinja los términos de esta licencia o el ejercicio de sus derechos por parte de los concesionarios de la misma. Usted debe mantener intactos todos los avisos que se refieran a esta licencia y a la ausencia de garantías cuando distribuya o comunique públicamente la obra derivada. Usted no puede ofrecer o imponer ningún término respecto de las obras derivadas o sus transformaciones que alteren o restrinjan los términos de esta licencia o el ejercicio de sus derechos por parte de los concesionarios de la misma. Usted no puede reproducir, distribuir o comunicar públicamente la obra derivada con medidas tecnológicas que controlen el acceso o uso de la obra de una manera contraria a los términos de esta licencia. Si utiliza una licencia equivalente debe cumplir con los requisitos que ésta establezca cuando distribuya o comunique públicamente la obra derivada. Todas estas condiciones se aplican a una obra derivada en tanto que incorporada a una colección, pero no implica que ésta tenga que estar sujeta a los términos de esta licencia. c. Si usted reproduce, distribuye o comunica públicamente la obra o la prestación, una colección que la incorpore o cualquier obra derivada, debe mantener intactos todos los avisos sobre la propiedad intelectual e indicar, de manera razonable conforme al medio o a los medios que usted esté utilizando: i. El nombre del autor original, o el seudónimo si es el caso, así como el del titular originario, si le es facilitado. ii. El nombre de aquellas partes (por ejemplo: institución, publicación, revista) que el titular originario y/o el licenciador designen para ser reconocidos en el aviso legal, las condiciones de uso, o de cualquier otra manera razonable. iii. El título de la obra o la prestación si le es facilitado. iv. El URI, si existe, que el licenciador especifique para ser vinculado a la obra o la prestación, a menos que tal URI no se refiera al aviso legal o a la información sobre la licencia de la obra o la prestación. v. En el caso de una obra derivada, un aviso que identifique la transformación de la obra en la obra derivada (p. ej., "traducción castellana de la obra de Autor Original," o "guión basado en obra original de Autor Original"). Este reconocimiento debe hacerse de manera razonable. En el caso de una obra derivada o incorporación en una colección estos créditos deberán aparecer como mínimo en el mismo lugar donde se hallen los correspondientes a otros autores o titulares y de forma comparable a los mismos. Para evitar la duda, los créditos requeridos en esta sección sólo serán utilizados a efectos de atribución de la obra o la prestación en la manera especificada anteriormente. Sin un permiso previo por escrito, usted no puede afirmar ni dar a entender implícitamente ni explícitamente ninguna conexión, patrocinio o aprobación por parte del titular 88
    • 6. APÉNDICE originario, el licenciador y/o las partes reconocidas hacia usted o hacia el uso que hace de la obra o la prestación. d. Para evitar cualquier duda, debe hacerse notar que las restricciones anteriores (párrafos 4.a, 4.b y 4.c) no son de aplicación a aquellas partes de la obra o la prestación objeto de esta licencia que únicamente puedan ser protegidas mediante el derecho sui generis sobre bases de datos recogido por la ley nacional vigente implementando la directiva europea de bases de datos 5. Exoneración de responsabilidad A MENOS QUE SE ACUERDE MUTUAMENTE ENTRE LAS PARTES, EL LICENCIADOR OFRECE LA OBRA O LA PRESTACIÓN TAL CUAL (ON AN "AS-IS" BASIS) Y NO CONFIERE NINGUNA GARANTÍA DE CUALQUIER TIPO RESPECTO DE LA OBRA O LA PRESTACIÓN O DE LA PRESENCIA O AUSENCIA DE ERRORES QUE PUEDAN O NO SER DESCUBIERTOS. ALGUNAS JURISDICCIONES NO PERMITEN LA EXCLUSIÓN DE TALES GARANTÍAS, POR LO QUE TAL EXCLUSIÓN PUEDE NO SER DE APLICACIÓN A USTED. 6. Limitación de responsabilidad. SALVO QUE LO DISPONGA EXPRESA E IMPERATIVAMENTE LA LEY APLICABLE, EN NINGÚN CASO EL LICENCIADOR SERÁ RESPONSABLE ANTE USTED POR CUALESQUIERA DAÑOS RESULTANTES, GENERALES O ESPECIALES (INCLUIDO EL DAÑO EMERGENTE Y EL LUCRO CESANTE), FORTUITOS O CAUSALES, DIRECTOS O INDIRECTOS, PRODUCIDOS EN CONEXIÓN CON ESTA LICENCIA O EL USO DE LA OBRA O LA PRESTACIÓN, INCLUSO SI EL LICENCIADOR HUBIERA SIDO INFORMADO DE LA POSIBILIDAD DE TALES DAÑOS. 7. Finalización de la licencia a. Esta licencia y la concesión de los derechos que contiene terminarán automáticamente en caso de cualquier incumplimiento de los términos de la misma. Las personas o entidades que hayan recibido de usted obras derivadas o colecciones bajo esta licencia, sin embargo, no verán sus licencias finalizadas, siempre que tales personas o entidades se mantengan en el cumplimiento íntegro de esta licencia. Las secciones 1, 2, 5, 6, 7 y 8 permanecerán vigentes pese a cualquier finalización de esta licencia. b. Conforme a las condiciones y términos anteriores, la concesión de derechos de esta licencia es vigente por todo el plazo de protección de los derechos de propiedad intelectual según la ley aplicable. A pesar de lo anterior, el licenciador se reserva el derecho a divulgar o publicar la obra o la prestación en condiciones distintas a las presentes, o de retirar la obra o la prestación en cualquier momento. No obstante, ello no supondrá dar por concluida esta licencia (o cualquier otra licencia que haya sido concedida, o sea necesario ser concedida, bajo los términos de esta licencia), que continuará vigente y con efectos completos a no ser que haya finalizado conforme a lo establecido anteriormente, sin perjuicio del derecho moral de arrepentimiento en los términos reconocidos por la ley de propiedad intelectual aplicable. 89
    • 6. APÉNDICE 8. Miscelánea a. Cada vez que usted realice cualquier tipo de explotación de la obra o la prestación, o de una colección que la incorpore, el licenciador ofrece a los terceros y sucesivos licenciatarios la concesión de derechos sobre la obra o la prestación en las mismas condiciones y términos que la licencia concedida a usted. b. Cada vez que usted realice cualquier tipo de explotación de una obra derivada, el licenciador ofrece a los terceros y sucesivos licenciatarios la concesión de derechos sobre la obra objeto de esta licencia en las mismas condiciones y términos que la licencia concedida a usted. c. Si alguna disposición de esta licencia resulta inválida o inaplicable según la Ley vigente, ello no afectará la validez o aplicabilidad del resto de los términos de esta licencia y, sin ninguna acción adicional por cualquiera las partes de este acuerdo, tal disposición se entenderá reformada en lo estrictamente necesario para hacer que tal disposición sea válida y ejecutiva. d. No se entenderá que existe renuncia respecto de algún término o disposición de esta licencia, ni que se consiente violación alguna de la misma, a menos que tal renuncia o consentimiento figure por escrito y lleve la firma de la parte que renuncie o consienta. e. Esta licencia constituye el acuerdo pleno entre las partes con respecto a la obra o la prestación objeto de la licencia. No caben interpretaciones, acuerdos o condiciones con respecto a la obra o la prestación que no se encuentren expresamente especificados en la presente licencia. El licenciador no estará obligado por ninguna disposición complementaria que pueda aparecer en cualquier comunicación que le haga llegar usted. Esta licencia no se puede modificar sin el mutuo acuerdo por escrito entre el licenciador y usted. 90
    • 6. APÉNDICE 91