Current Page: Greybox » Authoring » Course ID: medieninformatik » Modules » Module ID: m06 » Learning Units » Unit ID: 3_01
Last Modified:Tuesday, 2015-05-05 - 08:09:01
 
Tools: ValidatePreview XML Preview HTML Preview PDF
Alternative: Printable HTML

 

Learning Unit ID: 3_01
Title: Das Java Media Framework
Abstract: In dieser LU werden die Grundlagen des Java Media Frameworks behandelt. Dazu zählen sowohl die Beschreibung der grundlegenden Architektur, des Datenverarbeitungsmodells, wie auch der wichtigsten Klassen. Außerdem wird in einem Beispiel gezeigt, wie ein einfacher Media Player mit Hilfe von JMF implementiert werden kann.
 
Status:

Review II: done

Version: 8.1
History:

*Codeformatierungen siehe JMF LU1.doc - Done, please check and remove xIgnore. Könntest du bitte schaun, ob an den <applet> tags irgendwas falsch ist... bei mir werden die Applets nicht angezeigt (könnte aber auch an meinem Computer liegen). Neue jar files eingespielt und <param> tag geändert(bt).

Acronyme done.

Rechtschreibfehler done.

Graphik JMF Architektur verkleinert.

Sourcecode formatiert.


Author
Author 1: Bernhard Tatzmann E-Mail: bernhard@isys.uni-klu.ac.at
Author 2: (empty) E-Mail: (empty)
Author 3: (empty) E-Mail: (empty)
Author 4: (empty) E-Mail: (empty)
Author 5: (empty) E-Mail: (empty)
Organization: Universität Klagenfurt - Institut für Informatik-Systeme

Content

Einleitung

1

Auto

