Java Media Framework (JMF)

Download Report

Transcript Java Media Framework (JMF)

Java Media Framework (JMF)
Τι είναι το JMF
 Τι υποστηρίζει
 Πού χρησιμοποιείται
 Προβλήματα και λύσεις
 Το μέλλον

Τι είναι το JMF
Είναι ένα API για την ενσωμάτωση και διαχείριση
ήχου και video μέσα σε εφαρμογές (applications και
applets) Java.
Τι εννοούμε με «ενσωμάτωση
και διαχείριση»?
1. Παρουσίαση (presentation)
2. Επεξεργασία (processing):
i. (Απο)Πολυπλεξία (multiplexing-demultiplexing)
ii. Μετατροπή format (transcoding)
iii. Εφαρμογή φίλτρων (effect)
3. Λήψη και αποστολή δεδομένων από/προς το Internet.
4. Καταγραφή από συσκευές (π.χ. κάμερα, μικρόφωνο)
Υποστηριζόμενα Format (2.1.1)

Πρωτoκόλλων


Ήχου



Σύμφωνα με τη SUN: AIFF, AU, AVI, GSM, MIDI, MP2, QT, RMF, WAV, MP3
Σύμφωνα με δοκιμές: δεν παίζει WAV, AVI και το MP3 παίζει με plug-in
Video



File, HTTP, FTP, RTP/RTSP
Σύμφωνα με τη SUN: AVI, MPEG-1, QT, H.261, H.263
Σύμφωνα με δοκιμές: δεν παίζει AVI.
Σημαντικό: Δεν υποστηρίζονται



MPEG-2,
MPEG-4
Αναπαραγωγή CD/DVD
Γενικό Μοντέλο JMF
Το μοντέλο του JMF ( 1/4 )
Υλοποιεί τη μηχανή
καταστάσεων
Λαμβάνει τα
δεδομένα
Creates
Feeds
Controls
Renders
Αποκωδικοποιεί τα δεδομένα
και τα παρουσιάζει
Το μοντέλο του JMF ( 2/4 )

Χρησιμοποιεί τους Managers για:






Κατασκευή Player ( Manager.createPlayer() )
Κατασκευή Processor ( Manager.createProcessor() )
Κατασκευή Controller
Κατασκευή DataSource
Κατασκευή DataSink
Διαχείριση των Plug-Ins ( PlugInManager )
Το μοντέλο του JMF ( 3/4 )





MediaLocator: Καθορίζει τη διεύθυνση του αρχείου, μαζί
με το πρωτόκολλο επικοινωνίας (file, url, rtp, κ.λπ.)
DataSource: Η «πηγή» από όπου προέρχονται τα
δεδομένα. Χρησιμοποιεί το MediaLocator.
Player: «παρουσιάζει» τα δεδομένα, είτε στην οθόνη, είτε
στα ηχεία, που προέρχονται από το DataSource (ή από
τον MediaLocator απ’ ευθείας).
Processor: Player με πρόσθετη λειτουργικότητα, για
διαχείριση των δεδομένων.
DataSink: Η «έξοδος» των δεδομένων (συνήθως
αναφέρεται σε αρχείο).
Το μοντέλο του JMF ( 4/4 )

Μοντέλο Δεδομένων (Data Model)


Χρονικό Μοντέλο (Time Model)


τον
καθορισμό
διάρκειας,
για
Έλεγχος του media από τον χρήστη (start, stop, κ.λπ)
Μοντέλο Plug-In


Χρησιμοποιείται για
συγχρονισμό, κ.ά.
Μοντέλο Ελέγχου (Controls Model)


Αφορά DataSource ( είτε Push είτε Pull ), είτε DataSink
Αφορά ό,τι υπάρχει στο JMF ως plug-in, δλδ: renderers,
codecs, (de)multiplexers
Μοντέλο Γεγονότων (Event Model)

Επόμενη σελίδα…
Μοντέλο Γεγονότων (Event Model)

Χρησιμοποιείται ώστε
1.
2.
3.
4.

Να επιτρέπει την επέμβαση του χρήστη (start, stop)
Να διαπιστώνει σφάλματα και συμβάντα (π.χ.
EndOfMediaEvent)
Να διατηρεί συγχρονισμένα τα δεδομένα ήχου και
video!
Να αναγνωρίζει αλλαγές, όταν πρόκειται για
σύνδεση rtp.
Είναι καθοριστικό για τη σωστή ροή του
προγράμματος, αφού ο player στηρίζεται σε μια
μηχανή καταστάσεων!
JMF MediaLocator


