Programmering

Fremskridt med JMF og Java Media API'er

Min første JavaWorld artikel way-back-when var på Java Media Framework (JMF). Da de forskellige medie-API'er er modnet, føler jeg, at tingene er kommet i fuld cirkel. Derfor vil jeg dedikere min endelige Medieprogrammering kolonne til et besøg af JMF og den generelle tilstand for alle Java Media API'er.

Der har været nogle bemærkelsesværdige ændringer i JMF og andre Java Media-teknologier, virksomhederne udvikler implementeringer af dem og deres tilgængelighed for udviklere. Denne artikel opdaterer materialet fra tidligere artikler efter behov.

En vigtig påmindelse: Java Media Framework er et specifikt API til synkronisering af multimediestrømme (filer, netværksstrømme osv.). Det er en af ​​flere af Java Media API'erne, som også inkluderer Java 2D, Java 3D, Java Speech osv. Jeg henviser til Java Media Framework som JMF, forbeholder udtrykket Java Media til hele samlingen af ​​multimedie-API'er.

JMF historie og basics

Af JMF 1.0, også kaldet Java Media Player API, skrev jeg følgende i april 1997 (se Ressourcer):

Java Media Player API, en del af Java Media Framework (JMF), lader Java-programmører nemt integrere lyd og video i applets og applikationer. Både statisk og streaming multimedia understøttes fra enhver gyldig URL. JMF-afspillere kan styres af andre afspillere, hvilket giver synkron afspilning af flere lyd- og videoeksempler.

Disse oplysninger gælder stadig med opdateringer og tilføjelser fra de sidste to år. JMF har dog udviklet nye muligheder og vokset i omfang, især med den kommende 2.0 API-udgivelse (forventet i anden halvdel af 1999).

JMF-industriaktører

Lad os først se på branchens aktører. Sun, Silicon Graphics (SGI) og Intel designede og specificerede den originale JMF 1.0 i midten af ​​1998. I mellemtiden siden den oprindelige version af API'en er både SGI og Intel trukket tilbage fra JMF-specifikationsprocessen. I et stykke tid var der stor bekymring i JMF-brugerfællesskabet om, at Sun var den eneste leverandør, der støttede JMF. Denne situation var uønsket.

Heldigvis gik IBM i slutningen af ​​1998 med interesse for JMF. Kort efter IBM sluttede sig til Sun blev en all-Java implementering af 1.0 API frigivet (december 1998). Denne implementering, kendt som JMF 1.1 til Java-platforme, understøtter en begrænset, men signifikant delmængde af de indholds- og protokoltyper, der understøttes af Win32- og Solaris-native JMF 1.1-implementeringer (kendt som præstationspakker). Tilgængeligheden af ​​en all-Java JMF 1.1 var en vigtig milepæl for JMF, idet teknologien blev tilgængelig for enhver Java 1.1-kompatibel eller Java 2 runtime. Faktisk er JMF 1.1 Java-implementeringen endda tilgængelig i en weborienteret version med værktøjer, der tillader udviklere kun at inkludere de relevante JMF-klasser i en JAR-fil til download med deres JMF-applets. Dette giver en mulighed for at distribuere JMF-baserede applets på en webserver til brug af enhver Java 1.1-kompatibel browser. Både Netscape og Microsoft understøtter Java 1.1 - og derfor JMF 1.1 til Java - i deres seneste browserudgivelser af henholdsvis Navigator og Internet Explorer.

IBM hjælper Sun med at kodefinere JMF 2.0 API, som inkluderer en specifikation og giver en referenceimplementering af den næste JMF API: Java Media Capture. Lad os håbe IBM vil finde ud af, hvordan man efterfølgende ruller JMF-funktionalitet ind i nogle af sine forretningsorienterede Java-baserede softwareprodukter - en potentielt god ting for lang levetid for JMF-teknologi.

Hvad er nyt i JMF 2.0 vs. 1.0?

JMF 1.0 API specificerer de komponenter, der er nødvendige for at håndtere afspilning af synkroniseret lyd og video. Se min tidligere JMF-artikel (se Ressourcer) for en gennemgang af funktionerne i JMF 1.0.

JMF 2.0 tilføjer flere vigtige tilføjelser til spec:

  • Optagelse af lyd og video
  • Streaming af lyd og video og dermed muligheden for at opbygge alle Java-streaming-servere ud over klienter
  • Pluggbar codec-understøttelse inden for spillere

For mere information om JMF 2.0 og dens nye funktioner henvises til Java Media Framework Programmeringsvejledning (se Ressourcer), i øjeblikket tilgængelig i version 0.5 tidlig adgang.

Installation af JMF-udviklingsværktøjer og runtime

