Προγραμματισμός

Πρόοδος στα JMF και Java Media API

Το πρώτο μου JavaWorld άρθρο back-back-when ήταν στο Java Media Framework (JMF). Καθώς τα διάφορα API Media έχουν ωριμάσει, αισθάνομαι ότι τα πράγματα έχουν φτάσει σε πλήρη κύκλο. Επομένως, θα αφιερώσω τον τελικό μου Προγραμματισμός πολυμέσων στήλη σε μια επανεξέταση του JMF και τη γενική κατάσταση όλων των Java Media API.

Υπήρξαν ορισμένες αξιοσημείωτες αλλαγές στο JMF και άλλες τεχνολογίες Java Media, τις εταιρείες που αναπτύσσουν υλοποιήσεις αυτών και τη διαθεσιμότητά τους για προγραμματιστές. Αυτό το άρθρο ενημερώνει το υλικό από προηγούμενα άρθρα, ανάλογα με την περίπτωση.

Μια σημαντική υπενθύμιση: Το Java Media Framework είναι ένα συγκεκριμένο API για συγχρονισμό ροών πολυμέσων (αρχεία, ροές δικτύου και ούτω καθεξής). Είναι ένα από τα πολλά Java Media APIs, τα οποία περιλαμβάνουν επίσης Java 2D, Java 3D, Java Speech και ούτω καθεξής. Αναφέρομαι στο Java Media Framework ως JMF, κράτηση του όρου Μέσα Java για ολόκληρη τη συλλογή API πολυμέσων.

Ιστορικό και βασικά στοιχεία του JMF

Από το JMF 1.0, γνωστό και ως Java Media Player API, έγραψα τα ακόλουθα τον Απρίλιο του 1997 (βλ. Πόρους):

Το Java Media Player API, ένα τμήμα του Java Media Framework (JMF), επιτρέπει στους προγραμματιστές Java να ενσωματώνουν εύκολα ήχο και βίντεο σε μικροεφαρμογές και εφαρμογές. Τόσο στατικά όσο και πολυμέσα ροής υποστηρίζονται από οποιαδήποτε έγκυρη διεύθυνση URL. Οι συσκευές αναπαραγωγής JMF ενδέχεται να ελέγχονται από άλλους παίκτες, παρέχοντας συγχρονισμένη αναπαραγωγή πολλαπλών δειγμάτων ήχου και βίντεο.

Αυτές οι πληροφορίες εξακολουθούν να ισχύουν με τις ενημερώσεις και τις προσθήκες των τελευταίων δύο ετών. Η JMF, ωστόσο, έχει αναπτύξει νέες δυνατότητες και έχει αναπτυχθεί σε πεδίο εφαρμογής, ειδικά με την επερχόμενη έκδοση 2.0 API (αναμένεται το δεύτερο εξάμηνο του 1999).

Παίκτες της βιομηχανίας JMF

Πρώτα, ας ρίξουμε μια ματιά στους παίκτες του κλάδου. Η Sun, η Silicon Graphics (SGI) και η Intel σχεδίασαν και καθόρισαν το αρχικό JMF 1.0 στα μέσα του 1998. Εν τω μεταξύ από την αρχική έκδοση του API, τόσο η SGI όσο και η Intel έχουν αποσυρθεί από τη διαδικασία προδιαγραφής JMF. Για λίγο, υπήρχε σημαντική ανησυχία στην κοινότητα χρηστών του JMF ότι η Sun ήταν ο μοναδικός προμηθευτής που υποστήριζε την JMF. Αυτή η κατάσταση ήταν ανεπιθύμητη.

