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κόλλων File, HTTP, FTP, RTP/RTSP Ήχου Σύμφωνα με τη SUN: AIFF, AU, AVI, GSM, MIDI, MP2, QT, RMF, WAV, MP3 Από δοκιμές: παίζει WAV, AVI και το MP3 παίζει με plug-in Από δοκιμές: δεν παίζει WAV, AVI και το MP3 παίζει με plug-in Video Σύμφωνα με τη SUN: AVI, MPEG-1, QT, H.261, H.263 Από δοκιμές: παίζει AVI. Από δοκιμές: δεν παίζει AVI. Σημαντικό: Δεν υποστηρίζονται MPEG-2, MPEG-4 Αναπαραγωγή CD/DVD
Γενικό Μοντέλο JMF
Το μοντέλο του JMF ( 1/4 ) Αποκωδικοποιεί τα δεδομένα και τα παρουσιάζει Λαμβάνει τα δεδομένα Υλοποιεί τη μηχανή καταστάσεων Renders Creates ControlsFeeds
Το μοντέλο του 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) Αφορά DataSource ( είτε Push είτε Pull ), είτε DataSink Χρονικό Μοντέλο (Time Model) Χρησιμοποιείται για τον καθορισμό διάρκειας, για συγχρονισμό, κ.ά. Μοντέλο Ελέγχου (Controls Model) Έλεγχος του media από τον χρήστη (start, stop, κ.λπ) Μοντέλο Plug-In Αφορά ό,τι υπάρχει στο JMF ως plug-in, δλδ: renderers, codecs, (de)multiplexers Μοντέλο Γεγονότων (Event Model)
Μοντέλο Γεγονότων (Event Model) Χρησιμοποιείται ώστε 1.Να επιτρέπει την επέμβαση του χρήστη (start, stop) 2.Να διαπιστώνει σφάλματα και συμβάντα (π.χ. EndOfMediaEvent) 3.Να διατηρεί συγχρονισμένα τα δεδομένα ήχου και video! 4.Να αναγνωρίζει αλλαγές, όταν πρόκειται για σύνδεση 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, από την έκδοση 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 e_rem.html