Både Silicon Graphics og Intel har fjernet tidligere versioner af JMF fra deres respektive websteder. Du kan dog downloade de nyeste referenceimplementeringer (betegnet JMF 1.1, kompatibel med 1.0 API-specifikationen) til Win32-, Solaris- og Java-platforme fra Sun-webstedet (se Ressourcer).

Bemærk, at dokumentationen til all-Java-versionen specifikt nævner AIX, hvilket indikerer, at IBM har testet denne software på AIX Java-runtime. Jeg forventer, at fremtidige udgivelser af JMF (2.0 og derover) specifikt understøtter IBM-operativmiljøer, hvad enten det er gennem en ren Java-implementering eller OS-specifikke native-implementeringer.

Opdaterede JMF eksempler

Jeg har opdateret det JMF 1.0 beta-kompatible eksempel fra min tidligere JMF-artikel til at køre i JMF 1.0 API-kompatible miljøer. Du kan downloade eksempelkoden og prøve den under JMF 1.1-implementeringer ved hjælp af dine egne mediefiler. Applet'en skal også køre på JMF 2.0-driftstider, når de bliver tilgængelige. (Se Ressourcer for at downloade alle de filer, der er knyttet til denne artikel i zip-format.)

001 // Kommenter følgende pakkeerklæring for at kompilere separat. 002 // pakke com.javaworld.media.jmf; 003 004 import java.applet. *; 005 import java.awt. *; 006 import java.net. *; 007 import java.io. *; 008 import javax.media. *; 009010 / ** 011 * JMF11Applet opdaterer JMFApplet fra april 1997 012 * JavaWorld-artiklen til JMF 1.1 API-overholdelse. Venligst 013 * henvises til artiklen på:

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

016 * Derudover er JMF11Applet blevet omarbejdet til 017 * ved hjælp af Java 1.1 (og videre) begivenhedsmodel. Denne 018 * version er udviklet og testet på Java 2 019 * og JMF 1.1 all-Java implementering, maj 1999. 020 *

021 * Denne applet kan distribueres til offentlige webservere 022 * ved hjælp af jmf-server.jar, der findes i JMF 1.1 023 * til download af webservere. Dette JAR-arkiv indeholder 024 * de nødvendige JMF runtimeklasser for alle Java. JMF11Applet 025 * er blevet implementeret på denne måde i kolonnen 026 * fra juni 1999:

027 * //www.javaworld.com/jw-06-1999/jw-06-media.html 028 * 029 * @forfatter 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 ** / 038039 offentlig klasse JMF11Applet udvides Applet implementerer ControllerListener {040 privat URL myURL = null; 041 privat spiller myPlayer = null; 042 privat komponent myVisual = null; 043 privat komponent myControls = null; 044 privat Panel visualPanel = null; 045 046 / ** 047 * Initialiser JMF11Applet. Vi lægger grænsefladen ud og 048 * opretter vores spiller i init (). 049 ** / 050 offentlig ugyldig init () {051 super.init (); 052053 // Angiv AWT Layout Manager. 054 setLayout (ny BorderLayout ()); 055 056 // Indlæs URL fra websiden JMF11Applet er indlejret i. 057 String asset = getParameter ("ASSET"); 058 059 // Kontroller URL'en, og opret et URL-objekt for at holde den. 060 hvis (asset.equals ("")) {061 // vi ikke har indtastet et aktiv i appleten. 062} ellers {063 prøv {064 myURL = ny URL (getDocumentBase (), aktiv); 065} fangst (MalformedURLException e) {066 // Vi indtastede et ufuldstændigt aktiv eller byggede forkert URL. 067 // Mere robust applet skal håndtere dette yndefuldt. 068} 069} 070 prøv {071 // Her er en interessant smule. Manager bruges til at 072 // oprette den aktuelle afspiller til denne URL. Derefter 073 // tilføjer JMF11Applet som en ControllerListener til myPlayer. 074 // Dette giver os mulighed for at reagere på RealizeCompleteEvents. 075 myPlayer = Manager.createPlayer (myURL); 076 myPlayer.addControllerListener (dette); 077} catch (IOException e) {078 // Stødte på et eller andet problem med I / O; Afslut. 079 System.out.println ("I / O-problem, der forsøger at oprette afspiller ... afslutter"); 080 System.exit (1); 081} fangst (NoPlayerException e) {082 // Kan ikke returnere en anvendelig spiller; Afslut. 083 System.out.println ("Ingen brugbar spiller returneret ... spændende"); 084 System.exit (1); 085} 086} 087 088 / ** 089 * Tilsidesæt standard-applet-startmetoden for at ringe til Player's 090 * realise (). Dette vil først udføre realiseringen, som igen 091 * udløser de sidste bit af GUI-bygningen i controllerUpdate () 092 * -metoden. Vi starter ikke automatisk afspilning: Brugeren har brug for 093 * for at klikke på "play" -knappen i vores applet for at begynde at afspille 094 * -medieeksemplet. 095 ** / 096 offentlig ugyldig start () {097 myPlayer.realize (); 098} 099 100 101 / ** 102 * Tilsidesæt standard-applet-stopmetoden for at ringe til myPlayer.stop () 103 * og myPlayer.deallocate (), så vi frigør ressourcer ordentligt 104 *, hvis nogen forlader denne side i deres browser. 105 ** / 106 offentligt ugyldigt stop () {107 myPlayer.stop (); 108 myPlayer.deallocate (); 109} 110 111 / ** 112 * Da vi skal vide, hvornår realisationen er færdig, bruger vi 113 * controllerUpdate () til at håndtere RealizeCompleteEvents. 114 * Når vi modtager RealizeCompleteEvent, layouter vi 115 * og viser videokomponenten og kontrollerne i vores 116 * applet GUI. 117 ** / 118 public void controllerUpdate (ControllerEvent event) {119 if (event instanceof RealizeCompleteEvent) {120 //System.out.println("Received RCE ... "); 121 // Nu hvor vi har en realiseret afspiller, kan vi hente 122 // VisualComponent og ControlPanelComponent og pakke 123 // dem i vores applet. 124 myVisual = myPlayer.getVisualComponent (); 125 if (myVisual! = Null) {126 // For at sikre, at VisualComponent 127 // ikke ændres af BorderLayout, indlejrer jeg det 128 // i visualPanel ved hjælp af FlowLayout. 129 visualPanel = nyt panel (); 130 visualPanel.setLayout (ny FlowLayout ()); 131 visualPanel.add (myVisual); 132 tilføj (visualPanel, BorderLayout.CENTER); 133 //System.out.println("Tilføjet VisualComponent ... "); 134} 135 myControls = myPlayer.getControlPanelComponent (); 136 if (myControls! = Null) {137 add (myControls, BorderLayout.SOUTH); 138 //System.out.println("Tilføjede kontroller ... "); 139} 140 // ugyldiggør (); 141 validere (); 142} 143 // Ellers spiser vi begivenheden. 144} 145}

