Home UC3M
Home IT

Práctica 4

JMF: control de video

OBJETIVO

En esta sesión aprenderemos a acceder individualmente a los cuadros de un video en Java Media Framework.

ENUNCIADO

En esta práctica vamos a ampliar el reproductor que hicimos en la práctica anterior, añadiendo una funcionalidad que podemos encontrar integrada frecuentemente en reproductores de vídeo (VHS) y DVD comerciales. Se trata del avance y retroceso cuadro a cuadro.

Esta funcionalidad se puede implementar de diversas maneras, pero para el propósito del laboratorio haremos lo siguiente: usaremos los botones de fast forward y rewind para movernos cuadro a cuadro cuando estemos en PAUSE. Es decir, si el usuario pausa el vídeo, y con el vídeo pausado se pulsa fast forward o rewind, el vídeo avanzará o retrocederá un cuadro de cada vez.

Si el usuario pulsa fast forward o rewind, cuando el vídeo se está reproduciendo, entonces avanzaremos o retrocederemos 2 segundos en el stream, el mismo comportamiento que habíamos descrito para la práctica anterior.

Para implementar esta funcionalidad, JMF nos proporciona la interfaz FramePositioningControl (leed el api ahora!). Usaréis este control para acceder al cuadro que os interesa, pero tenéis que tener en cuenta que este tipo de control no se soporta para todos los tipos de medios. Esto es porque dependiendo del tipo de compresión de vídeo, puede ser muy complicado acceder de manera eficiente a un cuadro aleatorio del stream sin tener que decodificar el stream entero.

Para aquellos casos en los que JMF no os proporcione un FramePositioningControl, el reproductor deberá desplazarse 2 segundos hacia adelante o hacia atrás en el stream, como cuando estamos en PLAY.

IMPLEMENTACIÓN

Usaremos como esqueleto el mismo reproductor de la práctica pasada, con el que ya estáis familiarizados.

Deberéis modificar los métodos forward y rewind para que implementen el comportamiento descrito. Tened en cuenta que ahora, el reproductor debe distinguir cuándo está parado de cuándo está en pausa. Para implementar esto, es recomendable sustituir la variable booleana isPlaying por una variable de estado que almacene un enumerado como el siguiente:

public enum State { STOPPED, PLAYING, PAUSED }

Para aquellos alumnos que no dispongan de una clase PlayerFacade funcional (práctica 3), se os proporciona una ya compilada:

Esta clase delega las funciones de fast forward y rewind en una clase que debereis implementar vosotros, de la cual se proporciona el esqueleto:

Recordad que para compilar y ejecutar programas con JMF, es necesario configurar adecuadamente el entorno de desarrollo. Revisad las instrucciones de la práctica anterior si tenéis dudas.

VIDEOS DE PRUEBA

  • demo.avi: Video grabado en formato moving jpeg, sobre el que JMF proporciona acceso aleatorio a cuadros individuales.
  • tren.mpeg: El clásico vídeo del tren en formato MPEG. Veréis que para este formato JMF no os da acceso a cuadros individuales.

DOCUMENTACIÓN