Java Media Framework - Einführung

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen

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

<code=java>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(); } } } }</code=java>