Current Page: | Greybox » Authoring » Course ID: medieninformatik » Modules » Module ID: m06 » Learning Units » Unit ID: 3_02 |
---|---|
Last Modified: | Tuesday, 2015-05-05 - 08:09:02 |
Tools: | Validate — Preview XML Preview HTML Preview PDF |
Alternative: | Printable HTML |
Title: | Echtzeiterfassung mit JMF - Capturing | ||
---|---|---|---|
Abstract: | In dieser LU wird das Erfassen von Echtzeitdaten mit Hilfe von JMF präsentiert. Dabei wird sowohl das Audio- wie auch das Videocapturing durch Code-Beispiele erläutert. Außerdem wird auf das JMF Ereignismodell eingegangen. | ||
Status: |
|
Version: | 7.1 |
History: |
Acronyme und Wordanführungszeichen done. Reschtschreibung gecheckt. Unbekannte Character ausgebessert. Sourcecode repariert. Sourcecode formatiert. |
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 |
Einleitung1Auto
JMF Registry Editor PCJMF Registry Editor PDA_PhoneDer CaptureDeviceManagerAnsprechen von eingetragenen Devices über die Methoden der Klasse CaptureDeviceManager:
Erzeugen eines Player Objekts mit Hilfe einer ErfassungsquelleCapture DeviceInfo dev_info = CaptureDeviceManager.getDevice(device_name); Player player = Manager.createRealizedPlayer(dev_info.getLocator()); AutoIst kein Device-Name bekannt:
Abfrage von registrierten QuellenVector device_list = CaptureDeviceManager.getDeviceList( new AudioFormat("linear", 44100, 16, 2)); 2AutoMittels JMF464 ist es möglich, analoge Daten in Echtzeit zu erfassen, anschließend zu bearbeiten und schließlich darzustellen (zu "rendern") oder zu speichern. JMF464 unterstützt eine Vielzahl von Audio und Videoquellen, die zur Erfassung verwendet werden können (http://java.sun.com/products/java-media/jmf/2.1.1/formats.html). Während Audio Daten über Soundkarten und Mikrofone erfasst werden können, werden ebenso diverse Video Erfassungskomponenten (engl.: Capturing Devices) wie z.B. Webcams für die Erfassung von Video Daten unterstützt. Um ein Capture Device unter JMF464 ansprechen zu können, muss es im JMF464 Registry Editor (siehe Abb. JMF464 Registry Editor) eingetragen werden. Dieses Werkzeug ist in der Installation des JMF464 Performance Pack (siehe Das Java Media Framework) enthalten. Das Hinzufügen eines an das System angeschlossenen Devices erfolgt über die Schaltfläche "Detect Capture Devices" in der Karteikarte "Capture Devices". JMF Registry Editor PCJMF Registry Editor PDA_PhoneDer CaptureDeviceManagerWurde ein Device gefunden, so kann es nun über die Methoden der Klasse CaptureDeviceManager angesprochen werden:
Erzeugen eines Player Objekts mit Hilfe einer ErfassungsquelleCapture DeviceInfo dev_info = CaptureDeviceManager.getDevice(device_name); Player player = Manager.createRealizedPlayer(dev_info.getLocator()); Auto
Abfrage von registrierten QuellenVector device_list = CaptureDeviceManager.getDeviceList( new AudioFormat("linear", 44100, 16, 2)); AutoHier werden alle registrierten Geräte ausgegeben, die ein Audioformat mit linearem Encoding, 44,1 kHz Abtastrate (engl.: sample rate), 16 Bit Abtastgröße (engl.: sample size) und 2 Kanälen unterstützen. Erfassung von Audiodaten1Auto
Erfassung von Audiodaten//Suche das erste verfügbare Capture Device, das das angegebene Format //unterstützt java.util.Vector device_list = CaptureDeviceManager.getDeviceList( new AudioFormat("linear", 44100, 16, 2)); CaptureDeviceInfo dev_info = (CaptureDeviceInfo) device_list.firstElement(); //Erzeuge einen realized Player mit Hilfe der CaptureDeviceInfo player = Manager.createRealizedPlayer(dev_info.getLocator()); //Füge die Kontrollkomponenten des Players zum GUI hinzu setLayout(new GridLayout(1, 1)); add(player.getControlPanelComponent()); Erfassung von Audiodaten
Verwendung des Applets
2AutoMit Hilfe oben genannter Funktionen ist es nun möglich, ein Applet zum Erfassen und Wiedergeben von Audiodaten zu erstellen, die durch ein Mikrofon geliefert werden. Zum Steuern der Wiedergabe werden dem GUI404 noch die Kontrollkomponenten des Player Objekts (player.getControlPanelComponent ()) hinzugefügt: Erfassung von Audiodatenimport javax.media.*; import java.awt.*; import java.applet.*; import java.net.URL; import javax.media.format.AudioFormat; public class AudioCapturer extends Applet { private Player player = null; public void init() { try { //Suche das erste verfügbare Capture Device, das das angegebene Format //unterstützt java.util.Vector device_list = CaptureDeviceManager.getDeviceList( new AudioFormat("linear", 44100, 16, 2)); CaptureDeviceInfo dev_info = (CaptureDeviceInfo) device_list.firstElement(); //Erzeuge einen realized Player mit Hilfe der CaptureDeviceInfo player = Manager.createRealizedPlayer(dev_info.getLocator()); } catch (Exception e) { System.out.println(e.toString()); } //Füge die Kontrollkomponenten des Players zum GUI hinzu setLayout(new GridLayout(1, 1)); add(player.getControlPanelComponent()); } 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"); AudioCapturer player = new AudioCapturer(); player.init(); player.start(); f.add("Center", player); f.setSize(400, 30); f.show(); } } Erfassung von Audiodaten
Verwendung des AppletsNach klicken des Play-Buttons werden die Audiodaten des am System angeschlossenen Mikrofons über die Lautsprecher wieder ausgegeben. Zur Verwendung 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.
Erfassung von Videodaten1Auto
Erfassung von Videodaten//Suche das erste verfügbare Capture Device, das das angegebene Video //Format unterstützt java.util.Vector device_list = CaptureDeviceManager.getDeviceList(new javax.media.format.RGBFormat()); CaptureDeviceInfo dev_info = (CaptureDeviceInfo) device_list.firstElement(); //Erzeuge einen realized Player mit Hilfe der CaptureDeviceInfo player = Manager.createRealizedPlayer(dev_info.getLocator()); setLayout(new BorderLayout()); //Füge die visuellen Komponenten des Players zum GUI hinzu add(player.getVisualComponent(), BorderLayout.CENTER); add(player.getControlPanelComponent(), BorderLayout.SOUTH); Erfassung von Videodaten
Verwendung des Applets
2AutoUm die Daten einer gewählten Video-Eingabequelle am Bildschirm darzustellen, sind im Wesentlichen dieselben Schritte wie oben notwendig. Zusätzlich ist es nötig, dem GUI404 die visuelle Komponente des Player (player.getVisualComponent()) Objekts hinzuzufügen. Ein Applet, das Videodaten von einer Webcam in Echtzeit im Browser darstellt, könnte folgendermaßen aussehen: Erfassung von Videodatenimport javax.media.*; import java.awt.*; import java.applet.*; import java.net.URL; public class VideoCapturer extends Applet { private Player player = null; public void init() { try { //Suche das erste verfügbare Capture Device, das das angegebene Video //Format unterstützt java.util.Vector device_list = CaptureDeviceManager.getDeviceList(new javax.media.format.RGBFormat()); CaptureDeviceInfo dev_info = (CaptureDeviceInfo) device_list.firstElement(); //Erzeuge einen realized Player mit Hilfe der CaptureDeviceInfo player = Manager.createRealizedPlayer(dev_info.getLocator()); } catch (Exception e) { ; } setLayout(new BorderLayout()); //Füge die visuellen Komponenten des Players zum GUI hinzu 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"); VideoCapturer player = new VideoCapturer(); player.init(); player.start(); f.add("Center", player); f.setSize(400, 300); f.show(); } } Erfassung von Videodaten
Verwendung des AppletsNach klicken des Play-Buttons wird das Videobild einer an das System angeschlossenen Webcam über den Bildschirm ausgegeben. Zur Verwendung 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. Abspeichern von Echtzeitdaten1AutoZum Abspeichern der erfassten Daten in einer Datei ist statt einem Player ein Processor nötig: Vorgangsweise: Erzeugung eines DataSource Objekts und eines ProcessorsDataSource source = Manager.createDataSource(dev_info.getLocator()); Processor processor = Manager.createProcessor(source); Konfiguration der Prozessorsprocessor.configure(); //Wait until processor is configured Thread.sleep(2000); Auswahl des DatenausgabeformatsContentDescriptor descr = new FileTypeDescriptor(FileTypeDescriptor.QUICKTIME); processor.setContentDescriptor(descr); Realisieren Processorsprocessor.realize(); //Wait until processor is realized Thread.sleep(2000); Erzeugen der Datensenke zum Abspeichern der DatenMediaLocator destination = new MediaLocator("file://test.mov"); sink = Manager.createDataSink(processor.getDataOutput(),destination); Öffnen der Datensenke und Initiierung des Datentransferssink.open(); sink.start(); processor.start(); Stoppen des Ausgangsdatenstroms und schließen der Datensenke (Reihenfolge!)processor.stop(); processor.close(); sink.close(); Anwendung des JMF Ereignismodells
Auto PCAuto PDA_PhoneAutoErgänzungen zu obigem Beispiel durch DataSinkListener Objekt: Autopublic class ... implements DataSinkListener { ... sink = Manager.createDataSink(processor.getDataOutput(), destination); sink.addDataSinkListener(this); sink.open(); ... public synchronized void dataSinkUpdate(DataSinkEvent event) { if (event instanceof DataSinkErrorEvent) { ... } else if (event instanceof EndOfStreamEvent) { ... } } ... 2AutoBisher wurden die erfassten Daten nur in Echtzeit dargestellt, jedoch nicht gespeichert. Um die erfassten Daten in einer Datei abspeichern zu können, ist statt dem oben verwendeten Player Objekt eine Processor Instanz nötig. Im Folgenden werden die nötigen Schritte anhand eines Beispiels erläutert.
AutoDataSource source = Manager.createDataSource(dev_info.getLocator()); Processor processor = Manager.createProcessor(source); Auto
Autoprocessor.configure(); //Wait until processor is configured Thread.sleep(2000); Auto
AutoContentDescriptor descr = new FileTypeDescriptor(FileTypeDescriptor.QUICKTIME); processor.setContentDescriptor(descr); Auto
Autoprocessor.realize(); //Wait until processor is realized Thread.sleep(2000); Auto
AutoMediaLocator destination = new MediaLocator("file://test.mov"); sink = Manager.createDataSink(processor.getDataOutput(),destination); Auto
Autosink.open(); sink.start(); processor.start(); Auto
Autoprocessor.stop(); processor.close(); sink.close(); Anwendung des JMF EreignismodellsJMF464 verfügt über ein Ereignisbehandlungssystem, das alle JMF464 Objekte über den aktuellen Status des Mediensystems informiert JS04. Es ermöglicht unter Anderem das Reagieren auf Fehlerereignisse wie das Ausfallen von Datenquellen. Sollte im obigen Programm beispielsweise ein Problem beim Schreiben in die Datensenke auftreten oder die Datensenke keine Daten mehr erhalten, so ist es möglich auf diese Ereignisse zu reagieren. JMF464 Objekte machen auf Ereignisse durch senden von MediaEvent Objekten aufmerksam. Von der Klasse MediaEvent leiten sich die Klassen ControllerEvent und DataSinkEvent ab (siehe Abb. Klassenhierarchie des JMF464 Ereignismodells). Um solche Ereignisse behandeln zu können ist es nötig, das entsprechende Listener Interface zu implementieren sowie den Listener bei jenem Objekt zu registrieren, das das Ereignis "empfängt". Auto PCAuto PDA_PhoneAutoIm Folgenden werden die nötigen Ergänzungen zu obigem Beispiel für ein DataSinkListener Objekt skizziert: Autopublic class ... implements DataSinkListener { ... sink = Manager.createDataSink(processor.getDataOutput(), destination); sink.addDataSinkListener(this); sink.open(); ... public synchronized void dataSinkUpdate(DataSinkEvent event) { if (event instanceof DataSinkErrorEvent) { ... } else if (event instanceof EndOfStreamEvent) { ... } } ... Zusammenfassung2AutoIn dieser LU wurden die Grundlagen zur Erfassung von Audio und Videodaten mittels JMF464 eingeführt. Zur Illustration dieser Funktionalitäten wurden zwei Applets präsentiert, die Audio- bzw. Videodaten erfassen und über Lautsprecher bzw. über den Bildschirm wieder ausgeben. Außerdem wurde das Abspeichern von Echtzeitdaten in JMF464, sowie das JMF464 Ereignismodell erläutert. Bibliographie2AutoAG04 ED04 JS04 |
(empty) |