Ευτυχώς, στα τέλη του 1998 η IBM μπήκε με ενδιαφέρον στο JMF. Λίγο μετά την ένταξη της IBM στη Sun, κυκλοφόρησε μια εφαρμογή Java για το API 1.0 (Δεκεμβρίου 1998) Αυτή η υλοποίηση, γνωστή ως JMF 1.1 για πλατφόρμες Java, υποστηρίζει ένα περιορισμένο αλλά σημαντικό υποσύνολο των τύπων περιεχομένου και πρωτοκόλλου που υποστηρίζονται από τις ενσωματωμένες εφαρμογές Win32 και Solaris JMF 1.1 (γνωστές ως πακέτα απόδοσης). Η διαθεσιμότητα ενός all-Java JMF 1.1 ήταν ένα σημαντικό ορόσημο για το JMF, καθώς η τεχνολογία έγινε διαθέσιμη για οποιονδήποτε Java 1.1 συμβατό ή Java 2 χρόνο εκτέλεσης. Στην πραγματικότητα, η εφαρμογή Java JMF 1.1 είναι ακόμη διαθέσιμη σε μια έκδοση προσανατολισμένη στο Web με εργαλεία που επιτρέπουν στους προγραμματιστές να συμπεριλαμβάνουν μόνο τις σχετικές τάξεις JMF σε ένα αρχείο JAR για λήψη με τις μικροεφαρμογές JMF τους. Αυτό επιτρέπει σε κάποιον να αναπτύξει μικροεφαρμογές που βασίζονται σε JMF σε διακομιστή Web για χρήση από οποιοδήποτε πρόγραμμα περιήγησης συμβατό με Java 1.1. Τόσο το Netscape όσο και η Microsoft υποστηρίζουν Java 1.1 - και επομένως JMF 1.1 για Java - στις πρόσφατες εκδόσεις του προγράμματος περιήγησης Navigator και Internet Explorer, αντίστοιχα.

Η IBM βοηθά την Sun στην κωδικοποίηση του JMF 2.0 API, το οποίο θα περιλαμβάνει μια προδιαγραφή και θα παρέχει μια εφαρμογή αναφοράς του επόμενου API JMF: Java Media Capture. Ας ελπίσουμε ότι η IBM θα καταλάβει πώς να μεταφέρει στη συνέχεια τη λειτουργικότητα JMF σε ορισμένα από τα προϊόντα λογισμικού της Java που είναι προσανατολισμένα στις επιχειρήσεις - ένα πιθανώς καλό πράγμα για τη μακροζωία της τεχνολογίας JMF.

Τι νέο υπάρχει στο JMF 2.0 έναντι 1.0;

Το JMF 1.0 API καθορίζει τα απαραίτητα στοιχεία για τη διαχείριση της αναπαραγωγής συγχρονισμένου ήχου και βίντεο. Ανατρέξτε στο προηγούμενο άρθρο μου JMF (βλ. Πόρους) για μια ανασκόπηση των δυνατοτήτων του JMF 1.0.

Το JMF 2.0 κάνει πολλές βασικές προσθήκες στις προδιαγραφές:

  • Σύλληψη ήχου και βίντεο
  • Ροή ήχου και βίντεο, και συνεπώς η δυνατότητα δημιουργίας διακομιστών ροής όλων των Java εκτός από πελάτες
  • Υποστηριζόμενη υποστήριξη κωδικοποιητή εντός παικτών

Για περισσότερες πληροφορίες σχετικά με το JMF 2.0 και τις νέες δυνατότητές του, ανατρέξτε στο Οδηγός προγραμματιστή Java Media Framework (βλ. πόρους), που διατίθεται προς το παρόν στην έκδοση 0.5 πρώιμη πρόσβαση.

Εγκατάσταση εργαλείων ανάπτυξης και χρόνου εκτέλεσης JMF

Τόσο η Silicon Graphics όσο και η Intel έχουν αφαιρέσει προηγούμενες εκδόσεις του JMF από τις αντίστοιχες τοποθεσίες Web τους. Μπορείτε, ωστόσο, να πραγματοποιήσετε λήψη των πιο πρόσφατων εφαρμογών αναφοράς (με την ένδειξη JMF 1.1, συμβατό με την προδιαγραφή 1.0 API) για τις πλατφόρμες Win32, Solaris και Java από τον ιστότοπο της Sun (βλ. Πόροι).

Σημειώστε ότι η τεκμηρίωση για την έκδοση all-Java αναφέρει συγκεκριμένα το AIX, υποδεικνύοντας ότι η IBM δοκιμάζει αυτό το λογισμικό στον χρόνο εκτέλεσης της AIX Java. Περιμένω μελλοντικές εκδόσεις του JMF (2.0 και μεταγενέστερες) να υποστηρίξουν συγκεκριμένα λειτουργικά περιβάλλοντα IBM, είτε μέσω μιας καθαρής υλοποίησης Java είτε συγκεκριμένων λειτουργικών εγγενών εφαρμογών.

Ενημερωμένα παραδείγματα JMF

