Código fuente de inversión de Suplay
Java Media Architecture (JMF) es una interesante API de propósito general que permite a los desarrolladores de Java manejar medios de muchas maneras diferentes. Esta guía proporciona una descripción general de algunas de las características principales de JMF, principalmente a través de ejemplos prácticos. Después de leer esta guía, comprenderá las principales funciones de reproducción de la arquitectura JMF. También puede utilizar ejemplos y código fuente existentes para utilizar JMF correctamente, que se puede ampliar para obtener una funcionalidad más especializada.
Esta guía cubre los siguientes temas:
Descarga e instalación de JMF
Las principales clases JMF en la arquitectura JMF y sus aplicaciones
Reproducir Archivos multimedia locales
Produzca una interfaz gráfica de usuario (GUI) para el acceso y manipulación de medios
* Distribuya medios a través de Internet.
Recepción de medios a través de la red
Casi todos los tipos de medios se pueden manipular y procesar a través de JMF. Una discusión exhaustiva de todas las características proporcionadas por JMF está más allá del alcance de esta guía. Usaremos tres aplicaciones multimedia simples para aprender los componentes básicos de este marco. De esta manera, esta guía lo preparará para aprender e implementar más aplicaciones especiales en el futuro.
¿Debo utilizar esta guía?
Esta guía le explicará los conceptos básicos del uso de JMF. Para ello, crearemos tres ejemplos que funcionan de forma independiente. Cada ejemplo se basa en el ejemplo anterior y muestra un aspecto diferente de la funcionalidad JMF.
Los ejemplos de esta guía asumen que ya utiliza y está familiarizado con el lenguaje de programación Java. Además del kernel de Java y las clases JMF, usaremos algunas clases Java AWT y Swing (para crear GUI) y algunas clases de red Java (para transmitir medios a través de la red). La familiaridad con la GUI y las clases de networking le ayudarán a comprender las ideas y los ejemplos aquí más rápidamente, pero no es necesario leer esta guía.
El proceso de muestra que estudiaremos es el siguiente.
Un reproductor de audio simple (aplicación HelloWorld de JMF): un reproductor con esta interfaz de caracteres puede reproducir la mayoría de los tipos de audio simplemente ingresando el nombre del archivo multimedia en la línea de comando. Esta demostración del reproductor de audio muestra la clase única de JMF.
Un reproductor multimedia con interfaz gráfica: Usaremos los componentes de interfaz integrados de JMF para construir una interfaz gráfica, por lo que en este ejercicio debemos tener cierta experiencia en programación de interfaces gráficas. Esta demostración del visor de medios utiliza algunas clases Java AWT y Swing para mostrar componentes gráficos al usuario.
Aplicación de transmisión de medios: esta aplicación permite transmitir archivos multimedia locales a través de la red. El programa tiene la flexibilidad de transmitir medios sólo a nodos de red específicos o a todos los nodos de una subred. Esta demostración utiliza algunas API de red de Java para transferir medios a través de la red.
Como parte del tercer ejercicio, modificaremos la interfaz gráfica del reproductor para que pueda recibir y reproducir medios.
Vaya a la página 23 para obtener una lista de recursos, artículos, guías y otras referencias que le ayudarán a comprender los temas tratados en esta guía.
Requisitos de instalación
Para ejecutar los programas de muestra de esta guía, necesita las siguientes herramientas y componentes:
Plataforma Java 2, edición estándar, compilar y ejecutar el programa de demostración.
Java Media Framework, versión 2.1.1a o superior.
Se ha instalado y configurado una tarjeta de sonido adecuada.
Una o más máquinas de prueba
El archivo de código fuente de demostración está en mediaplayer.jar
La última aplicación de demostración muestra el uso de JMF en la aplicación de red. Si lo desea, esta demostración se puede ejecutar en una máquina separada que actúe como remitente y receptor. Sin embargo, para observar todas las funciones de JMF en la red, necesita al menos dos máquinas en red.
Referencias en la página 23 para descargar la plataforma Java 2, archivos de código fuente completos y otras herramientas necesarias para completar esta guía.
Descargar el archivo de instalación
El primer paso para instalar JMF en su computadora es descargar el archivo de instalación desde la página de inicio de JMF, que también incluye enlaces al código fuente de JMF y a la documentación API. . Hay un enlace para descargar JMF en Recursos en la página 23.
Actualmente, JMF está disponible en Windows, Solaris, Linux y otras versiones, además de una versión Java pura, que puede ejecutarse en cualquier ordenador con una máquina virtual. Para mejorar el rendimiento, debe descargar la versión adecuada para su sistema operativo. Cualquier código escrito y compilado en una versión JMF de un sistema operativo se puede trasladar fácilmente a otro sistema operativo. Por ejemplo, si descarga la versión Solaris de JMF y compila una clase, las clases se pueden utilizar en Linux sin ningún problema.
Como opción, puedes descargar una versión pura de Java o una versión multiplataforma de JMF. Estas versiones no utilizan bibliotecas específicas del sistema operativo. Si no se dispone de una versión JMF adecuada ni de un sistema operativo adecuado, la versión multiplataforma es una buena opción.
Instalar JMF
Después de descargar el instalador de JMF, haga doble clic en el icono del instalador.
La mayoría de los instaladores tienen la opción de instalar bibliotecas nativas en el directorio del sistema; por ejemplo, los instaladores de la versión de Windows tendrán la opción de "Mover DLLS al directorio de Windows/sistema". Es mejor seleccionar esta opción, ya que garantiza que los archivos de la biblioteca para estos sistemas operativos se instalen correctamente.
Durante el proceso de instalación, también necesitarás seleccionar proyectos para actualizar el classpath y las variables de ruta de tu sistema. Si estas opciones están desactivadas, deberá incluir los archivos jar JMF en el classpath al compilar y ejecutar los programas de ejemplo de esta guía.
Acerca del autor
Eric Olson es ingeniero de software en Retek Inc. Tiene cuatro años de experiencia trabajando en la plataforma Java y tiene experiencia en diferentes tecnologías basadas en Java. incluidos JMF, Jini, Jiro, JSP, servlets y EJB. Eric se graduó en Ciencias de la Computación en la Universidad de St. Thomas en St. Paul, Minnesota. Trabaja en el equipo de proyecto de IBM en San Francisco y es responsable del componente empresarial de WebSphere. Al mismo tiempo, trabajó en Imagination Corp., responsable de aplicaciones de almacenamiento. Ahora está desarrollando soluciones de software basadas en web para la industria minorista. En su tiempo libre, Eric y Paul
Monday trabajan con Stereo Beacon, un reproductor multimedia distribuido punto a punto basado en JMF. Contacto
Eric zpalffy@yahoo.com.
Sección 2. Un reproductor de audio sencillo
Navegar
En esta sección, haremos el primer ejercicio de creación de un reproductor de audio sencillo. Este ejemplo presentará la clase Manager y la interfaz Player, las cuales son partes importantes en la creación de la mayoría de aplicaciones basadas en JMF.
El objetivo funcional de este ejemplo es reproducir archivos de audio locales en la interfaz de personajes. Estudiaremos este código fuente y entenderemos lo que logra cada línea. Después de completar esta parte, tendrá un programa de demostración basado en JMF que puede reproducir una variedad de archivos de audio, incluidos MP3, WAV, AU, etc.
Después de este ejercicio, el código fuente se puede clasificar en el archivo SimpleAudioPlayer.java.
Presentación de las clases necesarias
Hay algunas llamadas en la clase SimpleAudioPlayer y todas las clases necesarias deben introducirse en las primeras líneas:
Importar javax .media.*;
Importar archivo Java .io
Importar URL Java . p>
Importar Java.net.malformedurexception;
El paquete javax.media es uno de los muchos paquetes definidos por JMF. Javax.media es un paquete central que incluye definiciones de clases de administrador e interfaces de reproductor.
En esta sección, estudiamos principalmente la clase Manager y la interfaz Player, y las clases javax.media restantes se colocarán en capítulos posteriores.
Además de las declaraciones javax.media, el fragmento de código anterior también presenta algunas declaraciones para crear entradas de reproductor multimedia.
Interfaz del reproductor
En el siguiente fragmento de código, cree una clase pública SimpleAudioPlayer y defina una variable del reproductor como ejemplo:
clase pública reproductor de audio simple { privado Player audio Player = null;
La palabra reproductor suena familiar porque está basado en nuestro reproductor de audio o vídeo común. De hecho, los ejemplos de esta interfaz son como copias exactas de ellos. Player revela cómo un reproductor multimedia físico, como un sistema de altavoces estéreo o una videograbadora, implica funcionalidad. Por ejemplo, el reproductor multimedia JMF puede iniciar y finalizar transmisiones multimedia. En esta sección, usaremos las funciones de inicio y fin del Reproductor.
Crea un reproductor en el archivo.
Obtener una instancia de reproductor para un archivo multimedia específico es muy sencillo utilizando JMF. La clase de administrador en JMF sirve como fábrica para fabricar muchos tipos de interfaces especiales, incluida la interfaz del reproductor. Por lo tanto, la responsabilidad de la clase Manager es crear una instancia de Player, como se muestra en el siguiente ejemplo:
Public SimpleAudioPlayer(URL url) lanza IOException, NoPlayerException, CannotRealizeException public SimpleAudioPlayer(File file) lanza IOException , NoPlayerException, CannotRealizeException
Si lees el código de esta sección, notarás que la clase Manager contiene métodos adicionales para crear instancias de Player. Veremos algunos de estos, como la creación de instancias de DataSource o MediaLocator, en capítulos posteriores.
Estados del jugador
JMF define una serie de estados diferentes que puede tener una instancia de jugador. Como se muestra a continuación:
Prefetch
Prefetch
Implementación
Implementación
Salida
No implementado
Uso de estos estados
Debido a que el uso de medios suele consumir muchos recursos, muchos de los métodos expuestos por los objetos JMF no son de bloqueo, lo que permite monitorear una serie de eventos. Notificación asincrónica de cambios de estado. Por ejemplo, el jugador debe pasar por estados de captación previa y materialización antes de poder comenzar. Dado que estos cambios de estado tardan algún tiempo en completarse, una aplicación de medios JMF puede asignar un subproceso para inicializar la creación de la instancia del reproductor y luego continuar con otras operaciones. Cuando el reproductor está listo, notifica a la aplicación que su estado ha cambiado.
En un programa sencillo como el nuestro, el tipo de generalidad no importa. Por esta razón, la clase Manager también proporciona algunos métodos útiles para crear un reproductor implementado. Llamar al método createRealizedplayer() bloquea el hilo de llamada hasta que el reproductor alcanza el estado realizado. Para llamar a un método sin bloqueo para crear un reproductor, usamos el método createPlayer() en la clase Manager. Las siguientes líneas de código crean la que necesitamos usar en el programa de muestra.
Reproductor implementado: audio player = manager . createrealizedplayer(URL);
Iniciar y detener el reproductor
Establecer el inicio o la parada de la instancia del Reproductor es como Llame a un método de autenticación simple de Player, como se muestra a continuación:
Public void play() public void stop()
Llame al método play() en la clase SimpleAudioPlayer para implementar la llamada al Método start() de la instancia del reproductor. Después de llamar a este método, se puede escuchar el archivo de sonido del altavoz local.
Asimismo, el método stop() detiene el reproductor y cierra el objeto Player.
Para leer y/o reproducir archivos multimedia locales, es útil cerrar la instancia del reproductor y liberar todos los recursos. Como este es un ejemplo simple, cerrar el reproductor es una forma aceptable de finalizar la sesión. Pero en la práctica, debes tener cuidado de asegurarte de que el reproductor esté apagado antes de retirarlo. Después de cerrar el reproductor, se debe crear una nueva instancia del reproductor (esperando a que cambie su estado) antes de que se puedan reproducir los medios nuevamente.
Cree un reproductor de audio simple
Finalmente, la aplicación de reproducción multimedia debe contener un método main() al que se puede llamar ingresando comandos desde la línea del símbolo del sistema. En este método main(), llamaremos al método para crear SimpleAudioPlayer:
Archivo de audio Archivo = nuevo Archivo(args[0]);
Antes de reproducir el archivo de audio, lo único que debe hacer es llamar al método play() del reproductor de audio creado, como se muestra a continuación:
player(); /p >
Para detener y borrar el reproductor de audio, también debe haber la siguiente llamada en el método main():
player.stop();
Compilar y ejecute SimpleAudioPlayer
Ingrese javac SimpleAudioPlayer.java en el símbolo del sistema para compilar el programa de muestra. El archivo creado SimpleAudioPlayer.class se encuentra en el directorio de trabajo actual.
Luego, escriba el siguiente comando en el símbolo del sistema para ejecutar el programa de muestra:
archivo de audio Java Simple Audio Player
Reemplace con el archivo de audio en el archivo local. archivo de audio de la máquina. Todos los nombres de archivos relativos son relativos al directorio de trabajo actual. Verá información de marca sobre el archivo que se está reproduciendo actualmente. Para detener la reproducción, presione Enter.
Si la compilación falla, asegúrese de que el archivo jar JMF esté incluido correctamente en la variable de entorno CLASSPATH.
Sección 3. Módulo de interfaz de usuario JMF
Reproducir vídeo
En la sección anterior, aprendimos cómo crear una aplicación que reproduzca archivos de audio a través de una interfaz de caracteres. Una de las características más importantes de JMF es que no necesita conocer el formato de los archivos multimedia para configurar el reproductor multimedia; Por ejemplo, en nuestro ejemplo anterior, cuando necesitábamos usar el formato MP3, no necesitábamos pedirle a la aplicación que creara un reproductor especial para archivos MP3.
Como verás en esta sección, lo mismo funciona para los archivos de vídeo. JMF tiene detalles de interfaz para todos los tipos de archivos multimedia.
La mayor diferencia entre trabajar con medios de vídeo y audio es que tenemos que construir una pantalla que pueda reproducir el vídeo. Afortunadamente, JMF puede manejar muchos de estos datos. Como en el ejemplo anterior, crearemos un objeto reproductor y utilizaremos varios componentes visuales para crear un navegador de medios visuales directamente desde el objeto JMF.
En esta sección, estudiaremos dos programas de ejemplo. En esta sección, echamos un vistazo a la segunda aplicación de muestra. Consulte MediaPlayerFrame.java en la distribución del código fuente para los siguientes ejercicios.
Acerca del ejemplo
En esta sección, creamos una aplicación que puede mostrar y ejecutar medios de audio y vídeo locales. Como parte del ejercicio, veremos algunos de los componentes GUI integrados en JMF. La familiaridad con AWT y Swing le ayudará a comprender este ejemplo, pero no es obligatorio. No entraremos en detalles sobre el código fuente a menos que necesitemos involucrar directamente los componentes GUI de JMF. Puede encontrar instrucciones detalladas que no se tratan aquí en los comentarios del código fuente.
Muchos de los conceptos, clases y métodos que utilizamos en este ejemplo son similares a los del primer ejemplo. Las operaciones básicas para construir un jugador son prácticamente las mismas.
La mayor diferencia es que necesitamos profundizar en el objeto del reproductor, especialmente cuando necesitamos obtener información multimedia del reproductor.
¿Cómo empezar?
El ejemplo del reproductor de vídeo está diseñado para ejecutarse desde la línea de comandos como el ejemplo del reproductor de audio, pero este ejemplo debe estar basado en GUI. Como en la sección anterior, primero llamamos a la aplicación con el nombre del archivo multimedia. Luego, la aplicación muestra un formulario que contiene componentes multimedia operables.
En la primera línea de MediaPlayerFrame, definimos esta clase y la ampliamos desde la clase javax.swing.Jframe. Así es como hacer que el reproductor multimedia parezca una forma separada en el escritorio. Cualquier programa cliente que cree este objeto de reproducción multimedia puede mostrarlo llamando al método show() definido en la clase Jframe.
La siguiente es una captura de pantalla de una película MPEG reproducida por MediaPlayerFrame:
Obtención de componentes GUI
La interfaz del reproductor tiene varios métodos para obtener el vídeo seleccionado A referencia al componente. En el marco MediaPlayerFrame, utilizamos los siguientes componentes:
Player.getvisualcomponent() es un componente visual que reproduce todos los medios de vídeo.
Jugadores. getControlPanelcomponent() es un componente visual para manipular la línea de tiempo (incluido el inicio, la parada y la reproducción). También contiene información útil sobre la transmisión de medios.
Jugadores. obtener control de ganancia(). getcontrolcomponent() es un componente visual que se utiliza para operar volúmenes (aumentar). El método getGainControl() devuelve una instancia de GainControl que se puede utilizar para cambiar el nivel de ganancia del programa.
Uso de componentes visuales
Todos los métodos de interfaz anteriores devuelven una instancia de la clase java.awt.Component. Cada instancia se considera un componente visual que se puede cargar en el formulario. Estos componentes están directamente relacionados con el reproductor, por lo que después de que el reproductor reproduzca medios, el procesamiento de todos los elementos visuales en estos componentes cambiará en consecuencia.
Antes de añadir estos componentes al formulario debemos asegurarnos de que no estén vacíos. Dado que no todos los reproductores multimedia incluyen todos los componentes visuales, sólo necesitamos agregar componentes para el tipo de reproductor relevante. Por ejemplo, en términos generales, los reproductores de audio no tienen componentes visuales, por lo que getVisualComponent() devolverá nulo. No desea agregar un componente visual al formulario del reproductor de audio.
Obtén un control especial sobre los medios.
Una instancia de reproductor también puede exponer sus controles a través de los métodos getControl() y getControls(), donde getControls() devuelve un conjunto de objetos de control y getControl() devuelve un control. Se pueden seleccionar diferentes tipos de reproductor como operaciones especiales para exponer el tipo de medio especificado por el conjunto de control o para obtener el mecanismo de transporte de los medios. Si está escribiendo un reproductor que solo admite ciertos tipos de medios, entonces debe confiar en algunos objetos de control disponibles en la instancia del Reproductor.
Debido a que nuestro reproductor es muy abstracto y está diseñado para reproducir una variedad de tipos de medios diferentes, simplemente exponemos todos los objetos de control al usuario. Si encontramos algún conjunto de controles extendido, podemos agregar el control visual correspondiente al panel de etiquetas usando el método getControlComponent(). De esta manera el usuario puede observar todos los componentes del reproductor. El siguiente fragmento de código expone todos los objetos de control al usuario:
control[]controls = player . p >
Para que una aplicación real haga algo útil con una instancia de control (además de mostrar un componente visual), la aplicación necesita conocer el tipo especial del control y asignarlo. Luego, las aplicaciones pueden usar estos controles para controlar los programas multimedia. Por ejemplo, si sabe que los medios que utiliza con frecuencia exponen javax. medios de comunicación.
Para controles de tipo Control.QualityControl, puede usar la interfaz QualityControl y luego cambiar la configuración de las propiedades llamando a varios métodos en la interfaz QualityControl.
Usa localizadores de medios.
La mayor diferencia entre nuestro nuevo reproductor multimedia basado en GUI y nuestro primer reproductor simple es que usamos un objeto MediaLocator en lugar de una URL para crear una instancia del reproductor, como se muestra a continuación:
public void setMediaLocator(localizador de localizador de medios) arroja IOException, NoPlayerException, CannotRealizeException
Discutiremos las razones de este cambio en capítulos posteriores. Actualmente, las descripciones de los objetos MediaLocator y las URL se consideran muy similares en los sitios de recursos de Internet. De hecho, puede crear un MediaLocator a partir de una URL y también puede obtener una URL de un MediaLocator. Nuestro nuevo reproductor multimedia crea un MediaLocator en la URL y lo utiliza para crear un reproductor a partir del archivo.
Compile y ejecute MediaPlayerFrame.
Ingrese javac MediaPlayerFrame.java en el símbolo del sistema para compilar el programa de muestra. Se creará un archivo llamado MediaPlayerFrame.class en el directorio de trabajo.
Escriba lo siguiente en el símbolo del sistema para ejecutar el programa de muestra:
archivo multimedia java MediaPlayerFrame
Necesitará reemplazar los archivos multimedia con los de su máquina local (los archivos de audio o vídeo están bien). Todos los nombres de archivos relativos son relativos al directorio de trabajo actual. Verá una ventana que muestra el conjunto de controles GUI que controlan los archivos multimedia. Para obtener una lista de archivos de audio y vídeo compatibles con JMF, consulte Recursos en la página 23.
Si la compilación inicial falla, asegúrese de que el archivo jar JMF esté incluido en la variable de entorno CLASSPATH actual.
MediaPlayerFrame se está ejecutando.
Antes del festival, viste una captura de pantalla de un reproductor de vídeo reproduciendo un archivo de vídeo MPEG. La siguiente captura de pantalla muestra un reproductor de audio reproduciendo un archivo MP3:
Para obtener más información sobre los ejemplos de este ejercicio, consulte el código fuente completo de MediaPlayerFrame.
Sección 4. Conceptos de JMF
Arquitectura JMF
Has visto lo fácil que es usar JMF para reproducir archivos multimedia locales. Ahora, daremos un paso atrás y veremos cómo crear una aplicación basada en medios tan madura a través de JMF, y cómo crear una aplicación basada en medios tan madura a través de JMF. No tiene sentido comprender la arquitectura JMF de manera integral. Esta sección le brindará una descripción general de cómo combinar componentes JMF avanzados para crear lo que desea.
La estructura de componentes de JMF es muy flexible y sus componentes generalmente se pueden dividir en tres partes:
La entrada describe el medio utilizado como entrada cuando el proceso se detiene.
Un proceso realiza actividades sobre determinadas entradas. Los procesos tienen entradas y salidas claras. Hay una gran cantidad de procedimientos disponibles que se pueden utilizar para un insumo o un lote de insumos. Estos procesos se pueden encadenar, y el resultado de un proceso sirve como entrada para otro proceso. En este estilo, se puede aplicar una gran cantidad de procedimientos a una entrada. (Este período es opcional: los dos ejemplos con los que comenzamos no contenían procesos de datos reales, solo una entrada del archivo y una salida a través del reproductor).
La salida describe algo sobre el destino del medio.
A partir de estas descripciones, puedes imaginar cómo suena la arquitectura del componente JMF detrás de un sistema estéreo o VCR típico. Es fácil imaginar usar JMF como encender su televisor o ajustar el estilo de sonido de su sistema de altavoces estéreo.
Por ejemplo, el simple hecho de grabar un programa de televisión favorito puede basarse en estos componentes:
La entrada es una transmisión de televisión que transmite audio y vídeo en el mismo canal.
Un proceso es un dispositivo de grabación (es decir, una videograbadora o muchos dispositivos digitales) que convierte transmisiones de transmisión de audio y video analógicas o digitales a un formato adecuado para copiar en cinta u otros medios.
La salida es la grabación de pistas formateadas (audio y vídeo) en algún tipo de medio.
Modo de procesamiento de datos JMF
La siguiente figura ilustra el módulo de procesamiento de datos JMF y brinda ejemplos de cada tipo:
Al usar este modo, es muy fácil Es fácil entender nuestros dos ejemplos anteriores: ingresar audio y video desde archivos y enviarlos a la computadora local. En los siguientes capítulos, también analizaremos algunas de las funciones de la red JMF para transmitir y recibir medios de audio.
Ejemplo de modelo de procesamiento
Al contactar con los modos de entrada, procesamiento y salida de JMF, podemos comenzar a imaginar que muchas operaciones basadas en medios se pueden completar a través de JMF. Por ejemplo, convierta un tipo de medio a otro y almacene su resultado en un archivo nuevo. Por ejemplo, queremos convertir archivos de audio en formato WAV a formato MP3 sin dañar los archivos originales. La siguiente figura en el modelo de proceso muestra los pasos que seguimos para iniciar la conversión:
La entrada para este ejemplo es un archivo WAV. La herramienta de conversión de formato multimedia lo procesa y lo genera en un nuevo archivo. Ahora, veamos cada paso de este patrón en la API JMF. Utilizamos patrones de entrada, procesamiento y salida como señales conceptuales.
Entrada JMF
En JMF, la entrada generalmente se describe mediante un objeto MediaLocator. Como se mencionó anteriormente,
MediaLocator se ve y se comporta de manera muy similar a una URL, por lo que identifica de forma única un recurso en la web. De hecho, es completamente posible crear un MediaLocator usando una URL, eso es lo que hicimos en los dos primeros ejemplos.
Para nuestro ejemplo de conversión de medios, necesitamos crear un MediaLocator para describir el archivo WAV original. Como veremos en capítulos posteriores, los localizadores de medios también se pueden utilizar para describir flujos de medios en la red. En este caso, MediaLocator describirá la URL propagada, de forma muy parecida al recurso en la web especificado por la URL, que se utiliza para crear MediaLocator, en lugar de especificar el archivo en el sistema de archivos local.
La diferencia entre localizadores de medios y URL
Para crear correctamente un objeto URL, es necesario instalar el java.net.URLStreamHandler apropiado en el sistema. El propósito de este procesamiento de transmisión es poder manejar los tipos de transmisión descritos por las URL. Los objetos MediaLocator no necesitan esto. Por ejemplo, nuestra próxima aplicación utilizará el Protocolo de transporte en tiempo real (RTP) para transmitir audio a través de la red. Dado que la mayoría de los sistemas no tienen un URLStreamHandler instalado para el protocolo RTP, la creación del objeto URL fallará. En esta aplicación, sólo los objetos MediaLocator tendrán éxito.
Para obtener más información sobre el objeto URL y la creación y registro de un URLStreamHandler, consulte la documentación de ayuda de JDK (consulte Recursos en la página 23).
Procesador JMF
Cuando usamos JMF, el componente del procesador de la aplicación se describe mediante una instancia de la interfaz del procesador. Debe familiarizarse con el procesador, que se extiende hasta la interfaz del reproductor. Dado que el procesador hereda la interfaz directa del reproductor, también hereda todas las propiedades disponibles del reproductor. Además, se han agregado dos propiedades al procesador: configurado y configurado. Estas propiedades de extensión (y sus métodos asociados) se utilizan para la comunicación cuando el procesador recopila información del flujo de entrada.
En nuestro programa de ejemplo final, construiremos un procesador para convertir audio codificado en MP3 a un formato adecuado para la transmisión en red. En una sección posterior, analizaremos los pasos para crear un procesador simple.
Salida JMF
Hay varias formas de describir el estado de salida del modo de procesamiento JMF. La más simple (que usaremos en el último ejemplo) es la interfaz javax.media.DataSink.
DataSink lee el contenido multimedia y lo transfiere a algún destino. Durante el proceso inicial de conversión de formato de audio en esta sección, DataSink describirá el archivo MP3 (salida). En nuestro ejemplo final, usaremos enlaces de datos para difundir medios de audio a través de la red. Al especificar la fuente de datos (entrada de DataSink) y el localizador de medios (salida del receptor de datos), se completa un receptor de datos en la clase Manager.
Las instancias de DataSource describen los datos de entrada disponibles para los reproductores, procesadores y enlaces de datos. La salida del procesador también se describe como un objeto DataSource.
Es por esto que los procesadores pueden vincularse entre sí y realizar varias operaciones sobre los mismos datos multimedia. Esta es también la razón por la que la salida del procesador se puede utilizar como entrada para un reproductor o DataSink (que puede entregar medios al destino de salida).
El archivo de destino final de DataSink se describe mediante el objeto MediaLocator. Como antes, un MediaLocator describe un recurso de red; aquí es donde se entregará el flujo de medios.
Sección 5. Transmisión y recepción de medios
JMF y protocolo de transporte en tiempo real (RTP)
Muchas funciones compatibles con la red están integradas directamente en JMF, lo que permite a los programas cliente transmitir y recibir medios a través de la red. La red se vuelve muy fácil. Cuando un usuario en la red desea recibir cualquier tipo de transmisión multimedia, no necesita esperar a que todas las transmisiones se descarguen en la máquina antes de ver las transmisiones en tiempo real; Este concepto se introdujo en los medios de streaming. Con la transmisión, los clientes de la red pueden recibir transmisiones de audio desde otras máquinas e incluso obtener una transmisión de video en vivo de lo que está sucediendo.
El Protocolo de Transporte en Tiempo Real (RTP) está definido en IETF RFC 1889. RTP desarrolló tecnología para transmitir datos urgentes a través de la red de manera rápida y confiable. Se utiliza en JMF para proporcionar a los usuarios una forma de transmitir flujos de medios a otros nodos de la red.
En esta sección, estudiaremos el último programa de ejemplo. Aquí aprenderá cómo transferir archivos MP3 almacenados en una máquina a otra máquina en la misma red. Los archivos fuente MP3 reales no se eliminan de la computadora host ni se copian a otras máquinas. De hecho, se convierte a un formato de archivo que puede transmitirse mediante RTP y enviarse a través de la red. Una vez que el cliente ha recibido el archivo fuente (ahora en forma de paquete RTP), puede transferirlo nuevamente, esta vez en un formato que pueda reproducirse en la máquina receptora.
Estudie los siguientes ejercicios viendo el código fuente en el archivo MediaTransmitter.java.
Configuración del modo de procesamiento
Podemos discutir el último ejemplo basándonos en el modo de procesamiento definido en el capítulo anterior. En la máquina de transporte, el patrón de procesamiento se ve así:
De hecho, el código fuente del objeto MediaTransmitter consta de las siguientes tres líneas:
private MediaLocator mediaLocator = nullprivate DataSink dataSink = null procesador privado mediaProcessor = null
Estas tres variables de instancia se pueden asignar directamente al diagrama de modo de procesamiento anterior, como se muestra a continuación:
La variable Mediaprocessor será nuestro procesador; responsable de convertir el archivo de audio. Convertir del modo de archivo MP3 a un formato adecuado para la transmisión a través del protocolo RTP.
La variable Datasink es nuestro bloque de salida.
Cuando creamos un DataSink, necesitamos especificar un MediaLocator, que es el archivo de destino del DataSink.
Cuando ejecutamos medios procesados a través de DataSink, se transferirán a la ubicación que especificamos en MediaLocator.