Java Media Framework - Einführung
Aus Byte-Welt Wiki
Version vom 9. März 2018, 15:15 Uhr von L-ectron-X (Diskussion | Beiträge)
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:
- Ein Objekt vom Typ Player über die Manager-factory-Klasse erstellen.
Manager.createPlayer (url);
- Player über start() starten.
- Stoppen des Players: stop()
- Beim Beenden deallocate() und close() aufrufen.
- Anzeigen des VisualComponents: Die Methode Player#getVisualComponent darf erst aufgerufen werden, wenn der Player realized ist, deshalb muss man ein RealizeCompleteEvent abwarten.
- Anzeigen des ControlPanels: Wie beim VisualComponent, die Methode heißt hier Player#getControlPanelComponent, auch hier besteht die Gefahr, dass ein NotRealizedError geworfen wird.
- 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();
}
}
}
}