Вы находитесь на странице: 1из 8

UNIVERSIDAD CARLOS III DE MADRID ESCUELA POLITCNICA SUPERIOR

Ingeniera Tec. Telec.: Sonido e Imagen

Servidores de Informacin Multimedia

Prctica 8:
RTP (Emisin y Recepcin Flujos )

(Java Media Framework)

Fernando Alonso Martn NIA: 100033362 Ana Beln Alonso Martn NIA: 100048581 Junio 2005

PRCTICA 8: RTP (Emisin y Recepcin de Flujos RTP) 1. INTRODUCCIN En esta prctica trataremos de mejorar el reproductor que hicimos en la prctica anterior aadindole la funcionalidad de poder emitir y recibir audio a travs del protocolo RTP (implementado por la JMF de JAVA). Con este protocolo conseguiremos la transmisin de flujos multimedia en tiempo real. Nuestro reproductor, al igual que en prcticas anteriores, ha de ser capaz de parar y reiniciar la reproduccin, as como de pausarla, adelantarla de 5 en 5 segundos y retrasarla en igual medida. Adems ha de tener la opcin de reproduccin lenta, normal y rpida, as como la opcin de silenciar el audio o repetir la ejecucin del archivo a su finalizacin si as lo desea el usuario. En la prctica anterior introducimos la opcin de capturar audio de un micro con la extensin .mp3 y .wav (a eleccin del usuario). En esta prctica incorporamos un men ms a la barra de mens que nos permitir la emisin y recepcin de archivos multimedia a partir de la IP de destino y un puerto inicial (sesiones).. De esta forma nuestro reproductor multimedia ahora tendr 10 clases: MD.java: ser la clase que contenga el mtodo main del programa. MDInterfaz.java: ser la encargada de construir la interfaz del programa y controlar todos los eventos que sobre ella se produzcan (tales como la pulsacin de botones o seleccin de opciones en el men). se encargar de controlar la ejecucin del archivo multimedia as como de diferenciar si ste se trata de un archivo de audio o video (y si es video crear un objeto que lance la ejecucin del visor del video). Adems implementar el escuchador de la clase Player y por lo tanto se encargar de tratar los eventos que ste produzca. cumplir con funciones de interfaz relativas a mostrar la duracin del archivo que se est reproduciendo as como de mostrar el instante por el va la ejecucin del archivo.
ReproductorVideo: ser la encargada de mostrar en una ventana aparte (un nuevo Frame) el visor del video cuando el archivo que estemos reproduciendo sea un video. MDReloj: MDReproductor.java:

esta clase es la que nos proporcionar los medios (el cdigo) para capturar audio a travs de un micrfono (es la novedad respecto a la prctica anterior).
Emisor: se encargar de emitir flujos multimedia indicndole la direccin del fichero a enviar, la direccin IP de destino y el puerto inicial (para cada flujo RTP que cree el programa este asignar un nuevo puerto incrementando el valor del puerto inicial de 2 en 2). Por ejemplo, habra que indicarle:

MyAudioRecorder:

Direccin fichero: C:/temp/video.mpg Direccin IP de destino: 224.112.112.112 Puerto inicial: 22222

esta clase, a partir de los datos de las sesiones RTP que vayamos a establecer (direccin IP y puertos donde se establecern las sesiones), ha de ser capaz de, en caso de que se reciban datos, crear un objeto de la clase PlayerWindow que visualizar los mismos, y en caso de que no se mantendr en espera hasta que le lleguen los datos. Un ejemplo de los datos que habra que introducir para ms de una sesin (ms de un flujo de datos) sera: Sesin 1 (por ejemplo para video): 224.112.112.112/22222 Sesin 2 (por ejemplo para audio): 224.112.112.112/22224 esta clase establecer los parmetros de una sesin (necesaria para la recepcin de flujos multimedia).
PlayerWindow: la funcin de PlayerWindow ser la de lanzar un nuevo frame en el que se visualizar el video si se est produciendo una transmisin de un video mediante RTP. (Se visualizar el video que vamos transmitiendo). SessionLabel:

Receptor:

2. ASPECTO DE NUESTRO REPRODUCTOR MULTIMEDIA En cuanto al aspecto del reproductor, este no ha variado mucho con respecto a prcticas anteriores, tan solo hemos introducido un men ms en la barra de mens. El nombre de este men es RTP y tiene dos opciones: emitir y recibir (para emitir flujos de datos multimedia o recibirlos mediante el protocolo RTP).

Pasos a seguir para emitir un archivo multimedia: Pulsa en la opcin Emitir del menu RTP

Selecciona el archivo que deseas enviar

Introduce la direccion IP de destino como aparece en el ejemplo

Introduce el puerto inicial

Finalmente ya tenemos la sesin RTP para el emisor establecida

Pasos a seguir para recibir un archivo multimedia: Pulsa en la opcin Recibir del menu RTP

Selecciona la sesin (direccin IP del receptor y puerto por el que deseas recibir el archivo). En nuestro programa introduciremos dos sesiones puesto que que solamente lo hemos implementado para transmitir audio y este tiene dos tracks, uno para el flujo del video y otro para el del audio.

Finalmente, cuando empiece la recepcin de datos se visualizar el video con los datos que el receptor est transmitiendo (gracias a la clase PlayerWindow):

