jueves, 13 de septiembre de 2012

Multimedia

Java permite trabajo con multimedia mediante APIs especializadas. Un API bastante conocido es JMF (Java Media Framework), el cual se debe descargar e instalar. Una vez instalado, se agrega al JDK(Java Development Kit) y JRE (Java Runtime Enviroment).

El API JMF, agrega el paquete javax.media, el cual contiene clases como Player, CaptureDeviceInfo, MediaLocator, entre otras.

JMF proporciona una arquitectura unificada y un protocolo de mensajes para gestionar la adquisición, procesamiento y entrega de datos multimedia. Soporta la mayoría de las representaciones multimedia como WAV, MPEG, AU, AVI, etc. Las aplicaciones JMF pueden presentar, capturar, manipular y almacenar información multimedia.

Los datos multimedia pueden obtenerse de diferentes fuentes como archivos locales o de red, cámaras, micrófonos, etc.

El audio y el vídeo se presentan a través de dispositivos de salida como altavoces y monitores. Los flujos multimedia pueden ser enviados a otros destinos, almacenarlos en archivos o transmitirlo a través de la red.

CAPTURA DE VIDEO

Una de las aplicaciones más frecuentes, es la captura de video a través de este API. Para ello se debe implementar el siguiente código.

String Webcam = "vfw:Microsoft WDM Image Capture (Win32):0";
CaptureDeviceInfo device = CaptureDeviceManager.getDevice(Webcam);
MediaLocator mediaLocator = this.device.getLocator();
Player player = Manager.createRealizedPlayer(mediaLocator);
player.start();
Component component = this.player.getVisualComponent();
JPanel PVideo = new JPanel();
PVideo.add(component);

Con el código anterior, se configura un dispositivo equivalente a la WebCam instalada en el equipo a través del objeto device. El objeto mediaLocator permite la creación de un objeto player que es el encargado de iniciar la cámara web para presentar la imagen a través de un JPanel.

La siguiente implementación permite colocar un panel con video en un frame, con base en clases independientes para la presentación y la captura de video.

Clase FVideo
package Presentacion;

import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;
import Logica.Video;

public class FVideo extends javax.swing.JFrame {
 private JPanel PVideo;
 private final Video video=new Video();

 public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    FVideo inst = new FVideo();
    inst.setLocationRelativeTo(null);
    inst.setVisible(true);
   }
  });
 }
 
 public FVideo() {
  super();
  initGUI();
  this.iniciarCaptura();
 }
 
 private void initGUI() {
  try {
   setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
   this.setTitle("Captura de Video");
   {
    PVideo = new JPanel();
    BorderLayout PVideoLayout = new BorderLayout();
    PVideo.setLayout(PVideoLayout);
    getContentPane().add(PVideo, BorderLayout.CENTER);
   }
   pack();
   setSize(400, 300);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 
 private void iniciarCaptura(){
  this.video.capturar();
  this.PVideo.add(this.video.getComponent());    
 }
}
Clase Video
package Logica;

import java.awt.Component;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;

public class Video {
 private Player player = null;
 private CaptureDeviceInfo device = null;
 private MediaLocator mediaLocator = null;
 private Component component=null; 
 
 public Component getComponent() {
  return component;
 }

 public void capturar(){
  String Webcam = "vfw:Microsoft WDM Image Capture (Win32):0";
  this.device = CaptureDeviceManager.getDevice(Webcam);
  this.mediaLocator = this.device.getLocator();
  try  {
   this.player = Manager.createRealizedPlayer(this.mediaLocator);
   this.player.start();
   this.component = this.player.getVisualComponent();
  } catch (Exception e)  {
   e.printStackTrace();
  }
 }

 public void detener(){
  try  {
   this.player.close();
  } catch (Exception e)  {
   e.printStackTrace();
  }
 } 
}
CAPTURA DE AUDIO

Otra aplicación frecuente, es la captura de audio a través de este API. Para ello se debe implementar el siguiente código.

AudioFormat audioFormat = new AudioFormat(AudioFormat.LINEAR);
Vector dispositivos = CaptureDeviceManager.getDeviceList(audioFormat);
CaptureDeviceInfo device = (CaptureDeviceInfo)dispositivos.firstElement();
MediaLocator mediaLocator = device.getLocator();
Player player = Manager.createPlayer(mediaLocator);
player.realize();
player.start();

El código anterior, permite crear un formato de audio lineal con el cual se pueden capturar los dispositivos de audio del equipo. Con base en este conjunto de dispositivos, se selecciona el primero y con él se crea un MediaLocator el cual permite la creación de un Player. El método start del player, inicia la captura de audio que se reproducirá a través de los parlantes del equipo.

package Logica;

import java.util.Vector;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.format.AudioFormat;
import javax.media.Manager;

public class Audio {
 private Vector dispositivos;
 private CaptureDeviceInfo device = null;
 private AudioFormat audioFormat=null;
 private Player player = null;
 private MediaLocator mediaLocator = null;

 public Audio(){
  this.audioFormat = new AudioFormat(AudioFormat.LINEAR);
  this.dispositivos = CaptureDeviceManager.getDeviceList(this.audioFormat);
  if(this.dispositivos.size()>0){
   this.device=(CaptureDeviceInfo)this.dispositivos.firstElement();
   this.mediaLocator = this.device.getLocator();
   try{
    this.player = Manager.createPlayer(this.mediaLocator);
    this.player.realize();
    this.player.start();
   }
   catch ( Exception e ) {
    e.printStackTrace();
   }          
  }         
 }
 
 public static void main(String[] args) {
  Audio audio = new Audio();  
 }
}

No hay comentarios:

Publicar un comentario