Jeg har medtaget et simpelt HTML-eksempel, eksempel.html (som du kan prøve i din browser lige nu ved at klikke her) for at vise dig, hvordan du integrerer appleten i dine egne websider. Du skal blot ændre mediefilen i AKTIV tag og afsted!

I dette eksempel brugte jeg JMF 1.1 til download af webservere (dokumenteret på JMF-webstedet) for at aktivere JMF11Applet for automatisk at downloade jmf-server.jar, et kodearkiv, der indeholder de nødvendige JMF-runtime-klasser. Dette gør det muligt for appleten at køre i enhver Java 1.1-kompatibel browser uden software til slutbrugeren at installere. (Bemærk, at JMF til webserverversionen også indeholder et tilpasningsværktøj, JMFCtilpasning, der muligvis giver dig mulighed for at fjerne endnu flere unødvendige klasser fra JMF JAR-filen. Dette værktøj fungerer i øjeblikket ikke under Java 2, da det bruger et forældet pakkenavn til Swing.)

I det særlige eksempel indlejret i eksempel.html, vi indlæser en WAV-fil (welcome.wav), fastslår de relevante kontrolkomponenter, der skal stilles til rådighed (ingen videokomponent, da dette er en mediefil, der kun er lyd) og afspiller multimediefilen. Bemærk, at WAV-filen (600 KB) og JMF-klasser (570 KB) kan tage flere minutter at downloade til din maskine afhængigt af din forbindelseshastighed.

Efter parsing af eksempelsiden skal Java 1.1-kompatible browsere indlæse appleten og understøtte JMF-klasser automatisk fra JavaWorld Webserver. Når applet er indlæst og kører, kan du trykke på knappen Play for at starte afspilning af WAV-lydfilen. Prøv at placere afspilningen igen ved hjælp af rullepanelet, og pause og genstarte afspilningen ved hjælp af knappen Pause / Afspil.

JMF 1.1 Java-platformimplementeringen bruger alle Java-widgets til sine kontroller, så kontrollerne har det samme udseende fra browser til browser og platform til platform. Læg mærke til, hvordan appleten kører i Netscape Communicators JVM på Solaris 7 og Microsofts JVM i Internet Explorer på Win32.

Knappen mærket jeg giver information om mediefilen, der afspilles i JMF-appleten. Klik på dette informationslink for at få detaljer om den WAV-fil, der kører på denne webside.