MPEG-J e JMF

Propaganda
MPEG-J e JMF
Resumo
MPEG-J é um sistema MPEG-4 programável. Prove a possibilidade de adaptação da
aplicação de acordo com a capacidade computacional e os recursos disponíveis no terminal.
O objetivo do MPEG-J é definir um motor de aplicação Java (complementando o motor de
apresentação) que especifica como as aplicações estarão contidas nos fluxos de bits
(enviadas ao terminal – MPEGlets - ou presentes no mesmo) e serão executadas nos
terminais. Para possibilitar a comunicação com o MPEG-4 player, novas APIs especificas
para MPEG-4 são definidas: Terminal, Scene, Resource, Decoder e Network. MPEG-J é
também utilizado em ambientes interativos.
O JMF é um conjunto de três novas API’s co-definidas pelo JMF Working Group – Sun,
Silicon Graphics, e Intel. Esses API’s incluem o Java Media Player, Capture, e
Conferencing. A API especificada para o Player fornece um arcabouço para
desenvolvedores construírem media players sob a forma de plataformas Java padronizadas.
A especificação JMF é flexível o suficiente para permitir aos desenvolvedores estenderem
seus players adicionando suas próprias características (como filtros de imagem, efeitos de
áudio reverb, e outros) ou para usarem os players padrões já disponíveis sem fazer maiores
adições.
1
MPEG-J
1 – Introdução
A capacidade computacional e recursos (de rede ou outros) disponíveis nos
terminais MPEG-4 pode diferir consideravelmente. Com o uso do MPEG-J é possível
abstrair as diferenças existentes através da criação de uma única aplicação, tornando difícil
a percepção das limitações de um terminal que decodifica áudio e vídeo e um terminal que
processa um programa computacional.
Esse é o objetivo do MPEG-J; prover uma oportunidade para controlar
apresentações audiovisuais através de programas que podem tomar decisões complexas e
modificar a forma de apresentação baseada nas condições dos terminais dos clientes.
Podemos citar, por exemplo, a associação do comportamento de uma cena baseada em
algoritmos complexos relacionando partes da mesma a rotinas escritas em linguagem
programável.
A utilização de programas computacionais permite que lógicas complexas sejam
utilizadas para detectar condições estáticas e dinâmicas (temporais) em cada terminal. Por
exemplo, o programa é capaz de discernir a capacidade de um PDA e um Desktop e
detectar condições extremas, tais como problemas de retardo na rede ou declínio da
disponibilidade computacional.
O
sistema
MPEG-4
especifica
ferramentas
de
codificação para objetos de áudio e vídeo. A parte padrão do sistema MPEG-4 [1]
especifica como esses objetos, codificados em fluxo de bits elementares, estão posicionados
e sincronizados com outros objetos, chamada de motor de apresentação no MPEG-4. O
objetivo do MPEG-J é adicionar ao motor de apresentação um motor de aplicação que
possa associar comportamentos complexos baseados nas condições do terminal do usuário.
Os principais requerimentos para esse motor de aplicação seriam:
1. Habilidade para executar programas ou aplicações computacionais de códigos
compilados;
2. Habilidade para rodar o mesmo código em diferentes plataformas de hardwares
e softwares disponíveis no terminal;
2
3. Um modelo de segurança bem definido;
4. Habilidade para rodar múltiplas aplicações simultaneamente sem conflitos;
5. Mecanismo para notificar e manusear, se necessário, condições drásticas ou
excepcionais;
6. Disponibilidade de interfaces para detectar informações estáticas e dinâmicas
com relação ao ambiente do terminal, capacidade computacional e largura de
banda da rede.
7. Disponibilidade de interfaces para obter informação sobre a apresentação:
objetos nas cenas, fluxos elementares, decodificadores, entre outros;
8. Disponibilidade de interfaces que possam ser usadas
pelo programa para
acessar, modificar ou, até mesmo, criar partes da apresentação;
9. Facilidade de escrita.
A linguagem de programação Java satisfaz esses requerimentos, além de ser
orientada a objetos e amplamente divulgada, disponibilizando recursos que facilitam a
criação da aplicação. Estas foram as principais razões que levaram a escolha de Java no
MPEG e da Máquina Virtual Java (JVM) como plataforma para executar as aplicações Java
mos terminais MPEG-J. Para rodar as aplicações escritas em Java, é necessário que
terminais possuam uma implementação de JVM. O byte code Java compilado será
interpretado pela JVM, possibilitando a execução da aplicação sem a necessidade de uma
nova recompilação ou qualquer mudança específica na plataforma.
O objetivo do MPEG-J é definir um motor de aplicação Java (complementando o
motor de apresentação) que especifica como as aplicações estarão contidas nos fluxos de
bits e serão executadas nos terminais. Para isso, MPEG-J define um conjunto de APIs
(Application
Programming Interface) que permitem a interação da aplicação com o
terminal e seu ambiente. MPEG-J também define a forma de distribuição da aplicação no
terminal, seu escopo, ciclo de vida e restrições de segurança. Deve-se notar que a
linguagem Java é composta de um conjunto de classes que são compiladas para uma
linguagem intermediária denominada byte code e que cada classe
tem uma ou mais
instancias denominadas objetos. Um mecanismo de distribuição é definido pelo MPEG-J
para carregar o Java byte code (classes) e objetos Java (esses objetos são diferentes dos
3
objetos audiovisuais nos grafos das cenas) que faz uma aplicação MPEG-J. O ciclo de vida
e escopo de uma aplicação MPEG-J são definidos dentro de um padrão junto com rígidos
modelos de segurança, que protegem os terminais MPEG-4 de aplicações maliciosas.
Conforme dito anteriormente, MPEG-J define um conjunto de APIs Java para
acessar e controlar a base do terminal MPEG-4 que reproduz uma sessão audiovisual.
Nesse caso, uma interface é uma função ou chamada a um procedimento que possa ser feito
pelo programa. Aplicações MPEG-J que usam essas APIs podem estar embutidas no
conteúdo como um fluxo elementar MPEG-J similar aos fluxos de áudio e vídeo. Essas
aplicações transportadas com o fluxo de dados são denominadas MPEGlet.
A figura 1 mostra o diagrama de uma MPEG-J num terminal MPEG-4.
MPEG-J Application
java.lang
java.io
Application Engine
java.util
MPEG-J APIs
JVM
BIFS,
Presentation Engine
Áudio,
visual,
MPEG-J...
Execution Engine
Fig. 1.1 – MPEG-J application Engine
BIFS define o formato binário para a descrição da cena. Isso é usado para a
construção e apresentação da cena, uma vez que BIFS descreve o relacionamento espaçotemporal dos objetos audiovisuais nas cenas. A parte do terminal que interpreta BIFS, seus
fluxos e sua composição e os apresenta é denominada motor de apresentação. O motor de
execução descomprime os fluxos audiovisuais codificados. MPEG-J define o motor de
aplicação, o qual oferece acesso programático e controle dos motores de apresentação e
execução. Especificamente, MPEG-J permite a uma aplicação acessar e modificar uma
4
cena e, numa extensão limitada, os recursos de rede e do decodificador do terminal. As
APIs MPEG-J, juntamente com a JVM formam o motor de aplicação que facilitam a
execução e distribuição de aplicações. Este motor permite a inclusão de programas por
desenvolvedores, que inteligentemente controlam o terminal MPEG-4 de acordo com as
condições do mesmo.
Uma vez que os programas MPEG-J (MPEGlets) são geralmente transportados
separadamente, eles podem ser reutilizados por outras cenas audiovisuais. Isso também é
possível para programas residentes no terminal, contanto que eles sejam escritos de forma
independente da cena e dos fluxos elementares associados com ele.
Alguns exemplos de adaptação da cena aos recursos do terminal conforme suas
condições são:
1. Ao invés de degradar uma cena inteira quando os recursos estão baixos, um
objeto de vídeo de menor prioridade pode ser substituído por um retrato;
2. Qualquer que seja o terminal (um PDA, um telefone móvel, um PC antigo ou
um top de linha), o vídeo ao ser reproduzido adapta-se as condições do
ambiente. Por exemplo, o mesmo conteúdo usa cinco canais estéreos de áudio
de alta qualidade ou um único canal de baixa qualidade mono de áudio
conforme o dispositivo de recepção. Essa adaptação também pode ser realizada
baseada nas preferências do usuário.
3. Um vídeo educacional é transmitido para usuários de PC ou handhelds. Após a
conclusão de cada capítulo, perguntas são administradas. O nível de dificuldade
varia baseada nas respostas dos participantes.
2- Arquitetura MPEG-J
A figura 2 mostra uma arquitetura simplificada de um player MPEG-4 como
especificado no MPEG-4 Systems, Versão 1 [1]. Os dados BIFS contidos no fluxo
elementar BIFS juntamente com os descritores de objetos (OD) nos fluxos OD são usados
para construir o grafo das cenas a associar os nós dos grafos com os correspondentes fluxos
audiovisuais. O decodificador BIFS é usado para decodificar a informação de descrição da
5
cena. Os dados da mídia decodificados são armazenados nos composition buffers que
alimentam o compositor e renderizador. Composition é a ato de reconstruir espacialmente a
cena dos objetos usando a informação de descrição da cena. Rendering é o ato de desenhar /
apresentar uma cena.
Control
Data
DMIF
Back
Channel
Channel
D
E
M
U
X
BIFS/OD
Decoder
Scene
Graph
BIFS and OD
Streams
Decoding
Buffers 1...n
Media
Decoders
Composition
Buffers 1...n
Compositor
and Renderer
Figura 1.2 – Arquitetura MPEG-4 player simplificada
A arquitetura do MPEG-J para MPEG-4 player é mostrada na figura 3 [2], abaixo.
Net API
Scene API
Resource API
MPEG-J
Stream
Fig.1.3 – Arquitetura MPEG-J
6
O motor de apresentação do Sistema MPEG-4, versão 1, corresponde a parte mais
baixa da figura 3. O motor de aplicação do MPEG-J (parte superior da figura) é usada para
controlar ao motor de apresentação através da execução de aplicações bem definidas e
mecanismos de distribuição [3]. A aplicação MPEG-J usa as MPEG-J APIs para esse
controle.
As aplicações podem ser locais ao terminal ou transportadas no fluxo MPEG-J e
executadas no terminal. Enquanto o termo MPEGlet faz referência ao programa MPEG-J
enviado ao terminal, um programa local é genericamente chamado aplicação MPEG-J [2].
MPEGlets são requeridos para implementar a interface MPEGlet definida na especificação
MPEG-J [2]. As MPEGlets e todas as classes e objetos MPEG-J são transportados no fluxo
elementar MPEG-J. Cada MPEGlet recebido é carregado pelo class loader (vide figura 3) e
iniciado em instantes de tempo prescritos pelo time stamps do fluxo MPEG-J. A aplicação
MPEG-J utiliza os gerenciadores de cena, rede e recursos para controlar a cena, rede e
recursos do terminal, respectivamente, além de decodificadores. Na figura 3, os fluxos de
dados são as linhas contínuas e os de controle as tracejadas. Uma sessão MPEG-J é iniciada
quando um player MPEG-4 recebe um MPEG-J OD. O decodificador MPEG-J (composto
pelo buffer, class loader e implementações de APIs) manuseia as classes e objetos que
chegam. Pode haver mais de um MPEGlet em um fluxo MPEG-J. Cada classe recebida é
carregada em instantes de tempo especificados pelos seus time stamps. Quando um
MPEGlet é recebido pelo decodificador, ele realiza as iniciações prescritas e o executa
como uma thread separada no terminal.
2.1 - MPEGlets
Particularmente, o termo MPEGlet é utilizado para aplicações que são enviadas ao
terminal. Entretanto, a maioria dos conceitos definidos nesta parte são aplicados tanto para
os MPEGlets como às aplicações locais.
Como MPEG-J permite aos programas serem enviados e executados num terminal
MPEG-4, se torna necessário definir um conjunto de regras para a execução dos programas:
MPEGlets, no caso.
7
2.1.1 – Life Cycle
Depois que um MPEGlet é recebido, o terminal precisa saber exatamente como ele
tem que executá-lo. Para esse propósito, a especificação MPEG-J define o life cycle de um
MPEGlet. A interface MPEGlet define quatro métodos (funções), nomeadas de: init(),
run(), stop(), e destroy(). O life cycle e os estados dos MPEGlets estão implicitamente
definidos por esses métodos dentro da interface. O autor de um MPEGlet deve escrever o
código apropriado para todos os métodos definidos numa interface MPEGlet. Todos os
recursos de inicialização formam o método init(), enquanto a recuperação dos mesmos
recursos formam o método destroy(). O método run() será executado como uma nova
thread e conterá todos os mecanismos de controle de algoritmos para controlar o terminal
MPEG-4. Além disso, o autor deve colocar todos os códigos para parar o MPEGlet mo
método stop(). Uma vez construído os códigos, o autor deve compilá-lo para gerar uma
classe (Java class) de saída do MPEGlet. Essa classe seria então distribuída para o terminal.
Quando recebida por este, será carregada conforme seu time stamp. Adicionalmente, o
terminal pode determinar se a classe implementa a interface MPEGlet através de chamadas
de funções primitivas. Isso determina se uma dada classe é uma aplicação MPEG-J ou uma
classe suportada.
2.1.2 – Name Scope
Para garantir eu não hajam conflitos de nomes nas aplicações MPEG-J, o escopo do
nome tem que ser definido. Por exemplo, duas classe usando o mesmo nome ou duas
MPEGlets com o mesmo nome causariam problemas de execução.
O OD define o escopo do nome de objetos audiovisuais numa cena MPEG-4. Isso
também se aplica as classes e objetos MPEG-J. Todos os identificadores são interpretados
no escopo de nomes dos fluxos MPEG-J e seus OD.Os gerenciadores mostrados na figura 3
estabelecem o nome de MPEGlet pela identificação do seu descritor de objeto. Na prática,
isso é feito usando a referência do MPEGlet passada no construtor1 do terminal
MpegjTerminal, uma classe específica definida entre as APIs MPEG-J.
8
O seguinte fragmento de código mostra um exemplo de um MPEGlet passando sua
própria referência enquanto cria o objeto MpegjTerminal:
public class SceneExample implements MPEGlet
{
MpegjTerminal mpegjterminal;
Public void init()
{
mpegjterminal = new MpegjTerminal (this);
[...]
Embora o MPEGlet tenha que passar uma referência para si próprio no construtor,
uma aplicação local pode usar o construtor de argumento zero do terminal para indicar a
raiz do escopo do nome.
Como no seguinte exemplo:
public class AtlanticDemo extends WindowAdapter
{
MpegjTerminal MpegjTerminal = new MpegjTerminal ();
[...]
2.2 – Distribuição
Tipicamente, os mecanismos pelo qual os programas são distribuídos para os
terminais que os executam são muito diferentes da forma que isso é feito para os dados
audiovisuais. A especificação MPEG-J define os mecanismos para transportar os dados
MPEG-J usando os mecanismos de entrega definidos para os dados audiovisuais do
MPEG-4.
2.2.1 – Semântica Time Stamp
Os dados audiovisuais MPEG-4 carregam dois tipos de marcas de tempo. Um deles
é o tempo no qual o decodificador deve começar a decodificar uma unidade de acesso
9
chamado de Decoding Time Stamps (DTS). Similarmente, a Composition Time Stamps
(CTS) é o instante de tempo no qual o dado descomprimido tem que ser formado na cena
para apresentação. Para o MPEG-J, esse par de time stamp não tem um significado direto.
Então, a especificação MPEG-J define novas semânticas para o DTS e CTS.
2.2.2 – Dependência de classe
MPEGlets podem usar chamadas (funções) APIs que estão definidas dentro de uma
classe Java dentro da plataforma (java.io, Java.util, Java.lang) ou em uma especificação
MPEG-J [AMD1-1]. Uma aplicação especifica uma classe que, por sua vez usa chamadas
API definidas em classe aplicação específica.
Um terminal deve iniciar uma classe somente depois que todas as classe que ela
depende forem carregadas.
2.2.3 – Fluxo Elementar MPEG-J
O dado MPEG-J é enviado par o terminal MPEG-J como um fluxo elementar.
Todos os arquivos de classes que dependem uns dos outros e constituem uma
aplicação MPEG-J junto com os objetos de dados podem ser empacotados como uma
unidade de acesso simples. O formato do pacote usado para isso é o formato zip ou o
formato de pacote JAR suportado pelo Java.
MPEG-J adiciona um pequeno cabeçalho às classes e objetos Java, além do pacote
JAR que constituem uma simples unidade de acesso. Esse cabeçalho é usado para
especificar a identificação, tipo, compressão, pacote e informação de dependência de
classe. Todas essas informações são utilizadas pelo decodificador MPEG-J para a correta
decodificação das classes e seu tempo correto de execução.
2.2.4 – Segurança
A especificação MPEG-J define um modelo de segurança para MPEGlets [2] que é
similar ao modelo para JAVA applets. O modelo de segurança MPEG-J protege o terminal
10
MPEG-4 de programas maliciosos. Um gerenciador de segurança tem que ser
implementado no terminal MPEG-J para assegurar as seguintes restrições de segurança:
1. MPEGlets são proibidos de carregarem bibliotecas ou definir métodos nativos;
2. MPEGlets não podem ler ou escrever arquivos no terminal;
3. Iniciar um programa e ler certas propriedades do sistema é proibido;
4. MPEGlets podem usar somente seu próprio código Java, APIs MPEG-J, APIs
Java fornecidas pelo ambiente de execução e as classes que foram carregadas do
fluxo MPEG-J.
3 – APIs MPEG-J
Foi visto que MPEGlets podem fazer chamadas API que estão definidas nos pacotes
Java suportados pela plataforma. Para os familiarizados com pacotes Java, Java.io,
Java.utils, e Java.lang são três pacotes Java que têm que ser suportados pela plataforma
Java presente no terminal.
Enquanto pacotes Java provêm algumas características genéricas, as APIs MPEG-J
suportam as características que são especificas para as aplicações MPEG-J. As APIs
MPEG-J complementam as APIs da plataforma Java para encontrar os requerimentos das
aplicações MPEG-J. Os algoritmos embutidos nos MPEGlets são implementados usando as
interfaces definidas pela especificação MPEG-J. Usando as APIs MPEG-J, as aplicações
têm acesso programático às cenas, terminal, e recursos de rede. As MPEGlets usam as APIs
MPEG-J para perceber o ambiente do terminal e modificar cenas audiovisuais.
MPEG-J define uma variedade de categorias de APIs. Cada categoria prove uma
funcionalidade especifica e é organizada como um pacote Java. Os seguintes pacotes são
definidos na especificação MPEG-J [2]:
•
org.iso.mpeg.mpegj
•
org.iso.mpeg.mpegj.scene
•
org.iso.mpeg.mpegj.resource
•
org.iso.mpeg.mpegj.decoder
11
•
org.iso.mpeg.mpegj.net
Além disso, MPEG-J faz referência apara algumas APIs já definidas nas
especificações
DAVIC (Digital Audiovisual Council), em outras palavras, Service
Information and Section Filtering [4].
O pacote org.iso.mpeg.mpegj é uma coleção de todas as classes e interfaces
necessárias ao desenvolvimento de uma sessão pelo MPEGlet. Essas classes e interfaces
definidas pelo pacote acima são denominadas Terminal APIs. Este fornece um MPEGlet
com um primeiro ponto de acesso para o terminal. As duas principais interfaces definidas
neste pacote são: a MPEGlet e a MpegjTerminal.
O pacote org.iso.mpeg.mpegj.scene é a coleção de todas as classes e interfaces
definidas pela especificação MPEG-J através das quais os objetos audiovisuais da cena
MPEG-4 podem ser acessados e modificados. Esse pacote contém interfaces de baixo nível
para acessar e modificar os nós do grafo das cenas correspondentes a uma apresentação
MPEG-4. Essas interfaces constituem as Scene SPIs. Através delas, as cenas podem ser
alteradas baseado em algoritmos que podem reagir de forma complexa com o ambiente do
terminal ou ações de usuários.
O pacote org.iso.mpeg.mpegj.resource contém todas as classes e interfaces
necessárias para monitorar os recursos estáticos e dinâmicos no terminal. Eles são referidos
como Resource APIs.
O pacote org.iso.mpeg.mpegj.decoder consiste de todas as classes e interfaces
necessárias para controlar o recurso do decodificador no terminal. As Decoder APIs
definem a interface decoder e provê o meio para controlar o decodificador.
O pacote org.iso.mpeg.mpegj.net contém um conjunto de interfaces de alto nível,
chamadas Net ou Network APIs, para um simples controle dos canais da rede associados ao
terminal MPEG-J. Através dessa APIs, uma aplicação pode indagar ao terminal sobre
sessões, canais, qualidade de serviço, entre outros.
MPEG-J também faz referencia a Service Information, Section Filtering, Resource
Notification e MPEG Component APIs especificadas por DAVIC [4]. Essas APIs são
relevantes somente quando os dados MPEG-4 são transportados sobre sistemas MPEG-2
12
[5], uma vez que são usadas para acessar informação nos fluxos de transporte desses
sistemas. O fluxo do sistema MPEG-2 podem conter as tabelas de Informação de Serviços
definidas pelo Digital Vídeo Broadcasting (DVB) Consortium [6].
4 – Cenários de aplicação
Como MPEG-J usa Java, as possíveis aplicações são limitadas apenas pelo
desempenho
dos desenvolvedores.O real desafio é o desenvolvimento de ferramentas
inteligentes para a criação de conteúdo MPEG-J.
•
Em ambientes no qual diferentes dispositivos, com diferentes capacidades, e redes
sem fio (GSM, GPRS, UMTS) coexistem, os provedores de conteúdo podem querer
decidir as partes essenciais das mensagens que querem transmitir. Sem MPEG-J,
essa decisão teria que ser feita pelo terminal ou um gateway entre o servidor e o
terminal.
•
Muitos programas de TV que utilizam informação multimídia interativa podem se
beneficiar de MPEG-J. Por exemplo, pode ser dados aos usuários de TV a
possibilidade de resposta a questões mostradas na apresentação. No fim, as
respostas podem ser avaliadas. Um ambiente seguro com autenticação (através de
um cana de retorno) , pode ser necessário para fazê-lo seguro.
Podemos concluir que MPEG-J é o principal passo em direção à distribuição de
conteúdo inteligente e interativo. MPEG-J fornece as ferramentas necessárias para
produção pelos desenvolvedores de conteúdos MPEG-4 cada vez mais interessantes.
13
JMF
Introdução
O JMF (Java Media Framework) fornece uma arquitetura unificada e um protocolo
de mensagens que controlam a aquisição, processamento e a entrega de dados multimídias.
JMF é projetado suportar a maioria dos tipos de mídias padronizados, tais como o AIFF,
AU, AVI, GSM, MIDI, MPEG, QuickTime, RMF e o WAV.
Explorando as vantagens da plataforma Java, JMF promete, aos desenvolvedores
que querem usar mídias como áudio e vídeo em seu programa Java, que "uma vez escrito o
programa ele funcionará em qualquer lugar". JMF fornece uma Java API comum para
estruturas de acesso básico as mídias. As implementações de JMF podem alavancar as
potencialidades do sistema operacional, enquanto os desenvolvedores podem facilmente
criar programas com portabilidade para mídias continuas escrevendo uma JMF API.
Com o JMF, você pode facilmente criar applets e as aplicações que apresentam,
capturam, manipulam e armazenam mídias continuas. O framework permite a
desenvolvedores avançados e provedores de tecnologia a realizar o processamento de dados
crus das midias e de estender ao JMF o suporte a tipos e formatos adicionais, otimizar a
manipulação de formatos já suportados, e criar mecanismos novos da apresentação.
JMF é uma API desenvolvida pela Sun Microsystems para incorporar multimídia
em applets e aplicações Java. Com este pacote podemos capturar, gravar e apresentar
arquivos multimídia, independentemente da plataforma usada. O JMF 2.0 define uma classe
plugin que habilita desenvolvedores a estender a funcionalidade do JMF.
A arquitetura do JMF esta dividida em:
•
Data source
•
Capture device
•
Player
•
Processor
•
DataSink
•
Format
•
Manager
14
Data source é uma stream, que pode ser, somente de vídeo, somente de audio, ou a
combinação dos dois. Depois de criado, você não precisa saber onde se encontra a mídia,
nem qual é o protocolo usado, pois o data source cuida disto. Uma vez criado, este pode
alimentar o player para ser renderizado, com o player não precisando saber qual é a forma
da mídia. A mídia pode vir de varias fontes, como por exemplo arquivos de uma rede, ou
arquivos de internet.
Capture device representa o hardware de captura, como por exemplo microfone, ou
câmera de vídeo.
Um Player tem como entrada uma stream de audio ou vídeo e renderiza isto ou nos
alto-falantes ou no vídeo, ou em ambos. Um player logicamente tem estados, por exemplo
parado, ligado, etc.
Processor é um tipo de player, na API do JMF, um processor estende o player.
Assim o processor tem os mesmos controles que um player. Mas diferente de um player, o
processor tem controle sobre qual processamento é feito na stream de entrada. Alem de
renderizar o data source, o processor pode ter como saída uma media, que por sua vez pode
entrar em outro player ou processor, assim por diante.
O DataSink é a interface que lê a mídia do DataSource e renderiza em algum
destino, por exemplo um arquivo.
Format representa o exato formato da mídia, não carregando parâmetros específicos
de codificação. Subclasses podem ser audioformat ou videoformat.
Manager é um objeto intermediário, que interfaceia dois objetos diferentes, como
por exemplo, com o manager você pode criar um player a partir de um DataSource.
Depois de criado um player você já pode processar os dados deste, existe para este fim,
uma classe plugin, que pode processar o dado de entrada e entregar o dado de saída
modificado para ser renderizado no vídeo, ou então entregue para outro plugin.
Arquitetura de Alto - Nível
Dispositivos como fita cassete e VCRs fornecem um modelo familiar para a gravação,
processamento e apresentação das mídias contínuas. Quando você reproduz um filme
15
usando um VCR, você fornece os fluxos de dados ao VCR introduzindo uma fita de vídeo.
O VCR lê e interpreta os dados emite sinais apropriados à televisão e alto-falantes.
Figura 1: Gravando, processando, e apresentando mídias temporais.
JMF usa este mesmo modelo básico. Uma fonte de dados encapsula os mesmos como
uma fita de vídeo, e um tocador fornece os mecanismos de processamento e controle
similares a um VCR. Reprodutores de áudio e vídeo com JMF requerem dispositivos de
entrada e saída apropriados, como microfones, câmeras, alto-falantes, e monitores.
As origens dos dados e os reprodutores são partes integrais do API high-level de JMF para
controlar a captação, apresentação e processamento das mídias contínuas. JMF fornece
também um API lower-level que suporta a integração entre componentes de processamento
e extensões. Essa estrutura em camadas permite aos desenvolvedores Java a incorporação
de mídias contínuas em programas Java através de uma API simples ao mesmo tempo em
que mantém a flexibilidade requerida para suportar aplicações multimídias avançadas e
tecnologias futuras
Figura 2: Arquitetura de alto Nivel do JMF.
16
Modelo Do Tempo
JMF mantém a precisão do tempo em nanossegundo. Um ponto particular do tempo é
representado tipicamente por um objeto Time, embora algumas classes suportem também a
especificação de tempo em nanossegundos.
Classes que suportam do modelo do tempo de JMF, implementam o instrumento Clock
para se manter síncrono com a mídia. A interface Clock define o tempo básico e as
operações de sincronismo que são requeridas para controlar a apresentação dos dados
Figura 3: Modelo do tempo de JMF.
O Clock usa uma base de tempo para manter-se síncrona conforme o fluxo de dados
vai sendo apresentado. A única informação que o TimeBase fornece é seu tempo atual, que
é consultado como tempo time-base. O tempo do time-base não pode ser parado ou
reiniciado e é freqüentemente baseado no relógio do sistema.
O media time representa a posição atual dos dados da mídia -- o começo do dado é
o tempo mídia zero, e o fim do fluxo é o tempo máximo da mídia. A duração do fluxo de
dados é o é o tempo decorrido do começo ao fim -- o intervalo de tempo que leva para
apresentar a mídia.
Para manter-se a par do tempo atual dos meios, o Clock usa:
•
O início do tempo do time-base – esse tempo usa relatórios TimeBase quando a
apresentação começar.
•
O início do tempo das mídias - a posição nos mídias onde a apresentação
começa.
17
•
A taxa do playback -- como o clock está funcionando com relação ao seu
TimeBase. A taxa é um fator de escala que deve ser aplicado se. Para o exemplo,
uma taxa de 1.0 representa a taxa normal do playback para as mídias em
apresentação. Quando uma taxa de 2.0 é requerida, isso indicará que a
apresentação deverá funcionar duas vezes a mais que a taxa normal. Uma taxa
negativa indica que o clock está funcionando no sentido contrário do seu time
base. Por exemplo, uma taxa negativa pode ser usada para jogar o fluxo da
mídia para trás.
Quando a apresentação começa, o tempo dos midias mapeado para o time-base e o
avanço do tempo dele é usado medir a passagem do tempo. Durante a apresentação, o
tempo atual das mídias é calculado usando a seguinte fórmula:
MediaTime = MediaStartTime + Rate(TimeBaseTime - TimeBaseStartTime)
Quando a apresentação pára, o tempo dos midias pára, mas o tempo do time-base continua
a avançar. Se a apresentação for reiniciada, o tempo das mídias é remapeado para o tempo
atual do time-base.
Gerenciadores
O JMF API consiste principalmente de interfaces que definem o comportamento e a
interação dos objetos usados para capturar, processar, e apresentar mídias temporais. As
implementações dessas interfaces operam dentro da estrutura do framework. Por intermédio
do uso de objetos chamados gerenciadores, JMF permite facilmente integrar novas
implementações de interfaces que podem ser usadas com classes já existentes.
JMF usa quatro gerentes:
•
Manager - negocia a construção de Players Processors, DataSources, e DataSinks.
Ele permite que novas implementações sejam integradas perfeitamente com JMF.
Do ponto de vista do usuário, estes objetos são criados sempre da mesma maneira,
quer o objeto pedido seja construído de uma implementação default ou qualquer
outra.
18
•
PackageManager - mantém um registro dos pacotes que contêm classes de JMF,
tais como Players habituais, Processors, DataSources e DataSinks.
•
CaptureDeviceManager -
mantém um registro de dispositivos disponíveis da
captura.
•
PlugInManager - mantém um registro de plug-in processadores de componentes
JMF disponíveis, como Multiplexers Demultiplexers, Codecs Effects, e Renderers.
Para escrever os programas baseados em JMF, você necessitará usar os métodos do
Manager create para construir Players Processors, DataSources, e DataSinks para sua
aplicação. Se você estiver capturando dados multimídia de um dispositivo de entrada, você
deverá usar CaptureDeviceManager para descobrir quais dispositivos estão disponíveis e
obter informação sobre eles. Se você estiver interessado em controlar o que o processador
está realizando sobre os dados, você pode também pedir ao
PlugInManager para
determinar quais plug-ins foram registrados.
Se você estender a funcionalidade de JMF para implementação de um novo plug-in, você
pode registrá-lo com PlugInManager para torná-lo disponível os Processors que suportam
o plug-in API . Para usá-lo um costume Player Processor, DataSource, ou DataSink com
JMF, deve se registrar seu prefixo original de pacote com o PackageManager.
Modelo Do Evento
JMF usa um evento estruturado que relata o mecanismo de sustento aos programas,
informando o estado atual do sistema de mídias, permitindo aos programas responderem às
condições de erro provenientes das mídias. Como, por exemplo, dados mal estruturados e
falta de recursos. Sempre que um objeto de JMF necessita relatar as circunstâncias atuais,
ele afixa um MediaEvent. MediaEvent é uma subclasse criada para identificar tipos
particulares de eventos. Esses objetos seguem as padronizações estabelecidas pelos eventos
de Java beans.
Para cada tipo de objeto do JMF que pode afixar MediaEvents, JMF define uma
relação correspondente do listener. Para receber a notificação quando o MediaEvent é
19
afixado, deve-se executar a relação apropriada do listener e registrar a sua classe com o
objeto que afixou o evento (isso é feito chamando seu método add).
Figura 4: Modelo do evento de JMF.
Modelo Dos Dados
Os players da mídia
de JMF usam geralmente DataSources para controlar a
transferência do índice da media. Um DataSource encapsula a posição das mídias, o
protocolo e o software usados entregá-las. Uma vez que acessada, a fonte não pode ser
reutilizada.
Um DataSource é identificado por um JMF MediaLocator ou por a URL
(localizador universal do recurso). A MediaLocator é similar a uma URL e pode ser
construído de uma URL, e pode ser construído mesmo se o alimentador correspondente do
protocolo não é instalado no sistema. (em Java, a URL pode somente ser construído se o
alimentador correspondente do protocolo for instalado no sistema.)
Um DataSource controla o player SourceStream dos objetos. Uma origem dos
dados de padrão usa uma disposição do byte como a unidade de transferência. Uma origem
dos dados usa Buffer um objeto como sua unidade de transferência. JMF define diversos
tipos DataSource de objetos:
20
Figura 5: Modelo dos dados de JMF.
Entrada e saída dos dados
Os dados das mídias podem ser obtidos de uma variedade de fontes, tais como
mídias estáticas (gravadas em disco rígido, por exemplo) ou da rede através de transmissão
de tempo real. A origens dos dados de JMF podem ser categorizadas de acordo como é
iniciada a transferência de dados:
•
Fonte de dados de tração-- o cliente inicia transferência de dados e controla o fluxo
na origem. Os protocolos estabelecidos para este tipo de dados incluem o protocolo
de transferência de hypertext (HTTP). JMF define dois tipos de origens para dados
de tração: PullDataSource e PullBufferDataSource, que usam um objeto Buffer
como unidade de transferência.
21
5 – Bibliografia
•
[1] ISO/IEC 14496-5:2001. Coding of Audio-Visual Objects – Part 1: Systems, 2
Edition, 2001
•
[2] ISSO/IEC 14496-1:2001, Amendment1. Coding of Audio-Visual Objects – Part
1:Systems, 2001
•
[3] Fernando, Gerard, Atul Puri, Viswanathan Swaminathan, Robert L Schimidt,
Pallavi Shah, and Keith Deutsch, Architecture and API for MPEG-J. Doc.
ISO/MPEG N3545, Dublin MPEG Meeting, July 1998
•
[4] DAVIC 1.4.1:1998. Part 9: Information Representation
•
[5] ISO/IEC 13818-1:2000. Generic Coding of Moving Pictures and Associated
Audio Information – Part 1: Systems, 2000.
•
[6] ETSI. Specification for Service Information (SI) in DVB Systems. Doc. EN
300468 V1.3.1
•
Multimedia Fundamentals, Volume 1; Media Coding and Content Processing (2d
Edition)
•
http://java.sun.com/products/java-media/jmf/2.1.1/guide
22
Download