Title: Control de medios en MHP
1Control de medios en MHP
2Índice
- Introducción accediendo a contenidos
- Referenciando contenidos (Locators)
- Tipos de locators
- Creación de locators
- Reproduciendo contenidos
- Player, Control, DataSource
- La clase Manager
- Proceso de creación de un player
- Controls
- Ejemplos
- Bibliografía
3Introducción accediendo a contenidos (1/2)
- Los contenidos accesibles por una aplicación MHP
se pueden dividir en - Contenidos DVB Streaming
- Transport strems, servicios, elementary streams y
eventos. - Contenidos del Object Carousel (broadcast file
system) - Archivos de audio o video.
- Necesaria una estandarización de cómo el receptor
accede a estos diferentes contenidos.
4Introducción accediendo a contenidos (2/2)
- Objetivo crear referencias al Object Carousel
útiles para - Diseñador de aplicaciones (que es el que escribe
el código que crea estas referencias) - Middleware (que es el que realmente las usa)
- Primera aproximación
- Usar una URL. Pero la clase java.net.URL fue
diseñada pensando sobre todo en conexiones IP y
no es fácil la adaptación para su uso en TV
digital. - Solución
- Para evitar los problemas de la clase URL, MHP
utiliza el concepto de locator.
5Índice
- Introducción accediendo a contenidos
- Referenciando contenidos (Locators)
- Tipos de locators
- Creación de locators
- Reproduciendo contenidos
- Player, Control, DataSource
- La clase Manager
- Proceso de creación de un player
- Controls
- Ejemplos
- Bibliografía
6Referenciando contenidos (Locators) (1/2)
- Locator
- Objeto que representa una referencia a un
determinado contenido. - NO define como se almacena esta referencia. Es el
middleware el que elije el formato que mejor
convenga y sea más eficiente para un tipo de
locator dado. - Pueden usar como representación interna una URL u
otra representación que optimice las cosas
(números, punteros)
7Referenciando contenidos (Locators) (2/2)
- Ventajas de los locators
- Facilitan el trabajo a los implementadores de
middleware porque pueden almacenar cualquier
información que necesiten sobre la localización
de un contenido determinado. - Desventajas de los locators
- Hacen que los diseñadores de aplicaciones deban
trabajar con locators ? Necesaria una
representación externa estandarizada para los
locators (external form) que, a día de hoy, es un
string representando una URL. - Ni la URL es el locator ni tampoco el locator es
la URL. - Son dos objetos distintos pero que refieren al
mismo contenido. - El locator puede usar como representación interna
una URL pero no tiene porqué.
8Índice
- Introducción accediendo a contenidos
- Referenciando contenidos (Locators)
- Tipos de locators
- Creación de locators
- Reproduciendo contenidos
- Player, Control, DataSource
- La clase Manager
- Proceso de creación de un player
- Controls
- Ejemplos
- Bibliografía
9Tipos de locators (1/10)
- Tipos de locators
- En función del contenido al que refieren
- Locators para contenidos DVB Streaming
- Locators para archivos
- Locators para Video Drips
- En función de la clase que los implementa
- org.davic.net.Locator
- javax.media.MediaLocator
10Tipos de locators (2/10)Locators para contenidos
DVB Streaming
- Locators para contenidos DVB Streaming
- Sintaxis
- dvb//ltonIDgt.lttsIDgt.ltsIDgt.ltctaggtltctaggtltevI
Dgt/ltpathgt - onID ? original network ID, que identifica al
broadcaster o a la red que produce el contenido
(no la red que actualmente está siendo difundida,
si son diferentes) - tsID ? transport stream ID, que identifica un
transport stream específico que la red esta
difundiendo. - sID ? service ID, que identifica un servicio
dentro del transport stream anterior. - ctag ? component Tag, que identifica un
elementary stream específico que ha sido
etiquetado (tagged) en el service information. - evID ? event ID, que identifica un evento
específico que forma parte del servicio. - path ? ruta hasta un archivo en el object
carousel en el que está siendo transmitido el
elementary stream. - Solo los tres primeros elementos son necesarios ?
Una URL en sistemas DVB debe referir siempre a un
servicio.
11Tipos de locators (3/10)
- Tipos de locators
- En función del contenido al que refieren
- Locators para contenidos DVB Streaming
- Locators para archivos
- Locators para Video Drips
- En función de la clase que los implementa
- org.davic.net.Locator
- javax.media.MediaLocator
12Tipos de locators (4/10)Locators para archivos
(1/2)
- Locators para archivos
- Aunque el formato anterior también puede referir
a un archivo, puede resultar una tarea un poco
ardua ya que los locators dvb// pueden referir a
cualquier archivo en cualquier object carousel de
cualquier servicio. - Se pueden usar URLs del tipo file// seguida de
la ruta absoluta hasta el archivo de interés. - Problema no se sabe dónde MHP va a montar el
object carousel ? difícil conocer la ruta
completa. - Solución obtener la URL de un archivo en el
object carousel a partir del propio archivo.
13Tipos de locators (5/10)Locators para archivos
(2/2)
- Ejemplo (acceso a un archivo de audio)
- //Se crea un objeto DSM-CC que refiera al
archivo en el carousel - //Destacar que la ruta es relativa al directorio
root (Service Gateway) - //de la aplicación
- DSMCCObject miObjetoDSMCC
- miObjetoDSMCC new DSMCCObject("audios/audio1.mp
2") - //Se obtiene la URL llamando al método getURL()
- URL miURL miObjetoDSMCC.getURL()
- //Una vez que se tiene la URL se puede crear un
javax.tv.locator.Locator, - //un javax.media.MediaLocator y a partir de él
crear el player o bien - //crear el player directamente. A modo de
ejemplo se muestra la primera //opcion - try
- LocatorFactory lf LocatorFactory.getInstance()
- Locator miLocalizador lf.createLocator(miURL.t
oString()) -
- catch (MalformedLocatorException e)
-
14Tipos de locators (6/10)
- Tipos de locators
- En función del contenido al que refieren
- Locators para contenidos DVB Streaming
- Locators para archivos
- Locators para Video Drips
- En función de la clase que los implementa
- org.davic.net.Locator
- javax.media.MediaLocator
15Tipos de locators (7/10)Locators para VideoDrips
- Locators para Video Drips
- Video drips
- Formato que provee un mecanismo eficiente, en
cuanto a memoria, para mostrar varias imágenes
similares. - Pequeños video clips MPEG-2 compuestos únicamente
por - Una I-frame que es la que primero se decodifica.
- Una o varias P-frames que son decodificadas en
base a la primera I-frame. - Los datos se pasan a la API de control de medio a
través de un array de bytes, por lo que el
contenido debe estar ya en memoria ? realmente
este formato no tiene un locator que indique de
dónde se cargan los datos. - Aún así existe un formato URL para crear
locators a Video Drips ? dripfeed//, que informa
al locator acerca del formato del contenido pero
sin necesidad de referir a un contenido
específico. - En el apartado de ejemplos veremos esto con más
detalle.
16Tipos de locators (8/10)
- Tipos de locators
- En función del contenido al que refieren
- Locators para contenidos DVB Streaming
- Locators para archivos
- Locators para Video Drips
- En función de la clase que los implementa
- org.davic.net.Locator
- javax.media.MediaLocator
17Tipos de locators (9/10)En función de la clase
que los implementa (1/2)
- Gran variedad de clases que implementan a los
locators pero afortunadamente hay dos jerarquías
principales y están relacionadas - org.davic.net.Locator
- Usada para todo menos para el media control.
Tiene como clase padre a javax.tv.locator.Locator
y refiere a cualquier contenido broadcast. - Subclases
- org.davic.net.dvb.DvbLocator ? para referir a
transport streams y servicios en redes DVB. - org.dvb.locator.FrequencyLocator ? para referir a
servicios transportados en transport streams que
no tienen información de servicio. - javax.media.MediaLocator
- Sólo se usa para el media control. Lo usa JMF
para referir al media clip que va a presentar,
con lo que puede referir a un servicio DVB, a un
componente del servicio, a un audio clip o a un
video drip. - Subclase
- org.davic.media.MediaLocator ? para servir de
puente entre JMF y el resto del sistema, es
decir, entre JMF MediaLocator y los JavaTV
Locator.
18Tipos de locators (10/10)En función de la clase
que los implementa (2/2)
- No es posible convertir un
MediaLocator en un
org.davic.net.Locator ni
construir el
segundo a partir
del primero. Habrá que usar
la external form del
MediaLocator para crear un
org.davic.net.Locator
. - La existencia de la clase org.davic.media.MediaLoc
ator en la segunda jerarquía hace posible que las
aplicaciones puedan construir MediaLocators a
partir de org.davic.net.Locators.
19Índice
- Introducción accediendo a contenidos
- Referenciando contenidos (Locators)
- Tipos de locators
- Creación de locators
- Reproduciendo contenidos
- Player, Control, DataSource
- La clase Manager
- Proceso de creación de un player
- Controls
- Ejemplos
- Bibliografía
20Creación de locators
- Existen dos propuestas para la construcción de
locators - Creación directa a partir de una URL
- Aplicable a javax.media.MediaLocator y
org.davic.net.Locator - Ejemplo
- javax.media.MediaLocator localizador
- localizador new javax.media.MediaLocator("dvb/
/1.3.1") - Creación indirecta a través de la clase
LocatorFactory - Aplicable a javax.tv.locator.Locator, de hecho,
instancias de esta clase sólo se pueden crear
usando la clase javax.tv.locator.LocatorFactory.
Esta clase proporciona un método createLocator()
que coge como argumento una URL. - Ejemplo
- javax.tv.locator.Locator localizador
- javax.tv.locator.LocatorFactory lf
javax.tv.locator.LocatorFactory.getInstance() - localizador lf.createLocator("dvb//1.3.1.cb")
21Índice
- Introducción accediendo a contenidos
- Referenciando contenidos (Locators)
- Tipos de locators
- Creación de locators
- Reproduciendo contenidos
- Player, Control, DataSource
- La clase Manager
- Proceso de creación de un player
- Controls
- Ejemplos
- Bibliografía
22Player, Control, DataSource
- MHP confía la tarea de decodificación y
reproducción de contenidos audio/video a la API
JMF (Java Media Framework) - JMF tiene 3 conceptos principales
- Player
- Es el elemento principal de la API MHP
- Responsable de decodificar y reproducir el media
- Todos los players son subclases de
javax.media.Player - Control
- Extensión del objeto player que permite añadir
nuevas funcionalidades al player sin tener que
crear una subclase. - Típicamente se usan para proporcionar control
sobre elección de lenguaje, tamaño de video,
intercambio de elementary streams - Todos los controls son subclases de
javax.media.Control - DataSource
- Objeto encargado de proporcionar los datos media
que el player va a decodificar. - Todos los players están siempre asociados a un
objeto DataSource ya que es imposible crear un
player que no tenga un objeto DataSource asociado - Todos los DataSource son subclases de
javax.media.protocol.DataSource
23Índice
- Introducción accediendo a contenidos
- Referenciando contenidos (Locators)
- Tipos de locators
- Creación de locators
- Reproduciendo contenidos
- Player, Control, DataSource
- La clase Manager
- Proceso de creación de un player
- Controls
- Ejemplos
- Bibliografía
24La clase Manager
- No se pueden crear instancias de Player y
DataSource directamente ? hay que usar la clase
Manager para crearlos. - public class Manager
-
- public static Player createPlayer(URL
sourceURL) - public static Player createPlayer(MediaLocator
sourceLocator) - public static Player createPlayer(DataSource
source) -
- public static DataSource createDataSource(URL
sourceURL) - public static DataSource createDataSource(MediaL
ocator sourceLocator) -
- public static TimeBase getSystemTimeBase()
- public static Vector getDataSourceList(String
protocolName) - public static Vector getHandlerClassList(String
contentName) -
- Los métodos más interesantes de esta clase son
- createDataSource()
- Crea una nueva instancia de la clase DataSource
que traerá los datos desde el lugar referido por
la URL o por el MediaLocator (según el método
utilizado) - createPlayer()
- Crea una nueva instancia de la clase Player que
podrá ser usada para reproducir un media clip .
25Índice
- Introducción accediendo a contenidos
- Referenciando contenidos (Locators)
- Tipos de locators
- Creación de locators
- Reproduciendo contenidos
- Player, Control, DataSource
- La clase Manager
- Proceso de creación de un player
- Controls
- Ejemplos
- Bibliografía
26Proceso de creación de un player (1/5)
- Todo player está asociado siempre a un objeto
DataSource por lo que parece lógico pensar que
los players se crean a partir de DataSources. Sin
embargo, de acuerdo a la clase Manager, existen
otros mecanismos - A partir de una URL
- A partir de un MediaLocator
- en los que la clase Manager creará primero el
DataSource del tipo apropiado. - También es posible que una aplicación no cree un
player nuevo sino que obtenga el player del
servicio actual en el que se está ejecutando.
27Proceso de creación de un player (2/5)
- Ejemplo 1 Creación de un nuevo player a partir
de una URL - Obtener una instancia de la clase URL para poder
pasarla como argumento al método createPlayer().
Normalmente invocando a métodos del tipo getURL()
o bien toURL(). - getURL()
- DSMCCObject miObjetoDSMCC
- miObjetoDSMCC new DSMCCObject(audios/audio1.mp2
) - URL miURL miObjetoDSMCC.getURL()
- toURL()
- File archivo new File(audios/audio1.mp2)
- URL miURL archivo.toURL()
- Crear el player usando la clase Manager
- Player player javax.media.Manager.createPlayer(m
iURL) - Invocar al método start() del player. Es entonces
cuando comienza a reproducirse el contenido. - player.start()
28Proceso de creación de un player (3/5)
- Ejemplo 2 Creación de un nuevo player a partir
de un MediaLocator - Crear un MediaLocator a partir de un string URL
- MediaLocator miMediaLocator new
MediaLocator("dvb//1.3.1") - Crear el player usando la clase Manager
- Player player javax.media.Manager.createPlayer(
miMediaLocator) - Invocar al método start() del player. Es entonces
cuando comienza a reproducirse el contenido - player.start()
29Proceso de creación de un player (4/5)
- Ejemplo 3 Creación de un nuevo player a partir
de un DataSource - Crear un MediaLocator a partir de un string URL
- MediaLocator miMediaLocator new
MediaLocator("dvb//1.3.1") - Crear el DataSource a partir del MediaLocator
- DataSource datos javax.media.Manager.createData
Source(localizador) - Conectar el DataSource con la localización
especificada por el locator. Hasta que no se haga
esto no hay forma de acceder a los datos. - datos.connect()
- Invocar al método start() del DataSource para
indicar que el DataSource ya tiene datos para
pasar al player. - datos.start()
- Crear el player usando la clase Manager
- Player player javax.media.Manager.createPlayer(
datos) - Invocar al método start() del player. Es entonces
cuando comienza a reproducirse el contenido. - player.start()
30Proceso de creación de un player (5/5)
- Ejemplo 4 Obtención del player del servicio
actual - Obtener el service context del servicio en el que
se ejecuta la xlet. - XletContext contexto
- ServiceContextFactory scf null
- ServiceContext sc null
- scf ServiceContextFactory.getInstance()
- sc scf.getServiceContext(contexto)
- Obtener el player para el servicio actual. Los
objetos ServiceMediaHandler son responsables de
presentar las distintas partes del servicio, esto
incluye los media components. Buscamos el player
entre los distintos Handlers, normalmente suele
ser el primero. - ServiceContentHandler sch sc.getServiceConten
tHandlers() - for (int i 0 i lt sch.length i)
-
- if (schi instanceof ServiceMediaHandler)
-
- Player player (Player)schi
-
-
31Índice
- Introducción accediendo a contenidos
- Referenciando contenidos (Locators)
- Tipos de locators
- Creación de locators
- Reproduciendo contenidos
- Player, Control, DataSource
- La clase Manager
- Proceso de creación de un player
- Controls
- Ejemplos
- Bibliografía
32Controls (1/6)
- JMF usa el concepto de control para añadir
funcionalidades extra al player. - Cada control es una subclase de
javax.media.MediaControl. - Funcionalidades separadas
- Player ? controla el proceso de obtener el
media, decodificarlo y reproducirlo. - Control ? responsable de manipular cómo presentar
el media y de hacer cambios que no afecten al
ciclo de vida del player. - Invocando al método getControls() de un player
obtenemos la lista de controls disponibles para
ese player. - Explicaremos los dos controls usados en este
proyecto - javax.tv.media.AWTVideoSizeControl
- javax.tv.media.MediaSelectControl
- Para información más detallada sobre controls
- Interactive TV Standards (Capítulo 11)
- ETSI_TS_101 812, V1.2.1, Specification 1.0.2
(Sección 11.4.2)
33Controls (2/6) javax.tv.media.AWTVideoSizeControl
(1/2)
- Permite a las aplicaciones controlar el escalado
y posicionamiento de la capa de video - javax.tv.media.AWTVideoSizeControl
- public interface AWTVideoSizeControl extends
javax.media.Control -
- public AWTVideoSize getSize()
- public AWTVideoSize getDefaultSize()
- public java.awt.Dimension getSourceVideoSize()
- public boolean setSize(AWTVideoSize sz)
- public AWTVideoSize checkSize(AWTVideoSize sz)
-
- Para usar este control la aplicación crea un
objeto javax.tv.media.AWTVideoSize. - Esta clase toma dos rectángulos como argumentos
en su constructor - el primero es el rectángulo fuente (representa el
área del video origen que se quiere presentar) - el segundo es el rectángulo destino (identifica
el lugar y tamaño en el que va a ser presentado
el contenido del primer rectángulo) - El objeto AWTVideoSize calculará automáticamente
las transformaciones que necesite, por lo que la
aplicación no se debe preocupar de esto.
34Controls (3/6) javax.tv.media.AWTVideoSizeControl
(2/2)
- public class AWTVideoSize extends
java.lang.Object -
- private java.awt.Rectangle source
- private java.awt.Rectangle destination
- private float xScale
- private float yScale
- public AWTVideoSize(java.awt.Rectangle source,
java.awt.Rectangle dest) - public java.awt.Rectangle getSource()
- public java.awt.Rectangle getDestination()
- public float getXScale()
- public float getYScale()
- public int hashCode()
- public boolean equals(java.lang.Object other)
- public java.lang.String toString()
-
- Comentarios de este control
- El hardware del receptor puede imponer
limitaciones en el posicionamiento y escalado del
video y el método setSize() puede fallar si no
puede soportar la transformación requerida. - Con el método checkSize() se puede chequear antes
si la transformación está permitida. - Ejemplo mover video a la esquina superior
derecha
35Controls (4/6)
- JMF usa el concepto de control para añadir
funcionalidades extra al player. - Cada control es una subclase de
javax.media.MediaControl. - Funcionalidades separadas
- Player ? controla el proceso de obtener el
media, decodificarlo y reproducirlo. - Control ? responsable de manipular cómo presentar
el media y de hacer cambios que no afecten al
ciclo de vida del player. - Invocando al método getControls() de un player
obtenemos la lista de controls disponibles para
ese player. - Explicaremos los dos controls usados en este
proyecto - javax.tv.media.AWTVideoSizeControl
- javax.tv.media.MediaSelectControl
- Para información más detallada sobre controls
- Interactive TV Standards (Capítulo 11)
- ETSI_TS_101 812, V1.2.1, Specification 1.0.2
(Sección 11.4.2)
36Controls (5/6)javax.tv.media.MediaSelectControl
(1/2)
- Permite a las aplicaciones controlar la
presentación de los elementary streams que
componen el servicio - Seleccionar streams
- Añadir streams
- Eliminar streams
- Reemplazar streams
- javax.tv.media.AWTVideoSizeControl
- public interface MediaSelectControl extends
javax.media.Control -
- public void select(javax.tv.locator.Locator
component) - public void select(javax.tv.locator.Locator
components) - public void add(javax.tv.locator.Locator
component) - public void remove(javax.tv.locator.Locator
component) - public void replace(javax.tv.locator.Locator
fromComponent,
javax.tv.locator.Locator toComponent) - public void addMediaSelectListener(
MediaSelectListener listener) - public void removeMediaSelectListener(
MediaSelectListener listener) - public javax.tv.locator.Locator
getCurrentSelection() -
- Limitación de este control únicamente puede
seleccionar componentes que estén dentro del
servicio actual.
37Controls (6/6) javax.tv.media.MediaSelectControl
(2/2)
- Ejemplo seleccionar nuevo elementary stream de
audio y reproducirlo. Se da por hecho que se ha
creado un player mediante cualquiera de los
métodos propuestos. - MediaSelectControl msc (MediaSelectControl)play
er.getControl("javax.tv.media.MediaSelectControl")
- Locator localizador_audio null
- LocatorFactory lf LocatorFactory.getInstance()
- try
- localizador_audio lf.createLocator("dvb//1.3.
1.cb" ) -
- catch (MalformedLocatorException e)
-
- try
- msc.select(localizador_audio)
-
- catch (InvalidServiceComponentException e)
-
- catch (InsufficientResourcesException e)
-
- catch (SecurityException e)
-
38Índice
- Introducción accediendo a contenidos
- Referenciando contenidos (Locators)
- Tipos de locators
- Creación de locators
- Reproduciendo contenidos
- Player, Control, DataSource
- La clase Manager
- Proceso de creación de un player
- Controls
- Ejemplos
- Bibliografía
39Ejemplos (1/17)
- Explicación detallada de los pasos a seguir para
reproducir los distintos contenidos introducidos
en el primer apartado - Acceso a contenidos DVB Streaming
- Acceso y presentación de un nuevo elementary
stream de audio. - Acceso a contenidos del Object Carousel
(broadcast file system) - Acceso y presentación de un ARCHIVO DE AUDIO
- Acceso y presentación de un ARCHIVO DE VIDEO
40Ejemplos (2/17)Acceso y presentación de un
nuevo elementary stream de audio (1/3)
- Asociar un player al servicio en el que se
ejecuta la xlet - Crear un locator al servicio y a partir de él
crear el DataSource y el player. Para ello
debemos conocer el string dvb// específico del
servicio. - No crear un nuevo player sino obtener el player
del servicio actual . - Obtener los controls que se necesiten. En este
caso MediaSelectControl - MediaSelectControl msc
- msc (MediaSelectControl)player.getControl("java
x.mediaMediaSelectControl")
41Ejemplos (3/17)Acceso y presentación de un
nuevo elementary stream de audio (2/3)
- Crear un el locator que refiera al nuevo audio
stream que se quiere presentar para luego,
invocando al método select() del control,
seleccionar este nuevo audio stream. Hay que
tener en cuenta que el método select() coge como
argumento de entrada un javax.tv.locator.Locator,
no un javax.media.MediaLocator, así que la forma
de crear el locator será mediante la clase
LocatorFactory. -
- Locator localizador_audio null
- LocatorFactory lf LocatorFactory.getInstance()
- try
- localizador_audio lf.createLocator("dvb//1.3.
1.cc") //locator al nuevo audio -
- catch (MalformedLocatorException e)
-
- try
- msc.select(localizador_audio)
-
- catch (InvalidServiceComponentException e)
-
- catch (InsufficientResourcesException e)
-
- catch (SecurityException e)
-
- catch (InvalidLocatorException e)
42Ejemplos (4/17)Acceso y presentación de un
nuevo elementary stream de audio (3/3)
- Comentarios
- No hay ninguna particularización para el caso de
audio ? parece que también funcionaría con un
elementary stream de video. - El código implementado únicamente selecciona un
nuevo locator. - No se ha podido experimentar por limitaciones
del banco de pruebas.
43Ejemplos (5/17)
- Explicación detallada de los pasos a seguir para
reproducir los distintos contenidos introducidos
en el primer apartado - Acceso a contenidos DVB Streaming
- Selección y presentación de un nuevo elementary
stream de audio. - Acceso a contenidos del Object Carousel
(broadcast file system) - Acceso y presentación de un ARCHIVO DE AUDIO
- Acceso y presentación de un ARCHIVO DE VIDEO
44Ejemplos (6/17)Acceso y presentación de un
ARCHIVO DE AUDIO (1/7)
- Para acceder a un archivo de audio que viaja en
el Object Carousel se tienen varias opciones - Hacer uso de la clase DSMCCObject y crear un
player a partir de una URL. - Aprovechar que se trata de un archivo de audio y
hacer uso de la clase HSound. - public class HSound
-
- public HSound()
- public void load(java.lang.String location)
- public void load(java.net.URL contents)
- public void set (byte data)
- public void play()
- public void stop()
- public void loop()
- public void dispose()
-
- Simplemente se puede elegir cuando empieza,
cuando se acaba o si se desees reproducción en
bucle del audio - Usar API JMF para tener más control sobre el audio
45Ejemplos (7/17)Acceso y presentación de un
ARCHIVO DE AUDIO (2/7)
- Crear un locator que refiera al archivo del
object carousel. -
- DSMCCObject miObjetoDSMCC
- miObjetoDSMCC new DSMCCObject(audios/audio1.mp
2) - //Se obtiene la URL llamando al método getURL()
- URL miURL miObjetoDSMCC.getURL()
- Player player_archivo_audio null
- try
- player_archivo_audio javax.media.Manager.creat
ePlayer(miURL) -
- catch (NoPlayerException e)
-
- catch (IOException e)
-
- player_archivo_audio.start()
46Ejemplos (8/17)Acceso y presentación de un
ARCHIVO DE AUDIO (3/7)
- Para acceder a un archivo de audio que viaja en
el Object Carousel se tienen varias opciones - Crear un locator que refiera al archivo del
object carousely a partir de él el player. - Aprovechar que se trata de un archivo de audio y
hacer uso de la clase HSound - public class HSound
-
- public HSound()
- public void load(java.lang.String location)
- public void load(java.net.URL contents)
- public void set (byte data)
- public void play()
- public void stop()
- public void loop()
- public void dispose()
-
- Simplemente se puede elegir cuando empieza,
cuando se acaba o si se desees reproducción en
bucle del audio - Usar API JMF para tener más control sobre el audio
47Ejemplos (9/17)Acceso y presentación de un
ARCHIVO DE AUDIO (4/7)
- Aprovechar que se trata de un archivo de audio y
hacer uso de la clase HSound. - HSound player_archivo_audio new HSound()
- try
- player_archivo_audio.load(audios/audio1.mp2)
//ruta relativa al directorio
//root de la aplicación
//(Service
Gateway) -
- catch (Exception e)
-
- player_archivo_audio.play() //se podría invocar
al método loop() si se
//deseara una reproducción ininterrumpida
48Ejemplos (10/17)Acceso y presentación de un
ARCHIVO DE AUDIO (5/7)
- Para acceder a un archivo de audio que viaja en
el Object Carousel se tienen varias opciones - Crear un locator que refiera al archivo del
object carousel y a partir de él el player. - Aprovechar que se trata de un archivo de audio y
hacer uso de la clase HSound - public class HSound
-
- public HSound()
- public void load(java.lang.String location)
- public void load(java.net.URL contents)
- public void set (byte data)
- public void play()
- public void stop()
- public void loop()
- public void dispose()
-
- Simplemente se puede elegir cuando empieza,
cuando se acaba o si se desees reproducción en
bucle del audio - Usar API JMF para tener más control sobre el audio
49Ejemplos (11/17)Acceso y presentación de un
ARCHIVO DE AUDIO (6/7)
- Usar API JMF para tener más control sobre el
audio - File archivo_audio new File(audios/audio1.mp2
) - MediaLocator localizador_archivo_audio null
- try
- localizador_archivo_audio new
javax.media.MediaLocator(archivo_audio.toURL().toE
xternalForm()) -
- catch (MalformedURLException e1)
-
- Player player_archivo_audio null
- try
- player_archivo_audio javax.media.Manager.cre
atePlayer(localizador_archivo_audio) -
- catch (NoPlayerException e)
-
- catch (IOException e)
-
- player_archivo_audio.start()
50Ejemplos (12/17)Acceso y presentación de un
ARCHIVO DE AUDIO (7/7)
- Restricciones en MHP
- Único formato soportado MPEG-1 (MP1 o MP2)
- WAV y MP3 no son soportados
- Deben ser de tamaño pequeño porque van a ser
descargados del object carousel. - Archivos grandes
- Tardan mucho tiempo en descargarse y pueden
afectar a los tiempos de carga de otros archivos. - Usan más memoria y esto puede ser un problema en
receptores de poco memoria RAM. - Sólo se puede reproducir un audio a la vez ya que
los receptores MHP no son capaces de mezclar
audios. - Para reproducir un nuevo audio hay que esperar a
que el audio que actualmente se está
reproduciendo acabe. - Esto es aplicable también al audio del servicio
asociado a la aplicación, por lo que cualquier
efecto de sonido que introduzca la aplicación
hará que el audio del servicio se silencie.
51Ejemplos (13/17)
- Explicación detallada de los pasos a seguir para
reproducir los distintos contenidos introducidos
en el primer apartado - Acceso a contenidos DVB Streaming
- Selección y presentación de un nuevo elementary
stream de audio. - Acceso a contenidos del Object Carousel
(broadcast file system) - Acceso y presentación de un ARCHIVO DE AUDIO
- Acceso y presentación de un ARCHIVO DE VIDEO
52Ejemplos (14/17)Acceso y presentación de un
ARCHIVO DE VIDEO (1/4)
- La norma MHP no soporta la reproducción de videos
desde archivo. - No existe ningún mecanismo de reproducción de
video que no sea el de un elementary stream. - Se ha intentado reproducir videos mediante la
técnica de los Video Drips - Formato de contenido nuevo y único en la TV
digital - Provee un mecanismo eficiente, en cuanto a
memoria, para mostrar varias imágenes similares. - Pequeños video clips MPEG-2 compuestos únicamente
por - Una I-frame que es la que primero se decodifica.
- Una o varias P-frames que son decodificadas en
base a la primera I-frame. - pero sin resultados satisfactorios ya que esta
técnica no tiene este propósito.
53Ejemplos (15/17)Acceso y presentación de un
ARCHIVO DE VIDEO (2/4)
- Funcionamiento de los Video Drips
- Existe un formato de locator para referenciar
Video Drips ? dripfeed// - dripfeed// ? ? DataSource ? ? player
- Su uso no es necesario porque existe una subclase
de DataSource, DripDataSource que permite crear
una fuente de datos capaz de alimentar
progresivamente el decodificador con pequeñas
partes del clip MPEG-2.
54Ejemplos (16/17)Acceso y presentación de un
ARCHIVO DE VIDEO (3/4)
- Pasos a seguir para reproducir un Video Drip
- Se define el array donde vamos a guardar la
lectura del fichero que contiene el video a
mostar - static final int tam_buffer_lectura 320000
- byte datosDrip new bytetam_buffer_lectura
- Se crea una instancia de la clase DripDataSource
para poder alimentar el decodificador
progresivamente - DripFeedDataSorce dfds new DripFeedDataSource()
- Se crea el player a partir del DripDataSource
anterior y se invoca a su método start() - Player playerDrip Manager.createPlayer(dfds)
- playerDrip.start()
- Se crea una instancia de la clase FileInputStream
pasando como parámetro de entrada el video que se
quiere presentar. Los objetos FileInputStream
típicamente representan ficheros de texto
accedidos en orden secuencial, byte a byte. Con
FileInputStream, se puede elegir acceder a un
byte, varios bytes o al fichero completo. - FileInputStream fis new FileInputStream("videos/
videoSinAudio2.mpg") - Se invoca al método read() del FileInputStream
para comenzar la lectura de los datos que se
guardarán en el array datosDrip definido en el
primer paso y se cierra el stream de entrada
cuando la lectura haya finalizado. - fis.read(datosDrip)
- fis.close()
- Por último se invoca al método feed() del objeto
DripFeedDataSource para comenzar la alimentación
progresiva del decodificador con el array en el
que tenemos los datos. - dfds.feed(datosDrip)
55Ejemplos (17/17)Acceso y presentación de un
ARCHIVO DE VIDEO (4/4)
- Restricciones en MHP (sobre el formato del clip
MPEG usado para los Video Drips) - No pueden contener streams de audio
- Deben estar compuestos únicamente por I-frames y
P-frames. - Más información ETSI_TS_101 812, V1.2.1,
Specification 1.0.2 (Sección 7.1.3) - Los resultados no han sido muy satisfactorios
pero han servido para comprender mejor las
restricciones que MHP impone sobre el formato de
los video clips usados para generar los Video
Drips. - Mejor resultado obtenido conseguir que el STB
decodifique únicamente el primer frame del video
pero entremezclado ligeramente con el video del
elementary stream. - Conclusión para reproducir un video el único
mecanismo válido es difundirlo como un elementary
stream. - Para que esta última solución propuesta
proporcione resultados óptimos hay que disponer
de suficiente ancho de banda en el carousel para
evitar problemas de tiempos de carga de archivos
demasiado altos.
56Índice
- Introducción accediendo a contenidos
- Referenciando contenidos (Locators)
- Tipos de locators
- Creación de locators
- Reproduciendo contenidos
- Player, Control, DataSource
- La clase Manager
- Proceso de creación de un player
- Controls
- Ejemplos
- Bibliografía
57Bibliografía
- Interactive TV Standards (Steven Morris)
- Capítulo 8 y 11
- http//www.interactivetvweb.org/
- http//www.interactivetvweb.org/tutorial/mhp/media
control.shtml - http//www.interactivetvweb.org/tutorial/mhp/javam
edia.shtml - http//www.interactivetvweb.org/tutorial/mhp/sound
.shtml - ETSI_TS_101 812, V1.2.1, Specification 1.0.2
58Gracias por su atención