Έχω ενημερώσει το παράδειγμα συμβατότητας beta του JMF 1.0 από το προηγούμενο άρθρο μου στο JMF για εκτέλεση σε περιβάλλοντα συμβατά με JMF 1.0 API. Μπορείτε να κάνετε λήψη του παραδείγματος κώδικα και να τον δοκιμάσετε στις εφαρμογές JMF 1.1 χρησιμοποιώντας τα δικά σας αρχεία πολυμέσων. Η μικροεφαρμογή θα πρέπει επίσης να εκτελείται σε JMF 2.0 runtimes όταν είναι διαθέσιμα. (Για λήψη όλων των αρχείων που σχετίζονται με αυτό το άρθρο σε μορφή zip, ανατρέξτε στην ενότητα Πόροι.)

001 // Σχολιάστε την ακόλουθη δήλωση πακέτου για μεταγλώττιση ξεχωριστά. 002 // πακέτο com.javaworld.media.jmf; 003 004 εισαγωγή java.applet. *; 005 εισαγωγή java.awt. *; 006 εισαγωγή java.net. *; 007 εισαγωγή java.io. *; 008 εισαγωγή javax.media. *; 009 010 / ** 011 * Το JMF11Applet ενημερώνει το JMFApplet από το άρθρο JavaWorld του Απριλίου 1997 012 * για συμβατότητα API JMF 1.1. Παρακαλώ 013 * ανατρέξτε στο άρθρο στη διεύθυνση:

014 * //www.javaworld.com/jw-04-1997/jw-04-jmf.html 015 *

016 * Επιπλέον, το JMF11Applet έχει επεξεργαστεί ξανά στο 017 * χρησιμοποιώντας το μοντέλο συμβάντος Java 1.1 (και μετά). Αυτή η έκδοση 018 * έχει αναπτυχθεί και δοκιμαστεί σε Java 2 019 * και την εφαρμογή JMF 1.1 all-Java, Μάιος 1999. 020 *

021 * Αυτή η εφαρμογή μπορεί να αναπτυχθεί σε δημόσιους διακομιστές Web 022 * χρησιμοποιώντας το jmf-server.jar που παρέχεται στο JMF 1.1 023 * για λήψη διακομιστών Web. Αυτό το αρχείο JAR περιέχει 024 * τις απαραίτητες κλάσεις χρόνου εκτέλεσης όλων των Java JMF. Το JMF11Applet 025 * έχει αναπτυχθεί με αυτόν τον τρόπο για τη στήλη Ιουνίου 1999 026 *:

027 * //www.javaworld.com/jw-06-1999/jw-06-media.html 028 * 029 * @author Bill Day 030 * @version 1.1 031 * @see javax.media.ControllerEvent 032 * @see javax .media.ControllerListener 033 * @see javax.media.Manager 034 * @see javax.media.NoPlayerException 035 * @see javax.media.Player 036 * @see javax.media.RealizeCompleteEvent 037 ** / 038 039 δημόσια τάξη JMF11Applet Το Applet εφαρμόζει το ControllerListener {040 ιδιωτικό URL myURL = null; 041 ιδιωτικός παίκτης myPlayer = null; 042 ιδιωτικό συστατικό myVisual = null; 043 ιδιωτικό συστατικό myControls = null; 044 private Panel visualPanel = null; 045 046 / ** 047 * Αρχικοποιήστε το JMF11Applet. Σχεδιάζουμε τη διεπαφή και 048 * δημιουργούμε τον παίκτη μας στο init (). 049 ** / 050 public void init () {051 super.init (); 052 053 // Καθορίστε το AWT Layout Manager. 054 setLayout (νέο BorderLayout ()); 055 056 // Φόρτωση διεύθυνσης URL από την ιστοσελίδα JMF11Applet είναι ενσωματωμένη. 057 String asset = getParameter ("ASSET"); 058 059 // Ελέγξτε τη διεύθυνση URL και δημιουργήστε ένα αντικείμενο URL για να το κρατήσετε. 060 if (asset.equals ("")) {061 // δεν έχουμε εισαγάγει ένα στοιχείο στο applet. 062} αλλιώς {063 δοκιμάστε {064 myURL = νέα διεύθυνση URL (getDocumentBase (), asset); 065} catch (MalformedURLException e) {066 // Καταχωρίσαμε ένα ελλιπές στοιχείο ή δημιουργήσαμε εσφαλμένη διεύθυνση URL. 067 // Η πιο στιβαρή μικροεφαρμογή πρέπει να το χειριστεί χαριτωμένα. 068} 069} 070 δοκιμάστε {071 // Εδώ είναι ένα ενδιαφέρον κομμάτι. Ο διαχειριστής συνηθίζει να 072 // δημιουργεί το πραγματικό πρόγραμμα αναπαραγωγής για αυτήν τη διεύθυνση URL. Στη συνέχεια, 073 // προσθέτουμε το JMF11Applet ως ControllerListener για το myPlayer. 074 // Αυτό μας επιτρέπει να ανταποκριθούμε στο RealizeCompleteEvents. 075 myPlayer = Manager.createPlayer (myURL); 076 myPlayer.addControllerListener (αυτό); 077} catch (IOException e) {078 // Αντιμετώπισε κάποιο πρόβλημα με το I / O; έξοδος. 079 System.out.println ("Πρόβλημα εισόδου / εξόδου κατά τη δημιουργία προγράμματος αναπαραγωγής ... έξοδος"); 080 System.exit (1); 081} catch (NoPlayerException e) {082 // Δεν είναι δυνατή η επιστροφή ενός χρησιμοποιήσιμου προγράμματος αναπαραγωγής. έξοδος. 083 System.out.println ("Δεν επέστρεψε παίκτης ... Έξοδος"); 084 System.exit (1); 085} 086} 087 088 / ** 089 * Αντικαταστήστε την προεπιλεγμένη μέθοδο εκκίνησης της μικροεφαρμογής για να καλέσετε τον παίκτη 090 * real ( Αυτό θα κάνει πρώτα την πραγματοποίηση, η οποία με τη σειρά του 091 * ενεργοποιεί τα τελικά bit του κτιρίου GUI στη μέθοδο του ελεγκτή Update () 092 *. Δεν ξεκινάμε αυτόματα την αναπαραγωγή: Ο χρήστης χρειάζεται 093 * για να κάνει κλικ στο κουμπί "αναπαραγωγή" στην εφαρμογή μας για να ξεκινήσει η αναπαραγωγή του δείγματος μέσων 094 *. 095 ** / 096 δημόσια άκυρη έναρξη () {097 myPlayer.realize (); 098} 099 100 101 / ** 102 * Αντικαταστήστε την προεπιλεγμένη μέθοδο διακοπής applet για να καλέσετε το myPlayer.stop () 103 * και το myPlayer.deallocate (), ώστε να αποδεσμεύσουμε σωστά τους πόρους 104 * εάν κάποιος βγει από αυτήν τη σελίδα στο πρόγραμμα περιήγησής του. 105 ** / 106 δημόσια άκυρη στάση () {107 myPlayer.stop (); 108 myPlayer.deallocate (); 109} 110 111 / ** 112 * Δεδομένου ότι πρέπει να γνωρίζουμε πότε ολοκληρώνεται η συνειδητοποίηση, χρησιμοποιούμε το 113 * controllerUpdate () για να χειριστούμε το RealizeCompleteEvents. 114 * Όταν λαμβάνουμε το RealizeCompleteEvent, σχεδιάζουμε 115 * και προβάλλουμε το στοιχείο βίντεο και τα στοιχεία ελέγχου στο 116 * applet GUI. 117 ** / 118 public void controllerUpdate (συμβάν ControllerEvent) {119 if (event instanceof RealizeCompleteEvent) {120 //System.out.println("Received RCE ... "); 121 // Τώρα που έχουμε ένα Realized player, μπορούμε να πάρουμε το 122 // VisualComponent και ControlPanelComponent και να τα συσκευάσουμε 123 // στην εφαρμογή μας. 124 myVisual = myPlayer.getVisualComponent (); 125 if (myVisual! = Null) {126 // Για να διασφαλιστεί ότι το VisualComponent 127 // δεν αλλάζει το μέγεθός του από το BorderLayout, το τοποθετώ 128 // μέσα στο visualPanel χρησιμοποιώντας το FlowLayout. 129 visualPanel = νέο πάνελ (); 130 visualPanel.setLayout (νέο FlowLayout ()); 131 visualPanel.add (myVisual); 132 προσθήκη (visualPanel, BorderLayout.CENTER); 133 //System.out.println("Προστέθηκε VisualComponent ... "); 134} 135 myControls = myPlayer.getControlPanelComponent (); 136 if (myControls! = Null) {137 προσθήκη (myControls, BorderLayout.SOUTH); 138 //System.out.println("Προστέθηκαν στοιχεία ελέγχου ... "); 139} 140 // ακύρωση (); 141 επικύρωση (); 142} 143 // Αλλιώς καταναλώνουμε απλώς την εκδήλωση. 144} 145}