3. FUNCIONAMIENTO DEL PROGRAMA: Puesto que hemos realizado esta prctica sobre el cdigo de la anterior, tan solo comentaremos las modificaciones que hemos aadido respecto al cdigo de esa prctica y el que se nos facilit. Nos hemos limitado a aadir parte del cdigo que haba en el mtodo main de las clases Emisor y Receptor en su lugar correspondiente en MDInterfaz. Es decir, el cdigo que haba en el main de esas clases ahora se ejecutar al pulsar la opcin del men RTP Emitir o Recibir respectivamente. Ese cdigo ha sufrido ligeras modificaciones para que, en vez de recibir los datos (sesiones,direccin IP de destino y puerto inicial) pasndoselos por parmetros en la consola, ahora aparecern ventanas para poder seleccionarlos o para introducir dichos datos. A continuacin pasamos a detallar ese cdigo: 3.1. Cdigo al pulsar la opcin RTP Emitir

Como comentbamos anteriormente, este cdigo se limitar a crear un objeto de la clase Emisor y facilitarle los parmetros que han de pasrsele como parmetros al constructor de esa clase. Es decir, este sera el cdigo que se ejecutara si se pulsa la opcin Emitir del men RTP:
}else if (command.equals("Emitir")) { String[] args = new String[3]; // Ejemplo de llamada: // java Emisor file:/C:/media/test.mpg 129.130.131.132 42050

//Comprobamos que no se est grabando nada y si se est grabando //algo lo detenemos if (capturador != null) { capturador.stopRecord(); } //Reinicializamos el valor de la url a null por si se ha creado //antes url = null;

Direccin del archivo: se abrir una ventana que nos permitir seleccionar el archivo que queremos enviar usando el protocolo RTP (para transmisin en tiempo real).
//Abrimos una ventana para seleccionar la ruta del archivo que //queremos emitir => args [0] fd = new FileDialog(MDInterfaz.this, "Elige el fichero a emitir", FileDialog.LOAD); fd.setVisible(true); if (fd.getFile() != null) { args[0] = new String("file:/" + fd.getDirectory() + fd.getFile()); }

Direccin IP de destino: en esta ocasin de abrir un cuadro de dilogo (JOptionPane) que nos solicitar que introduzcamos la direccin IP del destino a donde queramos enviar el flujo de datos.
//Abrimos un frame para introducir el nombre de la direccion IP // de emisin => args [1] args[1] = JOptionPane.showInputDialog( "Introduce la direccion IP de destino","224.112.112.112");

Puerto inicial: como en el caso anterior, se abrir cuadro de dilogo (JOptionPane) que nos solicitar que introduzcamos el valor del puerto inicial (el resto de puertos necesarios para cada flujo se irn incrementado de dos en dos a partir del valor que introduzcamos como puerto inicial).
//Abrimos un frame para introducir el valor del puerto inicial //(los siguientes vendrn incrementados en 2) => args [2] args[2] = JOptionPane.showInputDialog( "Introduce el valor del puerto inicial","22222");

*Finalmente introducimos el cdigo que vena en el main de la clase Emisor pero sustituyendo los parmetros que se pasaban por consola por un array de String cuyos componentes son los arriba mencionados. Esos parmetros son los que nos servirn para crear el objeto de la clase Emisor.
Format fmt = null; //Creamos el objeto de la clase Emisor at = new Emisor(new MediaLocator(args[0]), args[1], args[2], fmt); //Arrancamos la emisin y controlamos posibles errores String result = at.start(); if (result != null) { System.out.println("Error : " + result); System.exit(0); } System.out.println("Se emitira durante 60 segundos..."); try { Thread.currentThread().sleep(60000); } catch (InterruptedException ie) { } at.stop(); System.out.println("...Fin de la emision."); System.exit(0);

3.2. Cdigo al pulsar la opcin RTP

Recibir

Como comentbamos anteriormente, este cdigo se limitar a crear un objeto de la clase Receptor y facilitarle los parmetros que han de pasrsele como parmetros al constructor de esa clase. Es decir, este sera el cdigo que se ejecutara si se pulsa la opcin Emitir del men RTP:
}else if (command.equals("Recibir")) { String[] argv = new String[2]; // Ejemplo de llamada: //java Receptor 224.112.112.112/22222 224.112.112.112/22224

Datos de la sesin: se abrir una ventana (JOptionPane) para poder introducir los datos de cada sesin (en este caso de 2). Estos datos son la direccin IP del receptor seguido por el puerto por donde desea recibir cada flujo de datos
//Abrimos un JOptionPane para introducir los datos de la sesin //=> argv [0] for (int i=0; i<argv.length;i++){ argv[i] = JOptionPane.showInputDialog( "Introduce la sesion: <direccion>/<puerto>", "224.112.112.112/2222"+(2*(i+1))); }

*Finalmente introducimos el cdigo que vena en el main de la clase Receptor pero sustituyendo los parmetros que se pasaban por consola por un array de String cuyos componentes son los arriba mencionados. Esos parmetros son los que nos servirn para crear el objeto de la clase Receptor.
Receptor cliente = new Receptor(argv); if (!cliente.initialize()) { System.out.println("Error al inicializar la sesin."); System.exit( -1); } try { while (!cliente.isDone()) { Thread.sleep(1000); } }catch (Exception e) {} System.out.println("FIN RTPClient");

Вам также может понравиться