Java Media Framework (JMF) Τι είναι το 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κόλλων Πρωτoκόλλων File, HTTP, FTP, RTP/RTSP File, HTTP, FTP, RTP/RTSP Ήχου Ήχου Σύμφωνα με τη SUN: AIFF, AU, AVI, GSM, MIDI, MP2, QT, RMF, WAV, MP3 Σύμφωνα με τη SUN: AIFF, AU, AVI, GSM, MIDI, MP2, QT, RMF, WAV, MP3 Σύμφωνα με δοκιμές: παίζει WAV, AVI και το MP3 παίζει με plug-in Σύμφωνα με δοκιμές: δεν παίζει WAV, AVI και το MP3 παίζει με plug-in Video Video Σύμφωνα με τη SUN: AVI, MPEG-1, QT, H.261, H.263 Σύμφωνα με τη SUN: AVI, MPEG-1, QT, H.261, H.263 Σύμφωνα με δοκιμές: παίζει AVI. Σύμφωνα με δοκιμές: δεν παίζει AVI. Σημαντικό: Δεν υποστηρίζονται Σημαντικό: Δεν υποστηρίζονται MPEG-2, MPEG-2, MPEG-4 MPEG-4 Αναπαραγωγή CD/DVD Αναπαραγωγή CD/DVD
Γενικό Μοντέλο JMF
Το μοντέλο του JMF ( 1/4 ) Αποκωδικοποιεί τα δεδομένα και τα παρουσιάζει Λαμβάνει τα δεδομένα Υλοποιεί τη μηχανή καταστάσεων Renders Creates ControlsFeeds
Το μοντέλο του JMF ( 2/4 ) Χρησιμοποιεί τους Managers για: Χρησιμοποιεί τους Managers για: Κατασκευή Player ( Manager.createPlayer() ) Κατασκευή Player ( Manager.createPlayer() ) Κατασκευή Processor ( Manager.createProcessor() ) Κατασκευή Processor ( Manager.createProcessor() ) Κατασκευή Controller Κατασκευή Controller Κατασκευή DataSource Κατασκευή DataSource Κατασκευή DataSink Κατασκευή DataSink Διαχείριση των Plug-Ins ( PlugInManager ) Διαχείριση των Plug-Ins ( PlugInManager )
Το μοντέλο του JMF ( 3/4 ) MediaLocator: Καθορίζει τη διεύθυνση του αρχείου, μαζί με το πρωτόκολλο επικοινωνίας (file, url, rtp, κ.λπ.) MediaLocator: Καθορίζει τη διεύθυνση του αρχείου, μαζί με το πρωτόκολλο επικοινωνίας (file, url, rtp, κ.λπ.) DataSource: Η «πηγή» από όπου προέρχονται τα δεδομένα. Χρησιμοποιεί το MediaLocator. DataSource: Η «πηγή» από όπου προέρχονται τα δεδομένα. Χρησιμοποιεί το MediaLocator. Player: «παρουσιάζει» τα δεδομένα, είτε στην οθόνη, είτε στα ηχεία, που προέρχονται από το DataSource (ή από τον MediaLocator απ’ ευθείας). Player: «παρουσιάζει» τα δεδομένα, είτε στην οθόνη, είτε στα ηχεία, που προέρχονται από το DataSource (ή από τον MediaLocator απ’ ευθείας). Processor: Player με πρόσθετη λειτουργικότητα, για διαχείριση των δεδομένων. Processor: Player με πρόσθετη λειτουργικότητα, για διαχείριση των δεδομένων. DataSink: Η «έξοδος» των δεδομένων (συνήθως αναφέρεται σε αρχείο). DataSink: Η «έξοδος» των δεδομένων (συνήθως αναφέρεται σε αρχείο).
Το μοντέλο του JMF ( 4/4 ) Μοντέλο Δεδομένων (Data Model) Μοντέλο Δεδομένων (Data Model) Αφορά DataSource ( είτε Push είτε Pull ), είτε DataSink Αφορά DataSource ( είτε Push είτε Pull ), είτε DataSink Χρονικό Μοντέλο (Time Model) Χρονικό Μοντέλο (Time Model) Χρησιμοποιείται για τον καθορισμό διάρκειας, για συγχρονισμό, κ.ά. Χρησιμοποιείται για τον καθορισμό διάρκειας, για συγχρονισμό, κ.ά. Μοντέλο Ελέγχου (Controls Model) Μοντέλο Ελέγχου (Controls Model) Έλεγχος του media από τον χρήστη (start, stop, κ.λπ) Έλεγχος του media από τον χρήστη (start, stop, κ.λπ) Μοντέλο Plug-In Μοντέλο Plug-In Αφορά ό,τι υπάρχει στο JMF ως plug-in, δλδ: renderers, codecs, (de)multiplexers Αφορά ό,τι υπάρχει στο JMF ως plug-in, δλδ: renderers, codecs, (de)multiplexers Μοντέλο Γεγονότων (Event Model) Μοντέλο Γεγονότων (Event Model) Επόμενη σελίδα… Επόμενη σελίδα…
Μοντέλο Γεγονότων (Event Model) Χρησιμοποιείται ώστε Χρησιμοποιείται ώστε 1. Να επιτρέπει την επέμβαση του χρήστη (start, stop) 2. Να διαπιστώνει σφάλματα και συμβάντα (π.χ. EndOfMediaEvent) 3. Να διατηρεί συγχρονισμένα τα δεδομένα ήχου και video! 4. Να αναγνωρίζει αλλαγές, όταν πρόκειται για σύνδεση rtp. Είναι καθοριστικό για τη σωστή ροή του προγράμματος, αφού ο player στηρίζεται σε μια μηχανή καταστάσεων! Είναι καθοριστικό για τη σωστή ροή του προγράμματος, αφού ο player στηρίζεται σε μια μηχανή καταστάσεων!
JMF MediaLocator Περιγράφει την τοποθεσία όπου βρίσκεται το περιεχόμενο που θέλουμε να παρουσιάσουμε. Περιγράφει την τοποθεσία όπου βρίσκεται το περιεχόμενο που θέλουμε να παρουσιάσουμε. Η πηγή μπορεί να αφορά: Η πηγή μπορεί να αφορά: URL URL Τοπικό αρχείο Τοπικό αρχείο Παράδειγμα: Παράδειγμα: MediaLocator src = new MediaLocator(“file://” + path); MediaLocator src = new MediaLocator(“file://” + path); MediaLocator src = new MediaLocator(“url://” + path); MediaLocator src = new MediaLocator(“url://” + path);
JMF Player (1/2) Πρόκειται για Interface, όχι για Class Πρόκειται για Interface, όχι για Class Χρήση (συνήθως) ενός MediaLocator (ML) για τον καθορισμό της «πηγής» των δεδομένων. Χρήση (συνήθως) ενός MediaLocator (ML) για τον καθορισμό της «πηγής» των δεδομένων. Ένας Player κάνει rendering των δεδομένων που του «δώσαμε». Η έξοδος των δεδομένων μας είναι (συνήθως) τα ηχεία και η οθόνη. Ένας Player κάνει rendering των δεδομένων που του «δώσαμε». Η έξοδος των δεδομένων μας είναι (συνήθως) τα ηχεία και η οθόνη. Δημιουργία: Δημιουργία: Player p = Manager.createPlayer(ML); Player p = Manager.createPlayer(ML);
JMF Player (2/2) Για να λειτουργήσει ο player, πρέπει να φτάσει σε realized κατάσταση. Αυτό γίνεται με την p.realize() Για να λειτουργήσει ο player, πρέπει να φτάσει σε realized κατάσταση. Αυτό γίνεται με την p.realize() ΠΡΟΣΟΧΗ: Η p.realize() είναι ασύγχρονη και επιστρέφει αμέσως! Έλεγχος μέσω events, π.χ. RealizeCompleteEvent Έλεγχος μέσω events, π.χ. RealizeCompleteEvent Κατόπιν, καλείται η p.start() για την αναπαραγωγή των δεδομένων. Κατόπιν, καλείται η p.start() για την αναπαραγωγή των δεδομένων. Με την p.stop() σταματά η αναπαραγωγή των δεδομένων. Με την p.stop() σταματά η αναπαραγωγή των δεδομένων. Παρέχει τα Components στα οποία θα προβληθούν τα δεδομένα (p.getVisualComponent) και τα Components χειρισμού (p.getControlPanelComponent) Παρέχει τα Components στα οποία θα προβληθούν τα δεδομένα (p.getVisualComponent) και τα Components χειρισμού (p.getControlPanelComponent)
JMF Processor (1/3) Παρέχει ό,τι και ο Player, με τον ίδιο ακριβώς τρόπο, συν επιπλέον λειτουργικότητα Παρέχει ό,τι και ο Player, με τον ίδιο ακριβώς τρόπο, συν επιπλέον λειτουργικότητα Αποτελεί Interface, που κληρονομεί τον Player Αποτελεί Interface, που κληρονομεί τον Player Τι παραπάνω κάνει ο Processor? Τι παραπάνω κάνει ο Processor? Copying/Transcoding Copying/Transcoding Καθορίζει τα effect Καθορίζει τα effect Καθορίζει τους codecs Καθορίζει τους codecs Ενέργειες πάνω στα Tracks ξεχωριστά Ενέργειες πάνω στα Tracks ξεχωριστά Καθορίζει τη σειρά των παραπάνω (codec chain) Καθορίζει τη σειρά των παραπάνω (codec chain)
JMF Processor (2/3) Ένας Processor, πριν γίνει realized, μπορεί να γίνει και configured! (event model) Ένας Processor, πριν γίνει realized, μπορεί να γίνει και configured! (event model) Σκοπός: Σκοπός: Να έχει τις απαιτούμενες πληροφορίες ώστε να διαχειριστεί σωστά τα δεδομένα. Να έχει τις απαιτούμενες πληροφορίες ώστε να διαχειριστεί σωστά τα δεδομένα. Να μπορούμε να διαχειριστούμε προγραμματιστικά το περιεχόμενο και τις ενέργειες που θα κάνει Να μπορούμε να διαχειριστούμε προγραμματιστικά το περιεχόμενο και τις ενέργειες που θα κάνει Διαχείριση των tracks γίνεται με τη μέθοδο getTrackControls, που επιστρέφει ένα TrackControl για κάθε Track Διαχείριση των tracks γίνεται με τη μέθοδο getTrackControls, που επιστρέφει ένα TrackControl για κάθε Track Διαχείριση της εξόδου του Processor γίνεται με την setContentDescriptor. Διαχείριση της εξόδου του Processor γίνεται με την setContentDescriptor.
JMF Processor (3/3) Η setContentDescriptor καθορίζει το format του multiplexing (και άρα της εξόδου). Η setContentDescriptor καθορίζει το format του multiplexing (και άρα της εξόδου). Με setContentDescriptor(null), συμπεριφέρεται ως Player. Με setContentDescriptor(null), συμπεριφέρεται ως Player. Σημαντικό: Η έξοδος του Processor είναι DataSource. Άρα, μπορεί να είναι είσοδος για άλλο processor/player ή για αναμετάδοση στο net. Σημαντικό: Η έξοδος του Processor είναι DataSource. Άρα, μπορεί να είναι είσοδος για άλλο processor/player ή για αναμετάδοση στο net.
JMF RTP/RTCP/RTSP RTP: Real Time Transport Protocol RTP: Real Time Transport Protocol Το JMF υποστηρίζει RTP/RTCP μέσω κατάλληλων API’s. Το JMF υποστηρίζει RTP/RTCP μέσω κατάλληλων API’s. Η παρουσίαση των δεδομένων που προέρχονται μέσω RTP σύνδεσης, γίνεται από τον Player (ή από Processor). Η παρουσίαση των δεδομένων που προέρχονται μέσω RTP σύνδεσης, γίνεται από τον Player (ή από Processor). Χρήση Session Manager για πολλαπλές RTP συνδέσεις. Κάθε RTP σύνδεση διαχειρίζεται ξεχωριστά (π.χ. η 1η πάει σε player, η 2η σε αρχείο κ.λπ.) Χρήση Session Manager για πολλαπλές RTP συνδέσεις. Κάθε RTP σύνδεση διαχειρίζεται ξεχωριστά (π.χ. η 1η πάει σε player, η 2η σε αρχείο κ.λπ.)
JMF και RTSP Το JMF υποστηρίζει RTSP στην πλευρά του client Το JMF υποστηρίζει RTSP στην πλευρά του client Δεν υποστηρίζει RTSP στην πλευρά του server Δεν υποστηρίζει RTSP στην πλευρά του server Το RTSP είναι ενσωματωμένο μέσα στον Player. Το RTSP είναι ενσωματωμένο μέσα στον Player. Για χρήση του RTSP, αρκεί να κατασκευάσουμε έναν Player (ισχύει και για Processor, από την έκδοση beta3) με MediaLocator που να αφορά rtsp URL. Για χρήση του RTSP, αρκεί να κατασκευάσουμε έναν Player (ισχύει και για Processor, από την έκδοση beta3) με MediaLocator που να αφορά rtsp URL. Π.χ. rtsp://host:port/mediafile (default port: 554)
Προβλήματα του JMF (v2.1.1e) Δεν παίζει Mp3. Δεν παίζει Mp3. Δεν παίζει Mpeg2, Mpeg4 (video). Δεν παίζει Mpeg2, Mpeg4 (video). Ο Processor δε συμπεριφέρεται ακριβώς όπως ο Player, όταν κάνουμε setContentDescriptor(null) (συνήθως αφορά το στάδιο της παρουσίασης) Ο Processor δε συμπεριφέρεται ακριβώς όπως ο Player, όταν κάνουμε setContentDescriptor(null) (συνήθως αφορά το στάδιο της παρουσίασης) Από τα υποστηριζόμενα Format, παίζουν συγκεκριμένοι τύποι (π.χ. από τα.avi αρχεία παίζουν μόνο τα Cinepak). Από τα υποστηριζόμενα Format, παίζουν συγκεκριμένοι τύποι (π.χ. από τα.avi αρχεία παίζουν μόνο τα Cinepak). Αργή εξέλιξη: v1.0 το ’98, v2.0 το ’99, v2.1.1e το 2002 Αργή εξέλιξη: v1.0 το ’98, v2.0 το ’99, v2.1.1e το 2002
Λύσεις Υπάρχει εξωτερικό plug-In, γραμμένο σε Java, που να υποστηρίζει mp3 Υπάρχει εξωτερικό plug-In, γραμμένο σε Java, που να υποστηρίζει mp3 Για το Mpeg-4, υπάρχει plug-In, γραμμένο σε Java, από την IBM Για το Mpeg-4, υπάρχει plug-In, γραμμένο σε Java, από την IBM Χρησιμοποιούμε τον Processor για την προσαρμογή φίλτρων, και output σε DataSource που θα είναι το Input ενός Player. Χρησιμοποιούμε τον Processor για την προσαρμογή φίλτρων, και output σε DataSource που θα είναι το Input ενός Player. Δικές μας υλοποιήσεις των Player, Processor, DataSource, DataSink, όλων ή μέρους αυτών Δικές μας υλοποιήσεις των Player, Processor, DataSource, DataSink, όλων ή μέρους αυτών Για το Mpeg-2, υπάρχουν αρκετά project τα οποία στηρίζονται σε Native βιβλιοθήκες (codec) και χρησιμοποιούν JNI για να επικοινωνεί η Java με αυτές Για το Mpeg-2, υπάρχουν αρκετά project τα οποία στηρίζονται σε Native βιβλιοθήκες (codec) και χρησιμοποιούν JNI για να επικοινωνεί η Java με αυτές Πρόβλημα: Δεδομένου ότι οι βιβλιοθήκες είναι Native, για κάθε διαφορετικό σύστημα χρειαζόμαστε διαφορετική υλοποίηση. Καταργούμε τη μεταφερσισμότητα. Πρόβλημα: Δεδομένου ότι οι βιβλιοθήκες είναι Native, για κάθε διαφορετικό σύστημα χρειαζόμαστε διαφορετική υλοποίηση. Καταργούμε τη μεταφερσισμότητα.
Λύσεις (για Mpeg-2) Project που υποστηρίζουν περισσότερα format από το JMF, μέσω Native libraries: 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. QTJ: QuickTime for Java. Πρόκειται για ένα API του QuickTime γραμμένο σε Java. Παρέχει όλες τις δυνατότητες του QuickTime. Μπορεί να γίνει Integration QuickTime εφαρμογών μέσα σε Java. Θα χρησιμοποιηθεί αντί του JMF. Πρόκειται για ένα API του QuickTime γραμμένο σε Java. Παρέχει όλες τις δυνατότητες του QuickTime. Μπορεί να γίνει Integration QuickTime εφαρμογών μέσα σε Java. Θα χρησιμοποιηθεί αντί του JMF. Προβλήματα: Το QuickTime υπάρχει μόνο για Windows και Mac. Όχι για Linux. Προβλήματα: Το QuickTime υπάρχει μόνο για Windows και Mac. Όχι για Linux. JavaTV JavaTV Σύμφωνα με τον Michael Bundschuh (Java Software/ Sun Microsystems, Inc.), το JavaTV ελέγχει έναν MPEG-2 decoder σε επίπεδο υλικού (hardware decoder). Σύμφωνα με τον Michael Bundschuh (Java Software/ Sun Microsystems, Inc.), το JavaTV ελέγχει έναν MPEG-2 decoder σε επίπεδο υλικού (hardware decoder).
Βιβλιογραφία και Χρήσιμα Links Java Media Framework API Guide Java Media Framework API Guide Java Media Framework Basics, IBM Java Media Framework Basics, IBM Quick Time for Java: A Developer's Notebook Quick Time for Java: A Developer's Notebook Essential JMF - Java Media Frameworκ Essential JMF - Java Media Frameworκ Java Media Framework and Sound Java Media Framework and Sound