Java Media Framework - Einführung

Aus Byte-Welt Wiki
Wechseln zu: Navigation, Suche

Das Java Media Framework (JMF) ist eine Java-API von Sun, die Klassen zum Abspielen, Aufnehmen und Streamen verschiedener Audio- und Video-Formate beinhaltet.

Abspielen von Musik und Videos über das Java Media Framework

Generell:

  1. Ein Objekt vom Typ Player über die Manager-factory-Klasse erstellen.

Manager.createPlayer (url);

  1. Player über start() starten.
  2. Stoppen des Players: stop()
  3. Beim Beenden deallocate() und close() aufrufen.
  4. Anzeigen des VisualComponents: Die Methode Player#getVisualComponent darf erst aufgerufen werden, wenn der Player realized ist, deshalb muss man ein RealizeCompleteEvent abwarten.
  5. Anzeigen des ControlPanels: Wie beim VisualComponent, die Methode heißt hier Player#getControlPanelComponent, auch hier besteht die Gefahr, dass ein NotRealizedError geworfen wird.
  6. Abwarten des Endes: Der Player sendet am Ende ein StopEvent. Achtung: Das ControlPanelComponent sendet, wenn man dort einen Button o.ä. drückt, ein StopByRequestEvent, das aus StopEvent abgeleitet ist!

Beispielklasse

import javax.media.*;
import java.awt.*;
import java.io.*;
 
/**
 * @author Illuvatar
 */
public class Media 
{
	private static void checkJmf() throws ClassNotFoundException
	{
		try{
			Class c = Class.forName("javax.media.Manager");
		}catch (ClassNotFoundException e){
			ClassNotFoundException cnfe = new ClassNotFoundException ("JMF nicht installiert!", e);
			throw cnfe;
		}
	}
	private Media (Component visual, Component controlPanel, Player player)
	{
		v = visual;
		cp = controlPanel;
		p = player;
	}
	private Component v;
	private Component cp;
	private Player p;
	/**
     *@return Das visualComponent des Players, sofern vorhanden, ansonsten null
     *@see Player#getVisualComponent
     */
	public Component getVisualComponent()
	{
		return v;
	}
	/**
     *@return Das controlPanelComponent des Players
     *@see Player#getControlPanelComponent
     */
	public Component getControlPanelComponent()
	{
		return cp;
	}
	/**
     *@return Der Player
     *@see javax.media.Player
     */
	public Player getPlayer()
	{
		return p;
	}
	/**
     *Spielt mit dem JMF die Musik in der Datei f ab.
     *@return Ein Media-Objekt, dass das ControlPanelComponent und den Player kapselt
     *@exception IOException Wenn die Datei nicht existiert
     *@exception ClassNotFoundException Wenn kein JMF installiert ist
     *@exception NoPlayerException Wenn kein Player zu der Datei gefunden wird.
     */
	public static Media playMusic (File f) throws IOException, ClassNotFoundException, NoPlayerException
	{
		checkJmf();
		final Player player = Manager.createPlayer (f.toURL());
		final Object LOCK = new Object();
		player.addControllerListener (new ControllerListener(){
			public synchronized void controllerUpdate(ControllerEvent event) { 
				if (event instanceof RealizeCompleteEvent) { 
					synchronized (LOCK){
						LOCK.notifyAll();
					}
				} 
			} 
		});
		synchronized (LOCK){
			player.start();
			try{
				LOCK.wait();
			}catch (InterruptedException ie){
				Thread.currentThread().interrupt();
			}
		}
		return new Media (null, player.getControlPanelComponent(), player);
	}
	/**
     *Spielt mit dem JMF das Video in der Datei f ab.
     *@return Ein Media-Objekt, dass das ControlPanelComponent, das VisualComponent und den Player kapselt
     *@exception IOException Wenn die Datei nicht existiert
     *@exception ClassNotFoundException Wenn kein JMF installiert ist
     *@exception NoPlayerException Wenn kein Player zu der Datei gefunden wird.
     */
	public static Media playVideo (File f) throws IOException, ClassNotFoundException, NoPlayerException
	{
		checkJmf();
		final Player player = Manager.createPlayer (f.toURL());
		final Object LOCK = new Object();
		player.addControllerListener (new ControllerListener(){
			public synchronized void controllerUpdate(ControllerEvent event) { 
				if (event instanceof RealizeCompleteEvent) { 
					synchronized (LOCK){
						LOCK.notifyAll();
					}
				} 
			} 
		});
		synchronized (LOCK){
			player.start();
			try{
				LOCK.wait();
			}catch (InterruptedException ie){
				Thread.currentThread().interrupt();
			}
		}
		return new Media (player.getVisualComponent(), player.getControlPanelComponent(), player);
	}
	/**
     *Blockiert bis zu einem StopEvent des Players, das kein Restarting- oder StopByRequestEvent ist.
     *@see javax.media.StopEvent
     */
	public static void waitFor (Player player)
	{
		final Object LOCK = new Object();
		player.addControllerListener (new ControllerListener(){
			public synchronized void controllerUpdate(ControllerEvent event) { 
				if (event instanceof javax.media.StopEvent && !(event instanceof RestartingEvent) && !(event instanceof StopByRequestEvent)) { 
					synchronized (LOCK){
						LOCK.notifyAll();
					}
				} 
			} 
		});
		synchronized (LOCK){
			try{
				LOCK.wait();
			}catch (InterruptedException ie){
				Thread.currentThread().interrupt();
			}
		}
	}
}