height=264 alt=capa10.JPG src="/imagens/webmobile/edicoes/10/capa10.JPG" width=201 border=0>

Clique aqui para ler todos os artigos desta edição

Multimídia em J2ME

Dominando a Mobile Media API

O uso de recursos multimídia em dispositivos móveis ganha cada vez mais força. Conforme os aparelhos aumentam sua capacidade de armazenamento e processamento, os aplicativos ficam mais carregados de imagens, vídeos e sons. As operadoras aumentam cada vez mais a gama de serviços multimídia, tais como toques com qualidade variável de acordo com o aparelho, papéis de parede, vídeos e até mesmo TV no celular. Além disso, o próprio usuário pode carregar vídeos, músicas, imagens e quaisquer outros recursos multimídia que seu aparelho permitir.

Este artigo explora a interface de programação multimídia mais comum nos dispositivos com Java embutido, ou seja, a Mobile Media API (MMAPI), permitindo ao leitor criar suas próprias aplicações, com as mais variadas finalidades. Essa API permite que o desenvolvedor manipule as funcionalidades multimídia dos dispositivos, tais como a execução de vídeo e de áudio, podendo ainda modificar o conteúdo original com filtros pré-definidos. Além disso, provê a utilização da câmera fotográfica, caso o aparelho disponha desse recurso.

Visão geral da Mobile Media API – MMAPI

O entendimento da Mobile Media API – MMAPI – é um pouco complicado. Por se tratar de uma API que envolve o controle direto de hardwares específicos (o sintetizador de áudio ou o chip decodificador de vídeo do aparelho, por exemplo), uma série de abstrações foi feita no projeto da API. Esta seção desenvolve o conceito geral da API, de uma forma mais teórica, enquanto as outras seções desenvolvem exemplos práticos do uso da API para reproduzir sons e vídeos. Uma série de exemplos em seqüência gradativa de complexidade foi elaborada para melhor ilustrar o uso da MMAPI.

A MMAPI funciona de forma similar ao Java Media Framework – JMF (ver Nota 1). Assim como a JMF, a idéia da MMAPI é fornecer funcionalidades de reprodução e gravação de conteúdo multimídia sem especificar o protocolo de transmissão ou o formato do arquivo a priori. Esses parâmetros, como o formato do arquivo,  são definidos em tempo de execução, de acordo com a mídia que se deseja executar. O conceito de encapsulamento é bastante empregado nessa API, como será visto a seguir.

 

Nota 1. Java Media Framework

O Java Media Framework é uma API que permite a incorporação de vídeo e áudio em aplicações e applets Java. É utilizada também no JavaTV, API direcionada à rodar em set-top boxes de TV digital. A MMAPI é similar ao JMF na estrutura do Manager e players, que estão presentes em ambas as APIs e apresentam papéis semelhantes.

 

A Figura 1 ilustra o funcionamento da MMAPI.

 

image002.gif

Figura 1. Integração dos conceitos fundamentais da MMAPI.

 

Olhando a Figura 1, o conteúdo é a informação que se deseja reproduzir. Esse conteúdo pode ser um arquivo dentro do arquivo Jar que contém o aplicativo, um streaming vindo de uma conexão http, um array de bits armazenado no RMS, ou qualquer outro mecanismo de entrega de conteúdo. O importante é que esse conteúdo seja um array de bits conciso, de acordo com a especificação do formato (ou seja, os cabeçalhos estejam sinalizando corretamente os bits de informação, o nível de compressão, etc..). Esse conteúdo é externo à API. 

O conteúdo alimenta uma classe denominada DataSource, que irá levar os dados de sua localização original até o player. Ela encapsula a informação, de forma que fique transparente para o player a origem dos dados. A classe DataSource provê métodos para lidar com dados que venham de diversas fontes, como streaming via internet.

O player é o elemento que sabe como interpretar os dados de mídia. Um tipo de player pode ser específico para arquivos Midi, outro pode ser específico para arquivos ‘.wav’ e assim por diante. Uma vez criado, não é possível desassociar a mídia ao player e, portanto, não é possível modificar o tipo do player (isto é, se ele é específico para midis, ou se é específico para gravação de áudio).

O Manager é o responsável por integrar os outros componentes e servir como ponto de entrada para a API. A classe javax.microedition.media.Manager possui métodos estáticos para obtenção de Players e DataSources. O Manager é a classe que seleciona que instruções um determinado player saberá, de acordo com o DataSource associado.

Cada player pode ser manipulado por controles, que permitem mudanças no seu comportamento. Os controles são representados por implementações da interface javax.microedition.media.Control e podem ser obtidos de uma instância de um Player. Cada controle específico se encontra no pacote javax.microedition.media.control, como, o VolumeControl, que permite aumentar ou reduzir o volume de um áudio que estiver sendo reproduzido.

Entre as funcionalidades da MMAPI, encontram-se:

·         Independência entre protocolos e formatos de áudio/vídeo;

·         Geração de Tons, inclusive em múltiplos canais;

·         Reprodução de áudio em diversos formatos;

·         Reprodução de vídeo em diversos formatos;

·         Gravação de áudio;

·         Captura de fotos.

 

Todas essas funcionalidades serão abordadas no artigo com exemplos práticos.

Geração de tons

A funcionalidade mais básica da MMAPI é a geração de tons. Esse tom não é o toque do celular, mas  consiste em reproduzir um harmônico puro nas caixas de som do aparelho. O som produzido é semelhante ao som que se escuta quando se retira um telefone fixo do gancho (nesse caso, a freqüência é de 440 Hz, correspondendo à nota musical Lá). Por conveniência, este método se encontra na classe Manager e não é necessário criar um DataSource ou um Player para executá-lo (o motivo para isso ficará mais claro adiante).

O código para gerar um tom nas caixas de som do aparelho pode ser visto na Listagem 1.  

Listagem 1. Código para reproduzir um tom.

    try {

        Manager.playTone(ToneControl.C4,4000,100);

    } catch (MediaException me) {

        //do nothing...

    }

 

A assinatura do método é a seguinte:

 

public static void playTone(int note, int duration, int volume) throws MediaException

 

No exemplo da Listagem 1, uma nota Dó (C, na notação musical – ver Nota 2) de 261,63 Hz (por isso um C4, diferenciando, por exemplo, de um C5 de 523,25 Hz, mais agudo) é gerada na saída da caixa de som, utilizando o volume máximo do aparelho durante 4 segundos. Esta nota não é reproduzida – ela é gerada a partir dos dados de entrada, ou seja, a freqüência e a duração. Essa implementação muda de aparelho para aparelho – alguns podem ter um sintetizador em Hardware para executar essa tarefa, o que seria mais indicado, enquanto outros podem gerar o tom por software (uma tabela de bytes, contendo a intensidade da corrente elétrica que será enviada à caixa de som) e então tocar o som na saída da caixa de som do aparelho. Por esse motivo não é necessário um DataSource ou um Player – os dados não precisam de nenhum tratamento especial, sendo apenas transmitidos para a caixa de som.

 

Nota 2. Curiosidade a respeito de Notas Musicais

A nota usada como parâmetro de entrada para o método playTone() varia entre 0 e 127, sendo traduzida para a freqüência de acordo com a fórmula a seguir:

     SEMITONE_CONST = 17.31234049066755 = 1/(ln(2^(1/12)))

     note = ln(freq/8.176)*SEMITONE_CONST

     A nota musica Lá (A) = MIDI note 69 (0x45) = 440 Hz.

...

Quer ler esse conteúdo completo? Tenha acesso completo