Android
MobiPlayer
Desenvolvendo um player de vídeo Android
De que se trata o artigo:
Desenvolvimento de uma aplicação para reprodução de vídeos, utilizando os recursos de multimídia, interface e banco de dados providos pela plataforma Android.
Para que serve:
Desenvolver aplicações para reprodução de vídeos remotos (com streaming) nos formatos mais populares, fazendo bom uso das capacidades multimídia da plataforma Android.
Em que situação o tema é útil:
Quando se deseja fornecer recursos de vídeo remoto ao usuário de um dispositivo móvel que roda Android, de forma performática e amigável.
A plataforma Android possui grandes capacidades multimídia, as quais englobam a reprodução e gravação de recursos de áudio e vídeo, bem como o tratamento de imagens nos formatos mais populares. Neste artigo, vamos nos ater somente ao que diz respeito à reprodução de vídeos. Para isto, desenvolveremos um player passo a passo.
APIs de multimídia Android
A reprodução de recursos multimídia no Android é realizado através da classe android.media.MediaPlayer, que é capaz de reproduzir áudio e vídeo de qualquer fonte, seja ela um recurso da aplicação, do sistema de arquivos ou de uma rede (via URL).
No que diz respeito às capacidades de multimídia, o Android baseia-se no OpenCORE da PacketVideo, sendo que suas bibliotecas suportam a reprodução e gravação dos mais populares formatos de áudio e vídeo, bem como imagens estáticas, incluindo MPEG4, H.264, MP3, AAC, AMR, JPG, e PNG.
Infelizmente, no SDK M5, o suporte a áudio e vídeo on-line não dispõe das mesmas facilidades que arquivos de mídia locais, ou seja, se você estiver passando uma URL para um arquivo de mídia on-line, este arquivo deve ser do tipo .mp4 ou .3gp e poder ser baixado progressivamente.
Construindo um player de vídeo
Veremos aqui como desenvolver aplicações multimídia para o Android através de um player de vídeo on-line, o qual guarda um histórico dos vídeos assistidos e disponibiliza ao usuário uma seção de vídeos favoritos.
Esta aplicação deve, portanto, conectar-se a um servidor remoto, utilizar-se de streaming de vídeo (o qual deverá ser desenvolvido) e manter o vídeo em histórico com um screenshot para melhor identificação do vídeo pelo usuário em momento futuro.
Antes de começarmos a discutir a aplicação, vale lembrar sobre o conceito de Atividade no Android: uma Atividade é algo que o usuário pode fazer e geralmente é uma única tela. Atividades são implementadas como classes que estendem Activity, exibindo uma interface para o usuário, composta por Views (elementos de interface).
Nosso player pode então ser divido em quatro atividades: a primeira, destinada a exibir os possíveis caminhos do usuário dentro da aplicação, possibilitando solicitar a visualização de um novo vídeo, acessar os favoritos ou ainda selecionar um vídeo do histórico; a segunda, capaz de cadastrar um vídeo; a terceira capaz de reproduzi-lo; a quarta, responsável pela seção de favoritos.
O SDK nos disponibiliza duas maneiras para tratar áudio e vídeo. A mais fácil delas é fazer uso da classe android.widget.VideoView. Esta exibe um arquivo de vídeo, podendo carregar imagens de várias fontes. Ainda provê o gerenciamento computacional do tamanho do vídeo em tela, o que torna possível utilizá-lo com qualquer gerenciador de layout (além de fornecer várias opções de visualização).
No entanto, além de exibir o vídeo, queremos obter um screenshot, ou seja, escolher um frame do vídeo e exportar para uma imagem no sistema de arquivos. Isto implica na escolha da segunda maneira: o MediaPlayer. Este, além de permitir operações sobre a mídia, disponibiliza funcionalidades de playback e callback para bufferização via rede.
Escolhida a forma como vamos trabalhar, basta saber que devemos ainda organizar os dados relativos aos vídeos assistidos em histórico e favoritos. Para tanto, vamos utilizar fachadas que cuidarão do manejo das nossas entidades - vídeos e favoritos (o acesso ao banco de dados se dá pelo SQLite e não será discutido aqui, visto que não é o escopo do artigo).
A Figura 1 exibe nossa atividade principal, a qual dará inicio ao desenvolvimento do player. Nela destaca-se o histórico, uma lista horizontal de imagens que através de uma certa animação exibe o screenshot do vídeo. Esta lista animada de imagens é uma instância de android.widget.Gallery, a qual permite a seleção de imagens em formato de galeria. Mas para obtermos o efeito que desejamos, ainda se faz necessário exibir a imagem atualmente selecionada, para tanto utilizaremos um android.widget.ImageSwitcher.
Figura 1. Atividade Player, demonstrando o histórico
Na Listagem 1, temos o trecho de código que define esta atividade, que implementa algumas interfaces para tratar dos eventos relativos ao histórico, além de buscar todos vídeos cadastrados no banco de dados.
As linhas 15 e 16 desta listagem são responsáveis por buscar todos os vídeos presentes no banco de dados e armazená-los em uma lista, a qual será utilizada para alimentar o histórico de vídeos, na linha 31.
A formulação do histórico se dá por uma Gallery que exibe os screenshots do vídeo (através de um adaptador de imagens), sendo ainda responsável pelo tratamento dos eventos de clique e seleção de vídeos.
Nas linhas
Ainda no histórico, usamos um ImageSwitcher, que troca as imagens de acordo com os comandos da galeria, utilizando uma animação de fade-in/fade-out, fazendo com que as imagens troquem suavemente.
É importante ressaltar que estes componentes devem ser devidamente expostos nos arquivos XML responsáveis pelo layout da aplicação (de acordo com a Listagem 2), caso contrário não poderão ser utilizados conforme demonstrado.
Listagem 1. Player.java
1. public class Player extends Activity
2. implements AdapterView.OnItemSelectedListener,
3. AdapterView.OnItemClickListener,
4. ViewSwitcher.ViewFactory{
5. .....
6. private ImageSwitcher mSwitcher;
7.
8. private FachadaVideo fachadaVideo;