Έχω συμπεριλάβει ένα απλό παράδειγμα έγγραφο HTML, example.html (το οποίο μπορείτε να δοκιμάσετε στο πρόγραμμα περιήγησής σας τώρα κάνοντας κλικ εδώ), για να σας δείξω πώς να ενσωματώσετε το applet στις δικές σας ιστοσελίδες. Απλώς αλλάξτε το αρχείο πολυμέσων στο ΠΕΡΙΟΥΣΙΑΚΟ ΣΤΟΙΧΕΙΟ επισήμανση και πηγαίνετε!

Για αυτό το παράδειγμα, χρησιμοποίησα τη λήψη του JMF 1.1 για διακομιστές Web (τεκμηριωμένο στον ιστότοπο JMF) για να ενεργοποιήσω JMF11Applet για αυτόματη λήψη jmf-server.jar, ένα αρχείο κώδικα που περιέχει τις απαραίτητες κλάσεις χρόνου εκτέλεσης JMF. Αυτό επιτρέπει στο applet να εκτελεστεί σε οποιοδήποτε πρόγραμμα περιήγησης συμβατό με Java 1.1, χωρίς να εγκατασταθεί λογισμικό για τον τελικό χρήστη. (Σημειώστε ότι η έκδοση JMF για διακομιστές Web περιλαμβάνει επίσης ένα εργαλείο προσαρμογής, Προσαρμογέας JMFC, που θα σας επιτρέψει να αφαιρέσετε ακόμη περισσότερες περιττές κλάσεις από το αρχείο JMF JAR. Αυτό το εργαλείο δεν λειτουργεί αυτήν τη στιγμή στο Java 2, ωστόσο, καθώς χρησιμοποιεί ένα παλιό όνομα πακέτου για το Swing.)

Στο συγκεκριμένο παράδειγμα ενσωματωμένο στο example.html, φορτώνουμε ένα αρχείο WAV (welcome.wav), βεβαιώνουμε τα κατάλληλα στοιχεία ελέγχου που θα διατίθενται (κανένα στοιχείο βίντεο, δεδομένου ότι πρόκειται για ένα αρχείο πολυμέσων μόνο για ήχο) και αναπαράγουμε το αρχείο πολυμέσων. Λάβετε υπόψη ότι το αρχείο WAV (600 KB) και οι κλάσεις JMF (570 KB) ενδέχεται να απαιτήσουν αρκετά λεπτά για λήψη στο μηχάνημά σας ανάλογα με την ταχύτητα σύνδεσης.

Μετά την ανάλυση της σελίδας παραδείγματος, τα προγράμματα περιήγησης συμβατά με Java 1.1 θα πρέπει να φορτώσουν αυτόματα το applet και να υποστηρίξουν τάξεις JMF JavaWorld Διακομιστής Ιστού. Μόλις φορτωθεί και λειτουργεί η μικροεφαρμογή, μπορείτε να πατήσετε το κουμπί Αναπαραγωγή για να ξεκινήσετε την αναπαραγωγή του αρχείου ήχου WAV. Δοκιμάστε να επανατοποθετήσετε την αναπαραγωγή χρησιμοποιώντας τη γραμμή κύλισης και παύση και επανεκκίνηση της αναπαραγωγής χρησιμοποιώντας το κουμπί Παύση / Αναπαραγωγή.

Η υλοποίηση της πλατφόρμας JMF 1.1 Java χρησιμοποιεί όλα τα Java widget για τα στοιχεία ελέγχου της, έτσι τα στοιχεία ελέγχου έχουν την ίδια εμφάνιση από πρόγραμμα περιήγησης σε πρόγραμμα περιήγησης και πλατφόρμα σε πλατφόρμα Παρατηρήστε πώς φαίνεται το applet να λειτουργεί στο JVM του Netscape Communicator στο Solaris 7 και στο JVM της Microsoft στον Internet Explorer στο Win32.

Το κουμπί με την ένδειξη Εγώ παρέχει πληροφορίες για το αρχείο πολυμέσων που παίζει στην εφαρμογή JMF. Κάντε κλικ σε αυτόν τον σύνδεσμο πληροφοριών για να λάβετε λεπτομέρειες σχετικά με το αρχείο WAV που εκτελείται σε αυτήν την ιστοσελίδα.