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