JMF-Einführung

Status
Nicht offen für weitere Antworten.

Illuvatar

Top Contributor
Irgendwann habe ich mal das geschrieben, und da ich das jetzt immer öfter raussuchen muss, poste ich es nochmal hier:
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);
2. Player über start() starten.
3. Stoppen des Players: stop()
4. Beim Beenden deallocate()und close() aufrufen.
5. Anzeigen des VisualComponents: Die Methode Player#getVisualComponent darf erst aufgerufen werden, wenn der Player realized ist, deshalb muss man ein RealizeCompleteEvent abwarten.
6. Anzeigen des ControlPanels: Wie beim VisualComponent, die Methode heißt hier Player#getControlPanelComponent, auch hier besteht die Gefahr, dass ein NotRealizedError geworfen wird.
7. 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!

Hier eine Beispielklasse (für Musik und Video):
Java:
package de.illu.util;

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();
            }
        }
    }
}
Edit: hatte den Code schon mehrfach verbessert in der Zwischenzeit, hier die neue Version.
 
Zuletzt bearbeitet von einem Moderator:

thomas.g

Bekanntes Mitglied
Grundsätzlich gibt es JFFMPEG(jffmpeg.sourceforge.net) für .vob und .ogg sowie .mpg Dateien.
Solltest du einen guten Codec für .avi, .mov und .wmv suchen, solltest du Fobs4JMF (fobs.sourceforge.net) verwenden.

Für Windows gibts auch die passenden Codecs.
Es gibt einen Wrapper für die DirectShow Codecs (also .wmv, .wma, .cda, .asf usw ..)

Hier der Link:
DirectShow Java Wrapper: humatic - dsj
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Oben