Περιγράφει την τοποθεσία όπου βρίσκεται το
περιεχόμενο που θέλουμε να παρουσιάσουμε.
Η πηγή μπορεί να αφορά:



URL
Τοπικό αρχείο
Παράδειγμα:


MediaLocator src = new MediaLocator(“file://” + path);
MediaLocator src = new MediaLocator(“url://” + path);
JMF Player (1/2)




Πρόκειται για Interface, όχι για Class
Χρήση (συνήθως) ενός MediaLocator (ML) για τον
καθορισμό της «πηγής» των δεδομένων.
Ένας Player κάνει rendering των δεδομένων που του
«δώσαμε». Η έξοδος των δεδομένων μας είναι
(συνήθως) τα ηχεία και η οθόνη.
Δημιουργία:

Player p = Manager.createPlayer(ML);
JMF Player (2/2)

Για να λειτουργήσει ο player, πρέπει να φτάσει σε realized
κατάσταση. Αυτό γίνεται με την p.realize()





ΠΡΟΣΟΧΗ: Η p.realize() είναι ασύγχρονη και επιστρέφει
αμέσως!
Έλεγχος μέσω events, π.χ. RealizeCompleteEvent
Κατόπιν, καλείται η p.start() για την αναπαραγωγή των
δεδομένων.
Με την p.stop() σταματά η αναπαραγωγή των δεδομένων.
Παρέχει τα Components στα οποία θα προβληθούν τα
δεδομένα (p.getVisualComponent) και τα Components
χειρισμού (p.getControlPanelComponent)
JMF Processor (1/3)



Παρέχει ό,τι και ο Player, με τον ίδιο ακριβώς τρόπο, συν
επιπλέον λειτουργικότητα
Αποτελεί Interface, που κληρονομεί τον Player
Τι παραπάνω κάνει ο Processor?

Copying/Transcoding

Καθορίζει τα effect

Καθορίζει τους codecs

Ενέργειες πάνω στα Tracks ξεχωριστά

Καθορίζει τη σειρά των παραπάνω (codec chain)
JMF Processor (2/3)


Ένας Processor, πριν γίνει realized, μπορεί να γίνει και
configured! (event model)
Σκοπός:




Να έχει τις απαιτούμενες πληροφορίες ώστε να διαχειριστεί
σωστά τα δεδομένα.
Να μπορούμε να διαχειριστούμε προγραμματιστικά το
περιεχόμενο και τις ενέργειες που θα κάνει
Διαχείριση των tracks γίνεται με τη μέθοδο
getTrackControls, που επιστρέφει ένα TrackControl για
κάθε Track
Διαχείριση της εξόδου του Processor γίνεται με την
setContentDescriptor.
JMF Processor (3/3)



Η setContentDescriptor καθορίζει το format του
multiplexing (και άρα της εξόδου).
Με setContentDescriptor(null), συμπεριφέρεται
ως Player.
Σημαντικό: Η έξοδος του Processor είναι
DataSource. Άρα, μπορεί να είναι είσοδος για
άλλο processor/player ή για αναμετάδοση στο
net.
JMF RTP/RTCP/RTSP




RTP: Real Time Transport Protocol
Το JMF υποστηρίζει RTP/RTCP μέσω κατάλληλων
API’s.
Η παρουσίαση των δεδομένων που προέρχονται
μέσω RTP σύνδεσης, γίνεται από τον Player (ή από
Processor).
Χρήση Session Manager για πολλαπλές RTP
συνδέσεις. Κάθε RTP σύνδεση διαχειρίζεται
ξεχωριστά (π.χ. η 1η πάει σε player, η 2η σε αρχείο
κ.λπ.)
JMF και RTSP




Το JMF υποστηρίζει RTSP στην πλευρά του client
Δεν υποστηρίζει RTSP στην πλευρά του server
Το RTSP είναι ενσωματωμένο μέσα στον Player.
Για χρήση του RTSP, αρκεί να κατασκευάσουμε
έναν Player (ισχύει και για Processor, από την
έκδοση 2.1.1 beta3) με MediaLocator που να
αφορά rtsp URL.
Π.χ. rtsp://host:port/mediafile (default port: 554)
Προβλήματα του JMF (v2.1.1e)





Δεν παίζει Mp3.
Δεν παίζει Mpeg2, Mpeg4 (video).
Ο Processor δε συμπεριφέρεται ακριβώς όπως ο
Player, όταν κάνουμε setContentDescriptor(null)
(συνήθως αφορά το στάδιο της παρουσίασης)
Από τα υποστηριζόμενα Format, παίζουν
συγκεκριμένοι τύποι (π.χ. από τα .avi αρχεία
παίζουν μόνο τα Cinepak).
Αργή εξέλιξη: v1.0 το ’98, v2.0 το ’99, v2.1.1e το
2002
Λύσεις





Υπάρχει εξωτερικό plug-In, γραμμένο σε Java, που να
υποστηρίζει mp3
Για το Mpeg-4, υπάρχει plug-In, γραμμένο σε Java, από την
IBM
Χρησιμοποιούμε τον Processor για την προσαρμογή
φίλτρων, και output σε DataSource που θα είναι το Input
ενός Player.
Δικές μας υλοποιήσεις των Player, Processor, DataSource,
DataSink, όλων ή μέρους αυτών
Για το Mpeg-2, υπάρχουν αρκετά project τα οποία
στηρίζονται σε Native βιβλιοθήκες (codec) και
χρησιμοποιούν JNI για να επικοινωνεί η Java με αυτές

Πρόβλημα: Δεδομένου ότι οι βιβλιοθήκες είναι Native, για κάθε
διαφορετικό σύστημα χρειαζόμαστε διαφορετική υλοποίηση.
Καταργούμε τη μεταφερσισμότητα.
Λύσεις (για Mpeg-2)

Project που υποστηρίζουν περισσότερα format από το JMF,
μέσω Native libraries:





FFMPEG (libavcodec): Υποστηρίζει Mpeg-2, Mpeg-4. Πλήρης
λίστα εδώ. Δεν υποστηρίζει RTSP. Project που το χρησιμοποιούν
εδώ. JMF wrapper του FFMPEG μπορεί να βρεθεί εδώ
JFFMPEG: Υποστηρίζει (video) Mpeg1, Mpeg2, Mpeg4, DivX,
XViD, H263(/RTP), (audio)AC3, MP3
FMJ: Προσπαθεί να αντικαταστήσει το JMF. Δεν υποστηρίζει
JMF. Δεν υποστηρίζει αρκετά format.
FOBS: FOBS4JMF. Χρησιμοποιεί το FFMPEG. Περισσότερες
πληροφορίες εδώ
sJMF: Χρησιμοποιείται για video conferencing. Υποστηρίζει
MPEG-2, MPEG-4 codecs, για Windows και Linux. Πληροφορίες
εδώ
Άλλες Λύσεις

QTJ: QuickTime for Java.



Πρόκειται για ένα API του QuickTime γραμμένο σε
Java. Παρέχει όλες τις δυνατότητες του QuickTime.
Μπορεί να γίνει Integration QuickTime εφαρμογών
μέσα σε Java. Θα χρησιμοποιηθεί αντί του JMF.
Προβλήματα: Το QuickTime υπάρχει μόνο για
Windows και Mac. Όχι για Linux.
JavaTV

Σύμφωνα με τον Michael Bundschuh (Java Software/
Sun Microsystems, Inc.), το JavaTV ελέγχει έναν
MPEG-2 decoder σε επίπεδο υλικού (hardware
decoder).
Βιβλιογραφία και Χρήσιμα Links

















Java Media Framework API Guide
Java Media Framework Basics, IBM
Quick Time for Java: A Developer's Notebook
Essential JMF - Java Media Frameworκ
Java Media Framework and Sound
http://www.oreillynet.com/mac/blog/2005/12/jmf_a_mistake_asking_to_be_rem
.html
http://developer.apple.com/quicktime/qtjava/
http://www.onjava.com/pub/a/onjava/2002/12/23/jmf.html
http://ffmpeg.mplayerhq.hu/
http://fmj.sourceforge.net/jmf-projects.html
http://jffmpeg.sourceforge.net/
http://fobs.sourceforge.net/
http://archives.java.sun.com/archives/jmf-interest.html
http://java.sun.com/products/java-media/jmf/2.1.1/faq-jmf.html
http://java.sun.com/products/java-media/jmf/2.1.1/solutions/
http://java.sun.com/products/java-media/jmf/2.1.1/formats.html
http://java.sun.com/products/java-media/jmf/2.1.1/apidocs/index-all.html