Das Java Media Framework (JMF464):

  • bietet die Möglichkeit zeitbasierte Medien (Abb. 1 zeigt eine Taxonomie zeitbasierter Medien) in Java Anwendungen zu integrieren
  • ist als Erweiterung der Java 2 Standard Edition plattformunabhängig
  • Erste Version 1998
  • Seit Version 2.1erhältlich für Windows, Solaris und Linux als Performance Pack (http://java.sun.com/products/java-media/jmf/ )
  • Für nicht unterstützte Betreibsysteme Java Source Code als Cross-platform Version verfügbar ED04

Mittels JMF464 ist es möglich, Audio und Video Dateien in Java Anwendungen einzubinden. Derartige Anwendungen können Mediendateien

  • anzeigen
  • bearbeiten
  • erfassen
  • speichern
  • streamen (Mediendaten die von einem Computer gebroadcastet werden, können von Netzwerk Clients in Echtzeit empfangen werden

Taxonomie zeitbasierter Medien aus ED04 PC

Taxonomie zeitbasierter Medien

Taxonomie zeitbasierter Medien aus ED04 PDA_Phone

Taxonomie zeitbasierter Medien

2

Auto

Das Java Media Framework (JMF464) bietet die Möglichkeit, zeitbasierte Medien (Abb. 1 zeigt eine Taxonomie zeitbasierter Medien) in Java Anwendungen zu integrieren. Als Erweiterung der Java 2 Standard Edition kann die wichtigste Java Eigenschaft, nämlich die Plattformunabhängigkeit, auch für JMF464 gewährleistet werden.

Taxonomie zeitbasierter Medien aus ED04 PC

Taxonomie zeitbasierter Medien

Taxonomie zeitbasierter Medien aus ED04 PDA_Phone

Taxonomie zeitbasierter Medien

Auto

JMF464 wurde ursprünglich von Sun, SGI und Intel entwickelt und erschien in seiner ersten Version 1998. Seit Version 2.1 wird JMF464 für die Betriebsysteme Windows, Solaris und Linux als Performance Pack (http://java.sun.com/products/java-media/jmf/ ) angeboten. Für nicht unterstützte Betreibsysteme wird der Java Source Code als Cross-platform Version zur Verfügung gestellt ED04.

Mittels JMF464 ist es möglich, Audio und Video Dateien in Java Applikationen und Applets einzubinden. Neben dem Anzeigen können derartige Anwendungen Mediendateien

  • bearbeiten
  • erfassen
  • speichern
  • streamen (Mediendaten die von einem Computer ausgesendet werden (broadcast), können von Netzwerk Clients in Echtzeit empfangen werden)

Architektur

1

Auto

  • Architektur von JMF464 (siehe Abb. JMF464-Architektur) gliedert sich in:
    • high-level API43: Schnittstelle, auf die eine Java Anwendung zur Steuerung der obigen Funktionalitäten (Anzeigen, Erfassen, ...) zugreifen kann.
    • low-level API43: Erlaubt es, die vorhandene Funktionalität mittels Integration zusätzlicher Plug-Ins zu erweitern.
  • Schichtweise Struktur ermöglicht es, zukünftige Medientechnologien in die gegeben Struktur einzubetten AG04.

JMF-Architektur AG04 PC

Die JMF Architektur unterteilt sich in ein high-level und ein low-level API

JMF-Architektur AG04 PDA_Phone

Die JMF Architektur unterteilt sich in ein high-level und ein low-level API

 

2

Auto

Die Architektur von JMF464 gliedert sich in ein high-level (das Interface) und ein low-level API43 (siehe Abb. JMF464-Architektur). Das high-level API43 bietet eine Schnittstelle, auf die eine Java Applikation (ein Applet) zur Steuerung der obigen Funktionalitäten wie dem Anzeigen, Erfassen und Bearbeiten von Mediendaten zugreifen kann. Das low-level API43 erlaubt es, die vorhandene Funktionalität mittels Integration zusätzlicher Plug-Ins zu erweitern. Diese schichtweise Struktur ermöglicht es, zukünftige Medientechnologien in die gegeben Struktur einbetten zu können AG04.

JMF-Architektur AG04 PC

Die JMF Architektur unterteilt sich in ein high-level und ein low-level API

JMF-Architektur AG04 PDA_Phone

Die JMF Architektur unterteilt sich in ein high-level und ein low-level API

Allgemeines Datenverarbeitungsmodell

1

Allgemein

Allgemeines Verarbeitungsmodell für zeitbasierte Daten (siehe Abb. Verarbeitungsmodell für zeitbasierte Daten) besteht üblicherweise aus:

  • Eingabe repräsentiert das Medium, das als Eingabe für den Verarbeitungsprozess dient.
    • Bsp.: Audio Stream von einem Mikrofon
  • In der Verarbeitung werden Prozesse auf die Eingangsdaten angewendet werden.
    • Bsp.: Anwendung von Filtern, Multiplexen oder Demultiplexen von Signalen, Dateikonvertierungsprozesse handeln.
    • Prozesse können verkettet werden.
  • Ausgabe repräsentiert das Ziel des Datenverarbeitungsprozesses.
    • Bsp.: Präsentation des Audiosignals über Lautsprecher

Auto PC

Verarbeitungsmodell für zeitbasierte Daten

Auto PDA_Phone

Verarbeitungsmodell für zeitbasierte Daten

 

2

Allgemein

Ein Verarbeitungsmodell für zeitbasierte Daten besteht üblicherweise aus den folgenden drei Einheiten: Eingabe, Verarbeitung und Ausgabe (siehe Abb. Verarbeitungsmodell für zeitbasierte Daten).

Auto PC

Verarbeitungsmodell für zeitbasierte Daten

Auto PDA_Phone

Verarbeitungsmodell für zeitbasierte Daten

Eingabe

Repräsentiert das Medium, das als Eingabe für den Verarbeitungsprozess dient.

Bsp.:
Audio Stream von einem Mikrofon

Verarbeitung

Prozesse sind Operationen, die auf die Eingangsdaten angewendet werden. Hier kann es sich sowohl um die Anwendung von Filtern, um das Multiplexen oder Demultiplexen von Signalen oder auch um Dateikonvertierungsprozesse handeln. Durch das Anwenden eines weiteren Prozesses auf den Ausgang eines vorhergehenden Prozesses ist es möglich, Prozesse zu verketten.

Bsp.:
Anwendung eines Hall-Effektfilters

Ausgabe

Repräsentiert das Ziel des Datenverarbeitungsprozesses.

Bsp.:
Präsentation des Audiosignals über Lautsprecher

Datenverarbeitungsmodell des JMF

1

Auto

Vorstellung der wichtigsten JMF464 Klassen wie DataSource , MediaLocator , Format , Player , Processor , DataSink etc. anhand des obigen Datenverarbeitungsmodell für Mediendaten.

Eingabe

  • Mediendaten werden in DataSource Objekten (siehe Abb. DataSource Klassenhierarchie) gekapselt und übertragen
    • Erlaubt Behandlung der Medien unabhängig von der Lage der Daten und vom verwendeten Protokoll
    • Instantiierung von DataSource Objekten durch MediaLocator Objekt:
      • MediaLocator Objekte können im Gegensatz zu URL Objekten auch instanziiert werden, wenn der entsprechende URLStreamHandler nicht im System installiert ist.
    • Zwei verschiedene Arten von DataSource Klassen:
      • PullDataSource: Datenfluss vom Client initiiert und kontrolliert
        • Bsp.: Im Internet HTTP63.
      • PushDataSource: Datenfluss vom Server bestimmt
        • Bsp.: Video-on-demand Systemen.
        • Verwendetes Protokoll ist RTP106 (Real-time Transport Protocol).
DataSource Klassenhierarchie AG04 PC

DataSource Klassenhierarchie

DataSource Klassenhierarchie AG04 PDA_Phone

DataSource Klassenhierarchie

Datenformate

Durch JMF464 unterstützte Audio-Dateiformate:

  • WAV465
  • MIDI30
  • Sun Audio
  • GSM436

Video Dateiformate:

  • MPEG31 -1
  • Quick Time
  • AVI466

Verarbeitung

Anwenden von Prozessen auf DataSource Objekte (Eingangsdaten bzw. Ausgang eines vorherigen Prozesses) durch Processor Objekte:

  • Processor Interface leitet sich vom Interface Player ab
  • Mittels Processor Objekten Einflussnahme auf den Datenbearbeitungsvorgang (Processing) und Ausgabestrom (Output Stream) möglich.
  • Prozessorphasen:
    • Demultiplexing: Trennen der Eingangsspuren
    • Pre-Processing: Filteranwendung auf die einzelnen Spuren
    • Transcoding: Konvertierung der Datenspuren von einem Datenformat in ein anderes
    • Post-Processing: Bearbeitung der konvertierten Spuren mit Filtern
    • Multiplexing: Zusammenführen der einzelnen Spuren in einen einzigen Ausgabestrom

Zuordnung der einzelnen Verarbeitungsschritte zu jeder Spur mit TrackControl Interface:

  • setCodecChain (Codec codecs)
  • setRenderer (Renderer renderer)
Prozessorphasen AG04 PC

Prozessorphasen

Prozessorphasen AG04 PDA_Phone

Prozessorphasen

Prozessorzustände
Unrealized
Durch Processor.configure() gelangt der Prozessor in den Zustand Configuring.
Configuring
Nachdem Verbindung zur DataSource, Demultiplexing durchgeführt und Eingabeformat bestimmt wird Transitionsevent ConfigureCompleteEvent ausgelöst.
Configured
Processor vollständig konfiguriert.
Realized
Processor vollständig erzeugt.
Prozessor Zustandsdiagramm AG04 PC

Prozessor Zustandsdiagramm

Prozessor Zustandsdiagramm AG04 PDA_Phone

Prozessor Zustandsdiagramm

Ausgabe

Möglichkeiten der Ausgabe:

  • Abspielen der Daten mittels des Player Interface
  • Mit DataSink Interfaces in Datei schreiben
Player
  • Player Interface bietet Methoden zum Darstellen und Steuern von zeitbasierten Medien an
  • Erzeugung durch Manager.createPlayer(...). Mögliche Parameter:
    • DataSource, MediaLocator, URL oder DataSink
  • Player kann hinter einen Processor geschaltet werden

Player Zustände (durchläuft die meisten der Zustände, die auch der Processor durchläuft):

Unrealized
Direkt nach der Instantiierung, wenn Mediendaten noch nicht bekannt.
Realizing
Der Player ermittelt die darzustellenden Daten. Danach wird das Event RealizeCompleteEvent ausgelöst. Player geht in den Realized Zustand über.
Realized
Player stellt die zur Darstellung nötigen Steuerelemente zur Verfügung.
Prefetching
Nach Aufrufen der Methode prefetch() macht sich der Player für die Darstellung der Daten bereit.
Prefetched
Für die Darstellung der Daten bereit.
Started
Aufrufen der Methode start() teilt dem Player mit, mit der Darstellung zu beginnen.
Player - Zustandsdiagramm AG04 PC

Player - Zustandsdiagramm

Player - Zustandsdiagramm AG04 PDA_Phone

Player - Zustandsdiagramm

DataSink

Ausgabe der Mediendaten in eine Datei durch DataSink Objekt möglich:

  • Erzeugung durch Manager.createDataSink(javax.media.protocol.DataSource,javax.media.MediaLocator)
    • DataSource Objekt: Quelle
    • MediaLocator Objekt: Ziel

 

2

Auto

In diesem Abschnitt werden die wichtigsten JMF464 Klassen wie DataSource , MediaLocator , Format , Player , Processor , DataSink etc. anhand des obigen Datenverarbeitungsmodell für Mediendaten vorgestellt. Es wird gezeigt, in welcher Phase welche Klassen zur Anwendung kommen.

Eingabe

In JMF464 werden Mediendaten mit Hilfe von DataSource Objekten (siehe Abb. DataSource Klassenhierarchie) übertragen, welche die Daten kapseln. Dies erlaubt eine Behandlung der Medien unabhängig von der Lage der Daten und vom verwendeten Protokoll. Zur Instantiierung von DataSource Objekten wird ein MediaLocator Objekt benötigt, das die Lage der Eingangsdaten angibt. Während URL Objekte nicht instanziiert werden können, wenn der entsprechende URLStreamHandler nicht im System installiert ist, ist dies bei MediaLocator Objekten sehr wohl möglich. Abgesehen davon entsprechen sie einander prinzipiell JS04.

DataSource Klassenhierarchie AG04 PC

DataSource Klassenhierarchie

DataSource Klassenhierarchie AG04 PDA_Phone

DataSource Klassenhierarchie

Auto

Wie in Abbildung DataSource Klassenhierarchie zu sehen ist gibt es zwei verschiedene Arten von DataSource Klassen: PullDataSource und PushDataSource .

PullDataSource
Beim PullDataSource Verfahren initiiert und kontrolliert der Client den Datenfluss. Wenn der Client z.B. auf eine Datei zugreift, bestimmt er selbst, mit welcher Geschwindigkeit und in welcher Reihenfolge die Daten ausgelesen werden. Ein weiters Pull-Protokoll für den Zugriff auf Daten im Internet wäre HTTP.
PushDataSource
Im Gegensatz zum Pull-Verfahren wird der Datenfluss beim PushDataSource Verfahren vom Server bestimmt. Zur Anwendung kommt dieses Prinzip z.B. bei video-on-demand Systemen. Das verwendete Protokoll ist RTP106 (Real-time Transport Protocol).
Datenformate

JMF464 unterstützt eine Vielzahl von Audio und Video Dateiformaten wie WAV465 (WAVeform sound format), MIDI30 (Music Instrument Digital Interface), Sun Audio , GSM436 (Global System for Mobile communications) bzw. MPEG31 -1 (Motion Pictures Expert Group), Quick Time, AVI466 (Audio Video Interleave) . Eine Auflistung aller zur Verfügung stehender Formate findet sich in der JMF464 Dokoumentation http://java.sun.com/products/java-media/jmf/2.1.1/formats.html.

Verarbeitung

Das Anwenden von Prozessen auf DataSource Objekte (Eingangsdaten bzw. Ausgang eines vorherigen Prozesses) wird in JMF464 mit Hilfe eines Objektes vom Typ Processor bewerkstelligt. Das Processor Interface leitet sich vom Interface Player ab, welches zum Rendern von Mediendaten verwendet wird und im nächsten Abschnitt (Ausgabe) im Detail beschrieben wird.

Mittels Processor Objekten kann der Programmierer sowohl auf den Datenbearbeitungsvorgang (Processing), wie auch auf den Ausgabestrom (Output Stream) Einfluss nehmen. Das Vorgehen des Prozessors gliedert sich in die folgenden Phasen (siehe auch Abb. Prozessorphasen) AG04:

Demultiplexing
Für den Fall, dass die Eingangsdaten aus mehreren parallelen Datenspuren (wie z.B. einer Audio und einer Video Spur) bestehen, werden in dieser Phase die Spuren voneinander getrennt. Dies geschieht ohne Zutun des Programmierers.
Pre-Processing
Im Pre-Processing Schritt können Filter auf die einzelnen Spuren angewendet werden.
Transcoding
In der Transcoding Phase werden die Datenspuren von einem Datenformat in ein anderes konvertiert. Während die Umwandlung eines komprimierten Formats in ein unkomprimiertes Decoding genannt wird, nennt sich der umgekehrte Prozess Encoding.
Post-Processing
Im Post-Processing Schritt werden die konvertierten Spuren mit Filtern bearbeitet.
Multiplexing
Multiplexing führt die einzelnen Spuren wieder in einen einzigen Ausgabestrom zusammen.

Das Zuordnen der einzelnen Verarbeitungsschritte zu jeder Spur geschieht in JMF464 mit Hilfe des TrackControl Interfaces, das folgende Methoden zur Verfügung stellt:

  • setCodecChain (Codec codecs)
  • setRenderer (Renderer renderer)

Somit können jeder Spur bestimmte Bearbeitungskomponenten zugeordnet werden, die den Plug-Ins in Abb. JMF464-Architektur entsprechen.

Prozessorphasen AG04 PC

Prozessorphasen

Prozessorphasen AG04 PDA_Phone

Prozessorphasen

Prozessorzustände

Die folgende Abbildung zeigt das Zustandsdiagramm des Prozessors. Da Processor von Player abgeleitet ist, entspricht es großteils dem Diagramm des Player Interfaces, das im nächsten Abschnitt beschrieben wird. Hier wird nur auf die zusätzlichen Zustände Configuring und Configured eingegangen, die zu Beginn des Kontrollflusses gleich nach dem Zustand Unrealized auftreten. Die weiteren Zustände entsprechen jenen des Players und werden in weiterer Folge im Abschnitt Player beschrieben.

Vom Zustand Unrealized aus gelangt der Prozessor durch den Methodenaufruf Processor.configure() in den Zustand Configuring. Dort verweilt er solange, bis eine Verbindung zur DataSource besteht, das Demultiplexing durchgeführt wurde und das Eingabeformat bestimmt wurde. Danach wird das Transitionsevent ConfigureCompleteEvent ausgelöst und der Prozessor geht in den Zustand Configured über. Wird der Realized Zustand erreicht, so ist der Prozessor vollständig erzeugt.

Prozessor Zustandsdiagramm AG04 PC

Prozessor Zustandsdiagramm

Prozessor Zustandsdiagramm AG04 PDA_Phone

Prozessor Zustandsdiagramm

Ausgabe

Am Ende des Mediendatenverarbeitungsmodells können die Daten entweder mittels des Player Interfaces abgespielt werden oder mit Hilfe des DataSink Interfaces in eine Datei geschrieben werden.

Player

Das Player Interface bietet Methoden zum Darstellen und Steuern von zeitbasierten Medien an. Um einen Player zu erzeugen, wird die Methode createPlayer(...) der Manager Factory verwendet. Als Parameter kann entweder eine DataSource , ein MediaLocator , ein URL oder eine DataSink übergeben werden. Der Typ der Eingangsdaten determiniert die Art der Darstellung.

Da der Player auch auf eine DataSource angewendet werden kann, ist es möglich, den Player hinter einen Processor zu schalten, um so schon bearbeitete Daten darzustellen.

Player Zustände

Wie bereits im Abschnitt Verarbeitung erwähnt wurde, bildet Player die Basis-Klasse von Processor und durchläuft die meisten der Zustände, die auch der Processor durchläuft.

Player - Zustandsdiagramm AG04 PC

Player - Zustandsdiagramm

Player - Zustandsdiagramm AG04 PDA_Phone

Player - Zustandsdiagramm

Auto
Unrealized
In diesem Zustand befindet sich ein Player direkt nach der Instantiierung, wenn ihm die darzustellenden Mediendaten noch nicht bekannt sind.
Realizing
In diesen Zustand gelangt der Player , nachdem die Methode realize() ausgeführt wurde. Der Player ermittelt die darzustellenden Daten. Nachdem diese bekannt sind, wird das Event RealizeCompleteEvent ausgelöst und der Player geht in den Realized Zustand über.
Realized
Da der Player die Typen der Daten nun kennt, ist es ihm möglich, die zur Darstellung nötigen Steuerelemente zur Verfügung zu stellen.
Prefetching
Nach Aufrufen der Methode prefetch() macht sich der Player für die Darstellung der Daten bereit.
Prefetched
Ein Player im Prefetched Zustand ist für die Darstellung der Daten bereit.
Started
Das Aufrufen der Methode start() teilt dem Player mit, mit der Darstellung zu beginnen.
DataSink

Um Mediendaten in eine Datei ausgeben zu können, muss ein DataSink Objekt erzeugt werden. Dies geschieht durch Verwendung der Manager Factory: Manager.createDataSink(javax.media.protocol.DataSource,javax.media.MediaLocator)

Das zu übergebende DataSource Objekt gibt dabei die Quelle der Daten an und das MediaLocator Objekt das Ziel.

Beispiele MediaPlayer

1

MediaPlayer

  • Quell-URL289 des Files als Parameter übergeben
  • Generierung eines Players im Realized Zustand mit Manager Factory
  • Erzeugung des GUI mit Darstellungskomponente und der Steuerungskomponente des Players

Media Player Applet

public void init() {
  try {
    player = Manager.createRealizedPlayer(new URL(
      getParameter("url")));
  }
  catch (Exception e) {
    ;
  }

  setLayout(new BorderLayout());

  add(player.getVisualComponent(), BorderLayout.CENTER);
  add(player.getControlPanelComponent(), BorderLayout.SOUTH);
}

JMF Media Player

Verwendung des Applets

Das Applet bietet die Möglichkeit der Betrachtung einer über die Appletparameter definierten Mediendatei. Zum Betrachten des Applets ist eine lokale Installation des Java Media Frameworks(http://java.sun.com/products/java-media/jmf/2.1.1/download.html) nötig.

Beispiel MediaPlayer mit eigenen Kontrollkomponenten

  • Steuerung mittels eigener GUI Komponenten
  • Zur Steuerung des Players werden zwei JButton Objekte verwendet:
    • Führen start(), stop() und setMediaTime() aus
  • Funktionalität des zweiten Schalters wechselt zwischen Play und Pause (||) bei jedem Klick

Media Player Applet mit eigenen Kontrollkomponenten

public void init() {
  try {
    player = Manager.createRealizedPlayer(new URL(
      getParameter("url")));
  }
  catch (Exception e) {
    ;
  }

  setLayout(new BorderLayout());

  JPanel control_panel = new JPanel();
  add(control_panel, BorderLayout.SOUTH);

  start_button = new JButton(CMD_START);
  stop_button = new JButton(CMD_STOP);

  control_panel.add(start_button);
  start_button.addActionListener(this);
  control_panel.add(stop_button);
  stop_button.addActionListener(this);


  add(player.getVisualComponent(), BorderLayout.CENTER);
}

public void actionPerformed(ActionEvent e)
{
  if(e.getActionCommand() == CMD_START)
  {
    player.start();
    start_button.setText(CMD_PAUSE);
    System.out.println("Player gestartet bei Zeitindex "+player.getMediaTime().getSeconds());
      return;
  }
  if(e.getActionCommand() == CMD_PAUSE)
  {
    player.stop();
    start_button.setText(CMD_START);
    System.out.println("Player unterbrochen bei Zeitindex "+player.getMediaTime().getSeconds());
    return;
  }

  if(e.getActionCommand() == CMD_STOP)
  {
    player.stop();
    //Zurücksetzen des Players an den Anfang
    player.setMediaTime(new Time(0.0));
    start_button.setText(CMD_START);
    System.out.println("Player angehalten bei Zeitindex "+player.getMediaTime().getSeconds());
    return;
  }
}

JMF Media Player mit eigenen Kontrollkomponenten

Verwendung des Applets

Das Applet bietet die Möglichkeit der Betrachtung einer über die Appletparameter definierten Mediendatei. Zum Betrachten des Applets ist eine lokale Installation des Java Media Frameworks(http://java.sun.com/products/java-media/jmf/2.1.1/download.html) nötig.

2

MediaPlayer

Zum Abschluss wird mit einem einfachen Beispiel gezeigt wie mit Hilfe eines Java Applets ein beliebiges Medienfile abgespielt werden kann. Die Quell-URL289 des Files wird dem Applet dabei als Parameter übergeben.

Media Player Applet

import javax.media.*;

import java.awt.*;
import java.applet.*;
import java.net.URL;

public class MyMediaPlayer
 extends Applet {

  private Player player = null;
  
  public void init() {
    try {
      player = Manager.createRealizedPlayer(new URL(
          getParameter("url")));
    }
    catch (Exception e) {
      ;
    }

    setLayout(new BorderLayout());

    add(player.getVisualComponent(), BorderLayout.CENTER);
    add(player.getControlPanelComponent(), BorderLayout.SOUTH);
  }

  public void processEvent(AWTEvent e) {
    if (e.getID() == Event.WINDOW_DESTROY) {
      player.stop();
      System.exit(0);
    }
  }

  public static void main(String args[]) {
    Frame f = new Frame("MyMediaPlayer");
    MyMediaPlayer MyMediaPlayer = new MyMediaPlayer();

    MyMediaPlayer.init();
    MyMediaPlayer.start();

    f.add("Center", MyMediaPlayer);
    f.setSize(400, 300);
    f.show();
  }
}

JMF Media Player

Verwendung des Applets

Das Applet bietet die Möglichkeit der Betrachtung einer über die Appletparameter definierten Mediendatei. Zum Betrachten des Applets ist eine lokale Installation des Java Media Frameworks(http://java.sun.com/products/java-media/jmf/2.1.1/download.html) nötig.

Auto

Zuerst wird mittels Manager Factory, und der übergebenen URL als Parameter, ein Player Objekt generiert. Da der Player bereits im Zustand Realized von der Factory geliefert wird, sind keine weiteren Initialisierungsschritte nötig.

Das graphische Benutzerinterface des Applets wird mit Hilfe der visuellen Darstellungskomponente und der Steuerungskomponente des Players erzeugt. Diese beiden Komponenten lassen sich mit Hilfe der Methoden Player.getVisualComponent() und Player.getControlComponent() erzeugen.

Beispiel Media Player mit eigenen Kontrollkomponenten

Im obigen Beispiel wurden zur Steuerung des Players die JMF464-eigenen Kontrollkomponenten verwendet. Hier soll nun gezeigt werden, wie die Steuerung mittels eigener GUI Komponenten erfolgen kann.

Media Player Applet mit eigenen Kontrollkomponenten

import javax.media.*;

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.applet.*;
import java.net.URL;


public class MyMediaPlayer2
  extends Applet
    implements ActionListener
{

  private Player player = null;
  private JButton start_button;
  private JButton stop_button;

  final static String CMD_START = "Play";
  final static String CMD_PAUSE = "||";
  final static String CMD_STOP = "Stop";


  public void init() {
    try {
      player = Manager.createRealizedPlayer(new URL(
          getParameter("url")));
    }
    catch (Exception e) {
      ;
    }

    setLayout(new BorderLayout());

    JPanel control_panel = new JPanel();
    add(control_panel, BorderLayout.SOUTH);

    start_button = new JButton(CMD_START);
    stop_button = new JButton(CMD_STOP);

    control_panel.add(start_button);
    start_button.addActionListener(this);
    control_panel.add(stop_button);
    stop_button.addActionListener(this);


    add(player.getVisualComponent(), BorderLayout.CENTER);
  }

  public void processEvent(AWTEvent e) {
    if (e.getID() == Event.WINDOW_DESTROY) {
      player.stop();
      System.exit(0);
    }
  }

  public void actionPerformed(ActionEvent e)
  {
    if(e.getActionCommand() == CMD_START)
    {
      player.start();
      start_button.setText(CMD_PAUSE);
      return;
    }
    if(e.getActionCommand() == CMD_PAUSE)
    {
      player.stop();
      start_button.setText(CMD_START);
      return;
    }

    if(e.getActionCommand() == CMD_STOP)
    {
      player.stop();
      //Zurücksetzen des Players an den Anfang
      player.setMediaTime(new Time(0.0));
      start_button.setText(CMD_START);
      return;
    }
  }

  public static void main(String args[]) {
    Frame f = new Frame("MyMediaPlayer");
    MyMediaPlayer2 media_player = new MyMediaPlayer2();

    media_player.init();
    media_player.start();

    f.add("Center", media_player);
    f.setSize(400, 310);
    f.pack();
  }
}

JMF Media Player mit eigenen Kontrollkomponenten

Verwendung des Applets

Das Applet bietet die Möglichkeit der Betrachtung einer über die Appletparameter definierten Mediendatei. Zum Betrachten des Applets ist eine lokale Installation des Java Media Frameworks(http://java.sun.com/products/java-media/jmf/2.1.1/download.html) nötig.

Auto

Die Generierung des Players erfolgt wieder gleich wie im obigen Beispiel. Zur Steuerung des Players werden zwei JButton Objekte verwendet, die den Player mit Hilfe der Methoden start(), stop() und setMediaTime() ansteuern. Um die gewohnten Steuerungsmöglichkeiten von anderen Media Playern zu erzeugen, wechselt die Funktionalität des zweiten Schalters zwischen Play und Pause (||) bei jedem Klick.

Bibliographie

2

Auto

AG04

ED04

JS04


Notes
(empty)