O Java na TV brasileira e no mundo!

Propaganda
: : www.mundoj.com.br : :
Mário de Sá Vera
([email protected]) é graduado em Ciência da
Computação pela Universidade Federal Fluminense e trabalha
com Arquitetura de Sistemas utilizando Orientação a Objetos.
Acompanhou a evolução da linguagem Java – pela qual é
entusiasta, e liderou o desenvolvimento de sistemas nas
áreas de Geoprocessamento, Sistemas de Mensageria e Visão
Computacional. Atualmente faz parte do grupo de Inovação da
M4U Soluções, com foco nas possibilidades de interatividade em
convergência entre Telefonia Móvel e TV Digital.
David Campêlo
([email protected]) é graduado e mestre em Ciência
da Computação pela Universidade Federal do Ceará, onde atuou
como pesquisador e líder de projetos nas áreas de ensino a
distância e TV Digital Interativa. Em 2005, foi membro efetivo
de jornadas de integração em trabalhos coletivos de pesquisa no
Projeto SBTVD. Já trabalhou com TV Participativa e atuou como
docente de ensino superior. Atualmente, na TOTVS é coordenador
técnico da primeira implementação comercial completa do
middleware Ginga e sistemas IPTV.
Ginga-J:
O Java na TV brasileira e
no mundo! Os novos avanços rumo à TV Interativa
Mesmo em tempos onde netbooks e iTablets têm
preços bem atraentes, ninguém discorda que a TV
ainda é o eletrodoméstico mais presente na casa
dos brasileiros. Hoje, mais de 90% dos lares contam
com pelo menos uma TV. E, para os que ainda
não sabem, já é possível executar aplicativos Java
enquanto assistimos a um programa de televisão.
Em paralelo, instituições brasileiras se movimentam
para divulgar o padrão baseado no JavaDTV em
outros países, dando ao Brasil uma posição de
destaque internacional em termos de interatividade
na TV. Neste artigo, apresentamos um panorama
com o cenário atual da TV Digital Interativa (DTVi),
que tem evoluído bastante, e damos ao leitor uma
introdução ao Ginga-J indicando ferramentas e
possibilidades de desenvolvimentos avançados.
50
a Copa do Mundo da África, algumas
emissoras já transmitiram aplicativos
interativos desenvolvidos com tecnologia Ginga-J, que consiste no módulo de
interatividade do padrão nipo-brasileiro ISDBTb de TV Digital baseado na tecnologia Java.
Este ano, a tecnologia se consolidou recebendo,
inclusive, aprovação na UIT (União Internacional de Telecomunicações). O mercado começa
a dar sinais de vida com diversos fabricantes
de dispositivos lançando versões de aparelhos
já suportando o Ginga-NCL e Ginga-J e as
principais emissoras já realizando testes com
aplicativos sendo transmitidos juntamente com
sua programação.
No decorrer deste artigo descreveremos a
arquitetura do Ginga-J e ferramentas de desenvolvimento serão apresentadas para que o leitor
se sinta capaz de se iniciar neste promissor mercado de software para dispositivos televisivos
no Brasil e no mundo.
Padrão Ginga de Interatividade
Dentre as normas que definem a arquitetura do padrão brasileiro
de TV digital consta a especificação do middleware Ginga, camada de software que tem como objetivo abstrair especificidades de
hardware presentes em dispositivos de recepção de conteúdo televisivo digital. O Ginga expõe serviços de modo padronizado para
aplicações interativas, escondendo peculiaridades de camadas inferiores, como, por exemplo, a tecnologia usada para compressão,
modulação, persistência etc.
O padrão Ginga comporta dois motores de execução para aplicações interativas, um para execução de aplicações construídas utilizando a linguagem NCL/Lua (Ginga-NCL) e outro para execução
de aplicações utilizando a linguagem Java (Ginga-J). Apesar de
serem funcionalmente semelhantes, a adoção da linguagem Java
para criação de aplicações interativas permite um controle mais
refinado do ambiente de TV digital (em grande parte por conta
de suas APIs, as quais serão vistas em detalhes ao longo deste
artigo), bem como aproveita a grande massa de desenvolvedores
Java já formados e disponíveis no mercado. Vale lembrar que a linguagem NCL/Lua foi criada por pesquisadores brasileiros durante
trabalhos realizados ao longo dos últimos anos.
O motor de execução Ginga-J tem como base as APIs livres JavaTV versão 1.1 e JavaDTV versão 1.3, ambas especificadas pela Sun
Microsystems, empresa criadora da tecnologia Java. Além disso,
para que as aplicações Java possam ser executadas pelo Ginga-J,
faz-se necessária a presença de uma JVM (Java Virtual Machine)
no receptor de TV digital. Segundo a especificação do Ginga-J,
a JVM empregada deve ser compatível com a arquitetura para
sistemas embarcados CDC/FP (Connected Device Configuration/
Foundation Profile) versão 1.1.2 e perfil PBP (Personal Basis Profile) versão 1.1.
Como já é de se esperar, a arquitetura definida pelo Ginga-J assemelha-se às arquiteturas já existentes baseadas em J2ME (representada na figura 1), o que deixa em vantagem os desenvolvedores
que já tiveram alguma experiência com aplicativos para celulares,
por exemplo.
Figura 1. Arquitetura J2ME.
JavaDTV
Fruto de uma das maiores polêmicas enfrentadas pelo Fórum SBTVD
(entidade responsável pela padronização do sistema de TV digital brasileiro), o JavaDTV teve como motivação libertar fabricantes, emissoras
e consumidores de um grande problema: o pagamento de royalties.
Por basear-se no GEM (Globally Executable MHP – especificação
criada no escopo do padrão de TV digital Europeu DVB), a antiga
especificação do Ginga-J determinava o pagamento de royalties tanto
por unidade de recepção como por quantidade de telespectadores. Os
encargos atrelados ao GEM assombraram membros do Fórum SBTVD
durante meses, até que, após aliança firmada com a Sun Microsystems
em meados de 2008, um time de técnicos foi designado para a criação
de uma especificação funcionalmente equivalente à especificação baseada no GEM. Nasceu assim o JavaDTV.
Além de definir extensões ao JavaTV, o JavaDTV emprega uma biblioteca já conhecida por muitos desenvolvedores Java para dispositivos
móveis. O LWUIT (Light-Weight User Interface Toolkit) é uma biblioteca de widgets gráficos inspirada no SWING e seus componentes são
bastante leves e fáceis de usar. O emprego do LWUIT na nova especificação possibilitou ainda uma maior convergência entre os aplicativos
desenvolvidos para celulares e para receptores de TV digital interativa.
Na prática, aplicações escritas utilizando LWUIT em ambiente J2ME
podem ser facilmente adaptadas para o ambiente televisivo.
Assim, o JavaDTV é uma especificação de ambiente de execução
Java livre de royalties que define extensões para o JavaTV. A tabela
1 lista os principais pacotes do JavaDTV, descrevendo em linhas
gerais suas funções.
Pacote
Descrição
com.sun.dtv.application
Este pacote fornece meios de controlar o ciclo de
vida das várias aplicações disponíveis no receptor.
com.sun.dtv.broadcast
Este pacote contém mecanismos para monitoramento dos sistemas de arquivos transmitidos, bem como
dos eventos de fluxo (stream events) sinalizados.
com.sun.dtv.filtering
Este pacote fornece mecanismos para uso refinado
dos filtros de seção da plataforma para acesso a dados transmitidos na tabelas PSI/SI (Program Specific
Information/Service Information).
com.sun.dtv.io
Este pacote estende o pacote java.io e indica as
permissões de acesso para arquivos persistentes.
com.sun.dtv.media
Este pacote define controles de mídia para uso em
cenários de interatividade avançados.
com.sun.dtv.net
Utilizando as funções deste pacote é possível controlar os dispositivos de canal de interatividade presentes no receptor a partir da classe NetworkDevice.
com.sun.dtv.platform
Este pacote contém meios para manter propriedades
de usuário mantidas na plataforma.
com.sun.dtv.resources
Este pacote traça diretivas acerca da utilização de
recursos escassos do sistema, como eventos de tecla,
planos gráficos, sintonizador, filtros de seção etc.
com.sun.dtv.security
Neste pacote são definidos mecanismos adicionais
para segurança (nota: o JavaDTV importa em sua
especificação as API JSSE e JCE).
com.sun.dtv.smartcard
Este pacote define acesso à leitura de smartcards
segundo configurações presentes na plataforma.
com.sun.dtv.transport
Este pacote provê acesso às componentes presentes
no fluxo de transporte (transport stream).
com.sun.dtv.ui
São definidas neste pacote funcionalidades
específicas para interação com usuário, bem como
renderização nos planos gráficos.
com.sun.dtv.lwuit
Este pacote importa os componentes do framework
gráfico LWUIT, além de introduzir componentes
específicos para o ambiente de TV.
Tabela 1. Pacotes que compõem a API do Java DTV.
51
: : www.mundoj.com.br : :
Listagem 1. Código-fonte do Hello world!
import java.awt.Color;
import com.sun.dtv.lwuit.Font;
import com.sun.dtv.lwuit.Form;
import com.sun.dtv.lwuit.Label;
import com.sun.dtv.lwuit.geom.Dimension;
import com.sun.dtv.lwuit.layouts.CoordinateLayout;
import javax.microedition.xlet.Xlet;
import javax.microedition.xlet.XletContext;
import javax.microedition.xlet.XletStateChangeException;
Para ser interpretada como uma aplicação para TV Digital toda
aplicação deve ter um ponto de entrada, que consiste em uma
classe principal que implementa a interface javax.tv.xlet.Xlet. A
partir de chamadas enviadas a esta classe o sistema pode controlar
o ciclo de vida da aplicação. E como não podia deixar de ser, a primeira aplicação que mostraremos aqui (apresentada na Listagem
1) é um HelloWorld utilizando a API gráfica LWUIT. O resultado
é apresentado na figura 2.
Nota: vale lembrar que segundo a especificação Ginga-J são
suportados os bytecodes gerados em versões entre 45.3 e 47
(equivalente à versão 1.3 do Java).
public class HelloLWUIT implements Xlet {
/**
* Inicializando a aplicação. Neste método deve ser feita a inicialização
* da aplicação. Se algo der errado, então uma XletStateChangeException
* será gerada para notificar o sistema que a aplicação não foi inicializada.
*/
public void initXlet(XletContext ctx) throws XletStateChangeException {}
/**
* Executando a aplicação. Neste ponto a aplicação pode exibir seus
* gráficos na tela
* e iniciar a interação com o usuário, ou mesmo realizar qualquer
* atividade necessário ao seu funcionamento.
*/
public void startXlet() throws XletStateChangeException {
Form mainForm = new Form(“Hello Form”);
Label label = new Label(“Hello world!”);
mainForm.getStyle().setBgColor(Color.WHITE);
label.getStyle().setBgColor(Color.BLUE);
label.getStyle().setFgColor(Color.WHITE);
label.getStyle().setFont(Font.createSystemFont(
Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_LARGE));
mainForm.addComponent(label);
mainForm.show();
}
/**
* Pausar a aplicação. Neste ponto recomenda-se que a aplicação libere
* qualquer
* recurso escasso, como threads, conexões etc.
*/
public void pauseXlet() {}
/**
* Parar a aplicação. O parâmetro boleano diz ao método se o
* Xlet tem a opção de continuar em execução por mais um tempo.
*/
public void destroyXlet(boolean unconditional) throws
XletStateChangeException { }
}
52
Figura 2. Hello world! do Ginga-J.
O ambiente de desenvolvimento
Além de conhecimentos de TV digital interativa e das APIs adotadas pelo Ginga-J, desenvolvedores Java necessitam apenas de um
emulador para adentrar no mundo das aplicações interativas. Um
bom emulador é muito importante para suporte a testes no bom e
velho PC antes dos testes em ambiente real.
Há opções livres de emuladores disponíveis na Internet. Dentre
estas estão o OpenGinga (www.openginga.org) e o MOSTVD
(www.middlewareopensource.com), que são livres e podem ser
baixados gratuitamente. Outra opção de emulador é o ByYouStudio (www.byyou.com.br/byyoudevnet/), que conta com uma
implementação comercial do Ginga para o ambiente Linux PC.
Após os testes preliminares no ambiente emulado chega o momento dos testes em ambiente real de produção. Para isso, faz-se
necessário um playout para transmissão da aplicação interativa,
além do receptor de sinal digital.
Já é possível encontrar no mercado televisores dotados de implementações do Ginga-J. No entanto, infelizmente não há implementações de playouts livres compatíveis com o padrão brasileiro
de TV digital. Encontram-se como opções comerciais de playouts
o ByYou Play (www.tqtvd.com) e o EiTV (www.eitv.com.br).
Para Saber Mais
Playout é um componente de software ou hardware responsável pela geração do transport stream contendo as componentes de áudio, vídeo e dados, incluindo a aplicação interativa.
Além disso, o Playout também é responsável pela transmissão
do transport stream gerado que será enviado over the air
(OTA) até os receptores de TV Digital.
A arquitetura de J2ME prevê diversos profiles para atender às
limitações de hardware de um determinado dispositivo. O mesmo
vale para os STBs que rodarão os aplicativos sendo transmitidos
ou já embarcados de fábrica. A seguir, exploramos um pouco do
que pode ser feito com o Ginga-J.
O que se pode fazer com o Ginga-J?
Nesta seção, são listados alguns casos de uso reais de aplicativos
Ginga-J, alguns deles inclusive já transmitidos durante a programação de grandes emissoras de TV do Brasil.
Por considerar que o elemento principal da programação televisiva é o vídeo transmitido, é bastante comum que aplicações
interativas não sejam exibidas em modo de tela-cheia. É bastante
comum também o uso de transparência nas imagens
Listagem 2. Código-fonte com o controle de eventos numéricos da aplicação enquete.
/**
* Este trecho de código utiliza o pattern Observer para registrar no
* gerente de eventos
* (UserInputEventManager) de interação com o usuário um listener. O
* dispositivo que disparará
* o evento é a tela (Screen) e o evento a ser tratado será do tipo
* KeyEvent – evento de teclado.
*/
class EventReceiver implements com.sun.dtv.ui.event.UserInputEventListener
{
public synchronized void reserveKeys() {
UserInputEventManager inputManager;
KeyEvent event_1;
KeyEvent event_2;
Enquete
A aplicação de enquete é um excelente caso de uso para observar a
opinião dos telespectadores sem que para isso seja necessário usar
outro dispositivo além da própria TV. Utilizando a API padrão java.
net.Socket para efetuar a comunicação com um servidor de votação
e uma API de RSS para buscar novas notícias, a aplicação constitui
uma excelente alternativa aos programas de Quiz e similares. Vale
lembrar que toda a comunicação via TCP/IP ou HTTP já é implementada na própria API de sockets Java padrão, o que facilita o
desenvolvimento. Em seguida, temos a enquete rodando na telinha:
Screen currentScreen = Screen.getCurrentScreen();
inputManager = UserInputEventManager.getUserInputEventManager(
currentScreen);
event_1 = new KeyEvent(null, KeyEvent.KEY_PRESSED, 0, 0,
KeyEvent.VK_1, ‘0’);
event_2 = new KeyEvent(null, KeyEvent.KEY_PRESSED, 0, 0,
KeyEvent.VK_2, ‘0’);
inputManager.addUserInputEventListener( (UserInputEventListener)
this, event_1);
inputManager.addUserInputEventListener(
(UserInputEventListener) this, event_2);
}
public void userInputEventReceived(UserInputEvent evt) {
// redirects the event
MainForm.dispatchEvent(evt);
}
}
Plantão de notícias
Figura 3. Aplicação enquete.
A enquete pode servir também como uma ferramenta para conhecer melhor o espectador de modo a fazer publicidade direcionada
ou apresentação de conteúdo publicitário diferenciado.
Durante toda a programação é possível que a emissora deseje lançar notícias na tela de modo preciso e rápido. Assim, esta aplicação utiliza a API de monitoramento de arquivos transmitidos pelo
sinal de modo a receber eventos de atualização de suas mídias. Em
seguida, temos o Plantão de Notícias rodando na telinha:
Nesta aplicação, faz-se uso da API para reserva exclusiva de teclas
de modo a capturar os eventos numéricos do controle remoto
(por padrão, o teclado numérico é usado para trocas de canal). A
Listagem 2 apresenta o trecho de código desta aplicação responsável por essa funcionalidade.
Figura 4. Aplicação Plantão de Notícias.
53
: : www.mundoj.com.br : :
Este caso de uso é bastante comum em cenários de interatividade
nos quais é necessária a atualização intensa do conteúdo veiculado. Casos de uso como este tornam bastante peculiar o ambiente
de TV Digital para desenvolvedores Java.
Listagem 3. Código-fonte do controle de eventos de notícias da aplicação Plantão de Notícias
/**
* Neste trecho de código utilizamos, novamente, o pattern Observer
* para registrar desta vez
* um listener para o conteúdo de um arquivo contendo as novas
* notícias as serem apresentadas.
*/
class BroadcastFileEventReceiver implements
com.sun.dtv.broadcast.BroadcastFileListener {
public void registerListener(String file)
throws javax.tv.locator.MalformedLocatorException,
java.io.IOException, javax.tv.locator.InvalidLocatorException {
Locator locator = LocatorFactory.getInstance().createLocator(file);
com.sun.dtv.broadcast.BroadcastFile bFile =
new com.sun.dtv.broadcast.BroadcastFile(locator);
bFile.addListener(this);
}
public void broadcastFileChanged(BroadcastFileEvent event) {
System.out.println(“File [“+ event.getBroadcastFile().
getAbsolutePath()+”] has changed!”);
MainForm.refreshInterface(event.getBroadcastFile());
}
Por lidar com informações sensíveis (dados de senhas e cartões
dos usuários), aplicações deste tipo podem beneficiar-se do uso de
mecanismos de segurança já previstos no padrão Ginga-J, como
transação segura de dados, criptografia, dentre outros.
Nota: a norma ABNTNBR-15605 especifica as resoluções de
segurança do padrão.
Aplicações como essa eventualmente podem precisar redimensionar o vídeo principal transmitido pela emissora, de modo a evitar
que seus elementos sobreponham o conteúdo televisivo. Para isso,
foi usada a API JMF para modificar as dimensões do vídeo principal. A Listagem 4 apresenta um trecho do código da aplicação
correspondente a essa funcionalidade:
Listagem 4. Código-fonte em JMF para resize de vídeo na
aplicação Top Fun.
/**
* Neste trecho de código fazemos uso da classe javax.media.Player
* criando um objeto a partir da
* especificação do protocolo para indicar o vídeo principal (DEVICE 0).
* A partir desta instância
* criamos um controle AWT específico para a troca do tamanho
* original do video (rect).
*/
public static void resizeVideo(java.awt.Rectangle rect)
throws javax.media.NoPlayerException, java.io.IOException {
javax.media.Player videoPlayer =
javax.media.Manager.createPlayer(
new javax.media.MediaLocator(“sbtvd-ts://0”));
public void broadcastFileLost(BroadcastFileEvent event) {
System.out.println(“File [“+ event.getBroadcastFile().
getAbsolutePath()+”] is no longer transmitted!”);
}
if (videoPlayer == null) return;
javax.media.Control control =
videoPlayer.getControl(“javax.tv.media.AWTVideoSizeControl”);
if (!(control instanceof javax.media.AWTVideoSizeControl)) {
System.err.println(“No AWTVideoSizeControl available!”);
return;
}
}
T-Commerce
Fazendo uma analogia com o e-commerce, na TV digital temos o
t-commerce que, como o nome sugere, enquadra os aplicativos de
comércio eletrônico feito pelo canal de interatividade da TV. Um
exemplo é a loja de mídias para celulares (ringtones, wallpapers
etc.) criada pela empresa M4 TV e batizada de Top Fun. Em seguida, vemos a aplicação Top Fun rodando na telinha:
javax.media.AWTVideoSizeControl awtControl =
(javax.media.AWTVideoSizeControl) control;
javax.media.AWTVideoSize sizeDefault = awtControl.getDefaultSize();
presentationControl.setSize(
new javax.media.AWTVideoSize(sizeDefault.getSource(), rect));
}
O momento atual do Ginga
As principais vantagens técnicas do ISDB-Tb (padrão nipobrasileiro para TV Digital) são a especificação de interatividade
por si (Ginga) e a codificação em H264 que aumenta a banda
de transmissão em comparação com os codificadores utilizados
em outros padrões. Todas as especificações do Ginga podem ser
encontradas na rede e vem sendo disponibilizadas pelo Fórum de
TV Digital Brasileiro (SBTVD).
Figura 5. Aplicação Top Fun.
54
O governo tem absoluto interesse na TV Digital como ferramenta
de inclusão social. Esperamos que através de iniciativas como o
PL-29 possamos encontrar o caminho para um modelo de negócios que depende ainda de um incentivo para um ambiente mais
propício à produção de STBs suportando o Ginga, que hoje já é
adotado em quase todos os países da América do Sul, além de
alguns países da África e da América Central.
Até o final do ano de 2010, o Fórum SBTVD deverá atingir o objetivo de ter as normas de interatividade apresentadas e aprovadas.
Atualmente há apenas pendências nas normas que dizem respeito
à segurança no ambiente interativo.
São inúmeras as razões pelas quais a tecnologia Java foi escolhida
para compor o padrão de interatividade Ginga. Além do grande
número de desenvolvedores e do fato de ser uma tecnologia livre,
a tecnologia tem emprego expressivo mundo afora*:
• 930 milhões de downloads do JRE a cada ano;
• 1.4 bilhões de JavaCards sendo produzidos por ano;
• 1.1 bilhões de desktops com Java;
• 6.5 milhões de desenvolvedores ao redor do mundo.
* dados atualmente disponíveis em www.java.com
O governo brasileiro já conseguiu o reconhecimento internacional do Ginga-J junto ao ITU (International Telecommunication
Union) em conjunto com várias entidades relacionadas ao desenvolvimento da tecnologia. Trata-se de uma grande vitória, pois
gera muitas oportunidades para o mercado brasileiro no exterior,
em especial para a indústria de software.
Considerações finais
Enquanto emissoras se movimentam para buscar um novo modelo comercial incluindo a interatividade nas suas grades de programação, fabricantes correm contra o tempo para lançar novos
modelos de TV.
Com os altos preços dos receptores digitais e televisores de LCD,
plasma e LED, o objetivo de incluir a população carente de informação ainda não foi alcançado. No entanto, os benefícios introduzidos pela interatividade na TV já são percebidos nos aplicativos
disponibilizados nos grandes centros do país. Sejam aplicações
informativas, publicitárias ou mesmo de entretenimento, a interatividade pela TV já mostrou que veio para ficar.
O suporte à Java pelo padrão brasileiro de TV Digital será fator
importante na disseminação da cultura de desenvolvimento de
aplicativos sofisticados a serem transmitidos ou embutidos em
receptores (STBs), trazendo assim uma experiência mais produtiva para desenvolvedores e mais prazerosa para os usuários destes
produtos. Atualmente, boa parte dos fabricantes de televisores já
fornecem seus produtos high end com recursos sofisticados em
telas LCD e suportando Ginga-J. Com a crescente oferta destes
aparelhos somada à perspectiva de venda de STBs no varejo com
preços populares esperamos um cenário propício à formação de
um mercado para os desenvolvedores de aplicativos Ginga-J•
Referências
• Forum SBTVD
www.forumsbtvd.org.br
• Ginga
www.ginga.org.br
• JavaTV
www.jcp.org/en/jsr/detail?id=927
• JavaDTV
www.forumsbtvd.org.br/materias.asp?id=200
• CDC
www.jcp.org/en/jsr/detail?id=218
• FP
www.jcp.org/en/jsr/detail?id=219
• PBP
www.jcp.org/en/jsr/detail?id=217
• J2ME
www.mobilegametutorials.blogspot.com/2009/09/j2me-architecture-and-configuration.html
55
Download