Java Media Framework JMF Ronaldo Celso Messias Correia

Slides:



Advertisements
Apresentações semelhantes
I/O Carlos Bazilio Depto de Ciência e Tecnologia
Advertisements

Programação em Java Prof. Maurício Braga
Sistemas distribuídos
Eventos Marco Antonio, Arquiteto de Software – TJDF Novembro/2005
Sockets Marco Antonio – marcoreis.net Arquiteto de Software Dezembro/2007.
Entrada e Saída Marco Antonio Arquiteto de Software Dezembro/2007.
Relatórios Marco Antonio Software Architect Agosto
Marco A. S. Reis EJB Acesso Remoto Marco A. S. Reis
Comunicação entre processos distribuídos
Tratamento de Exceções
Java Conexão com Banco de Dados
Programação orientada a objetos
Chain of Responsibility
Streams Java.
Walfredo Cirne walfredo.dsc.ufpb.br
Invocação de Métodos Remotos RMI
Programação Concorrente
Wagner Santos C. de Jesus
Capítulo 15 Swing – Parte 1.
9 Controle de fluxo Seqüenciadores. Jumps. Escapes. Exceções.
PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001
MGW2000e.
VÍDEOS NA WEB.
Paradigmas de Linguagens de Programação Paradima da Programação Orientada à Objetos Professor: Armando Hage Belém-2008.
Componentes GUI GUI – Grafical User Interface – São construídas a partir de componentes GUI chamados de controles ou widgets (windows gadgets – engenhocas.
CRIANDO OBJETOS EM JAVA
JAVA: Conceitos Iniciais
Acesso a Base de Dados JDBC Trabalho Realizado por:
O Mecanismo de Threads em Java 2. Criar uma classe herdeira da super classe Thread public class minhaThread extends Thread{ public class minhaThread extends.
Concorrência em Java Threads em Java.
Introdução a linguagem Python
Threads: Introdução e Implementação
Tipos Agregados Homogêneos e Listas
Infra-Estrutura de Comunicação (IF678) Aula Prática 02 – CIn/UFPE Davi Duarte Denyson José Eduardo Souza Ivan França Rafael Lima.
Visão geral do projeto Videophone Conference Messenger.
Capítulo 2 Java Servlets.
JAVA Linguagem Ambiente de Desenvolvimento
Streams –input e output
Linguagem de Programação III
Chamada Remota de Procedimentos
Interface Gráfica (material da Profa. Luciana Nedel - www. inf. pucrs
OPERADORESOPERADORES SCJP – Otimize-TI. Operadores Java Resultado: Maioria das operações é um booleano ou numérico. Não podem ser sobrecarregados (Existem.
Universidade do Vale do Rio dos Sinos - São Leopoldo -
Computação Musical e Processamento de Som – 06.1
1 Mobilidade de Código com μcode Projeto Giga Alexandre Lages
Aula Virtual Streaming multimídia Ciência de Contexto/Adaptabilidade.
T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI.
Pilhas Profa. Nádia Félix.
LPII Professora Lucélia. Pacotes Um pacote em Java é um diretório onde ficam armazenadas uma ou mais classes. Geralmente as classes com a mesma afinidade.
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Stream – Fluxo I/O Manipulação de arquivos texto
Concorrência e thread Petrônio Júnior(pglj) Márcio Neves(mmn2)
Listas Simplesmente Encadeadas
Paradigmas da Programação – Semestre 1 – Aula 9 Professor: Eduardo Mantovani )
Profa. Patrícia A. Jaques
Tratamento de Exceções
POO Interface Gráfica - Swing
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Polimorfismo.
Estrutura de Controle em JAVA
Exceções Suzana Fragoso (smpf) Adaptado do material de Guilherme Carvalho (gvc)
Exceções Profa. Patrícia A. Jaques Alterada por Leandro Tonietto abr-15.
Infra-Estrutura de Comunicação (IF678) Aula Prática 02 Programação de Sockets TCP e UDP Hugo Simões Original por: Flávio.
Certificação Marco Antonio. Introdução A compreensão desse capítulo é muito importante pois trata de um assunto essencial em qualquer linguagem de programação,
Redes de Computadores I Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
RMI Objetos Distribuídos Luiz C. D´oleron SCJP
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Socket em Java.
Laboratório de Programação II Método main Dados e Métodos de Classes.
RMI Java Remote Method Invocation em Java. Introdução Java Remote Method Invocation (Java RMI) permite desenvolver sistemas distribuídos baseados em Java.
Transcrição da apresentação:

Java Media Framework JMF Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

Introdução às comunicações multimídia As comunicações multimídia em tempo real correspondem àquelas onde há a transmissão de mídias numa rede de comunicação, com forte restrição de atraso na recepção de dados Aplicações: Áudio e videoconferências Telemedicina Telefonia IP Rádios Web Ensino à distância Características que devem ser consideradas: Atraso Jitter (variação do atraso) Consumo de banda

JMF API que permite a manipulação de áudio, vídeo e outras mídias em aplicações Java como applications e applets Captura stream de áudio e vídeo e codifica em diversos formatos A transmissão das mídias são realizadas pelo padrão RTP (Real time Transport Protocol) para o desenvolvimento de aplicações que utilizem vídeo sob demanda. Para utilizar os pacotes da JMF é necessário a instalação e configuração da API http://java.sun.com/products/java-media/jmf/ A Versão 2.1.1 da JMF suporta vários padrões de áudio e vídeos

JMF Versão 2.1.1 Suporta vários padrões de áudio Áudio AIFF Sun Audio (extensão au) AVI GSM MIDI MP2 MP3 (apenas em plataformas Windows) QT (extensão mov) RMF WAV Suporta vários padrões de vídeos MPEG-1 QT H.261 H.263

Ferramentas do JMF JMStudio Realiza testes com as mídias suportadas pela API

Ferramentas do JMF JMF Registry Dispositivos de áudio e vídeo só ficam disponíveis para a JMF se estiverem devidamente registrados neste software http://jffmpeg.sourceforge.net/download.html

Exemplo 1: Lê um arquivo de áudio e reproduz o conteúdo // pacotes da API JMF import javax.media.*; import java.io.*; import javax.swing.*; public class TocarAudio { Player audioPlayer = null; public TocarAudio (File arquivo){ try { audioPlayer = Manager.createRealizedPlayer(arquivo.toURI().toURL()); } catch (Exception exc) { System.err.println (exc.toString()); static public void main (String args[]) { String entrada = JOptionPane.showInputDialog(null, "Digite o nome do arquivo."); File arquivo = new File(entrada); TocarAudio tocar = new TocarAudio(arquivo); tocar.play(); public void play() { audioPlayer.start(); public void stop() { audioPlayer.stop(); audioPlayer.close();

Exemplo 2: Player que reproduz um arquivo de vídeo // pacotes da API JMF import java.awt.*; import java.io.*; import java.net.*; import javax.media.*; import javax.swing.*; public class TocarVideo extends JFrame { Container conteudo; public TocarVideo(URL localizacao) { super ("Player de Vídeo"); conteudo = getContentPane(); try { Player player = Manager.createRealizedPlayer(localizacao); // retorna um objeto Component referente à área onde o vídeo será reproduzido Component video = player.getVisualComponent(); // retorna uma objeto Component relacionado aos controles da reprodução de vídeo Component controles = player.getControlPanelComponent(); if (video != null) conteudo.add (video, BorderLayout.CENTER ); if (controles != null)conteudo.add (controles, BorderLayout.SOUTH ); player.start(); setSize (350, 350); setVisible(true); } catch (Exception exc) {System.err.println(exc.getMessage()); }

Exemplo 2: Player que reproduz um arquivo de vídeo public static void main (String media[]) { JFileChooser chooser = new JFileChooser(); int retorno = chooser.showOpenDialog (null); URL url = null; try // cria uma janela que exibe a estrutura de diretório loca para escolha de arquivo if (retorno == JFileChooser.APPROVE_OPTION) url = chooser.getSelectedFile().toURI().toURL(); if (url != null) new TocarVideo(url); else System.out.println ("Programa encerrado."); } catch (Exception exc) System.out.println ("Arquivo não pôde ser aberto ou é inválido.");

JMF em Tempo Real Para transmitir áudio e vídeo tem tempo real utilizando a API JMF três etapas precisam ser seguidas Captura de mídia (Classe DataSource) Representa uma fonte de mídia, que pode ser um arquivo ou um periférico especializado, como um microfone ou uma cãmera A classe MediaLocator pode ser utilizada para indicar a localização de um arquivo Processamento A fonte de dados disponibilizada por um objeto DataSource deve ser processada por um objeto da classe Processor que define os formatos de codificação das mídias e encapsulamento RTP. A saída do processamento (objeto DataSource) representa a mídia já codificada e pronta para ser transmitida Envio dos pacotes (transmissão) Classe DataSink: o método estático createDataSink da classe Manager retorna um objeto DataSink, e a ele são associados um objeto DataSource e um endereço para onde os pacotes RTP devem ser enviados

Exemplo 3: Envia pacotes de áudio em tempo real // pacotes da API JMF import javax.media.*; import javax.media.control.*; import javax.media.format.*; import javax.media.protocol.*; public class EmissorRTPAudioArquivo { public static void main(String[] args){ try { // informa o arquivo de áudio que será fontes para pacotes RTP String arquivo = "file:audio.mp3"; MediaLocator localizacao = null; DataSource dataSource = null; Processor processor = null; // cria um objeto MediaLocator que representa o aquivo audio.mp3 localizacao = new MediaLocator (arquivo); // cria um objeto DataSource referente ao arquivo dataSource = Manager.createDataSource(localizacao); // cria um objeto Processor processor = Manager.createProcessor(dataSource); // é iniciada a configuração do objeto Processor processor.configure(); while (processor.getState() != Processor.Configured){ Thread.sleep(100);}

Exemplo 3: Envia pacotes de áudio em tempo real // estabelece o tipo do conteúdo processado (Quatro constantes da classe ContentDescriptor estão disponíveis: (RAW, RAW_RTP – estão relacionados á forma de utilização de buffers), (MIXED – corresponde às mídias “misturadas”, de mais de um DataSource), CONTENT_UNKNOWN – refere-se a conteúdo desconhecido) processor.setContentDescriptor(new ContentDescriptor (ContentDescriptor.RAW)); // Retorna um array do tipo TrackControl, que tem a indicação de mídias(trilhas) presente na fonte TrackControl track[] = processor.getTrackControls(); // estabelece que a mídia do arquivo será codificada em MPEG_RTP track[0].setFormat(new AudioFormat(AudioFormat.MPEG_RTP)); processor.realize(); while (processor.getState() != Processor.Realized) { Thread.sleep(100); } // dados já processados DataSource sourceFinal = processor.getDataOutput(); // endereço e porta para onde o fluxo de áudio será enviado String url = "rtp://200.145.185.187:5530/audio"; MediaLocator destino = new MediaLocator(url); // DataSink é utilizado para transmitir o áudio já processado e configurado DataSink sink = Manager.createDataSink(sourceFinal, destino);

Exemplo 3: Envia pacotes de áudio em tempo real // Inicia a transmissão sink.open(); sink.start(); processor.start(); } catch (Exception exc) { System.err.println (exc.toString()); System.exit(1); A classe DataSink oferece uma forma simples de enviar pacotes RTP para um destino, unicast ou multicast. Apenas uma mídia da fonte é enviada a partir desse objeto.

Exemplo 4: Recebe o fluxo RTP enviado // pacotes da API JMF import javax.media.Manager; import javax.media.MediaLocator; import javax.media.Player; public class ReceptorRTPAudioArquivo { public static void main(String[] args) { try { // endereço RTP para onde os pacotes foram enviados String url= "rtp://200.145.185.187:5530/audio"; MediaLocator localizacao = new MediaLocator(url); // cria um objeto Player recebendo como parâmetro um objeto MediaLocator Player player = Manager.createPlayer(localizacao); player.realize(); while (player.getState() != Player.Realized){ Thread.sleep(50); } // é iniciada a reprodução do áudio recebido player.start(); } catch (Exception exc) { System.err.println(exc.toString()); System.exit(1); System.out.println("saiu receptor"); }}

Exemplo 5: Emissor de pacotes RTP com multicast // pacotes da API JMF import java.util.Vector; import javax.media.*; import javax.media.control.*; import javax.media.format.*; import javax.media.protocol.*; public class EmissorRTPAudioMulticast { public static void main(String[] args) { try { // objeto AudioFormat é criado (fonte de áudio, amostragem de voz utilizando PCM – frequencia de 8000hz com 8 bits por amostragem) AudioFormat format = new AudioFormat(AudioFormat.LINEAR, 8000, 8, 1); // retorna um vetor contendo os dispositivos que utilizam dados seguindo a formatação passada Vector dispositivos = CaptureDeviceManager.getDeviceList(format); CaptureDeviceInfo info = null; if (dispositivos.size() > 0) // conversão explicita entre o tipo do elemento (único) e a classe CaptureDeviceInfo info = (CaptureDeviceInfo)dispositivos.elementAt (0); Processor processor = null; processor = Manager.createProcessor(info.getLocator()); processor.configure(); while (processor.getState() != Processor.Configured) { Thread.sleep(100);}

Exemplo 5: Emissor de pacotes RTP com multicast TrackControl track[] = processor.getTrackControls(); track[0].setFormat( new AudioFormat(AudioFormat.GSM_RTP, 8000, 8,1)); processor.realize(); while (processor.getState() != Processor.Realized) { Thread.sleep(100); } DataSource sourceFinal = processor.getDataOutput(); // especificação de um endereço multicast na string url String url = "rtp://224.147.85.1:55885/audio"; MediaLocator destino = new MediaLocator(url); DataSink sink = Manager.createDataSink(sourceFinal, destino); sink.open(); sink.start(); processor.start(); catch (Exception exc) System.err.println (exc.toString()); System.exit(1);