Programmering

Fremgang på JMF og Java Media APIer

Min første JavaWorld artikkel vei tilbake når var på Java Media Framework (JMF). Etter hvert som de forskjellige medie-APIene har modnet, føler jeg at ting har kommet i full sirkel. Derfor vil jeg vie min finale Medieprogrammering kolonne for å se JMF og den generelle tilstanden til alle Java Media API-ene.

Det har vært noen bemerkelsesverdige endringer i JMF og andre Java Media-teknologier, selskapene som utvikler implementeringer av dem, og deres tilgjengelighet for utviklere. Denne artikkelen oppdaterer materialet fra tidligere artikler etter behov.

En viktig påminnelse: Java Media Framework er et spesifikt API for synkronisering av multimedia-strømmer (filer, nettverksstrømmer og så videre). Det er en av flere av Java Media API-ene, som også inkluderer Java 2D, Java 3D, Java Speech og så videre. Jeg refererer til Java Media Framework som JMF, reserverer begrepet Java Media for hele samlingen av multimedia-API-er.

JMF historie og grunnleggende

Av JMF 1.0, aka Java Media Player API, skrev jeg følgende i april 1997 (se Ressurser):

Java Media Player API, en del av Java Media Framework (JMF), lar Java-programmerere enkelt legge inn lyd og video i applets og applikasjoner. Både statisk og streaming multimedia støttes fra en hvilken som helst gyldig URL. JMF-spillere kan styres av andre spillere, og sørger for synkron avspilling av flere lyd- og videoeksempler.

Denne informasjonen gjelder fortsatt med oppdateringene og tilleggene fra de to siste årene. JMF har imidlertid utviklet nye muligheter og vokst i omfang, spesielt med den kommende 2.0 API-utgivelsen (forventet i andre halvdel av 1999).

JMF-bransjeaktører

La oss først se på bransjeaktørene. Sun, Silicon Graphics (SGI) og Intel designet og spesifiserte den originale JMF 1.0 i midten av 1998. I mellomtiden siden den første versjonen av API, har både SGI og Intel trukket seg fra JMF-spesifikasjonsprosessen. For en stund var det betydelig bekymring i JMF-brukerfellesskapet om at Sun var den eneste leverandøren som støttet JMF. Denne situasjonen var uønsket.

Heldigvis, i slutten av 1998, gikk IBM inn med interesse for JMF. Kort tid etter at IBM ble med i Sun, ble en Java-implementering av 1.0 API utgitt (desember 1998). Denne implementeringen, kjent som JMF 1.1 for Java-plattformer, støtter en begrenset, men betydelig delmengde av innholds- og protokolltyper som støttes av Win32- og Solaris-native JMF 1.1-implementeringer (kjent som ytelsespakker). Tilgjengeligheten av en all-Java JMF 1.1 var en viktig milepæl for JMF, ved at teknologien ble tilgjengelig for enhver Java 1.1-kompatibel eller Java 2-kjøretid. Faktisk er JMF 1.1 Java-implementeringen til og med tilgjengelig i en nettorientert versjon med verktøy som lar utviklere bare inkludere de relevante JMF-klassene i en JAR-fil for nedlasting med JMF-applets. Dette lar en distribuere JMF-baserte applets på en webserver for bruk av en hvilken som helst Java 1.1-kompatibel nettleser. Både Netscape og Microsoft støtter Java 1.1 - og derfor JMF 1.1 for Java - i sine nylige nettleserversjoner av henholdsvis Navigator og Internet Explorer.

IBM hjelper Sun med å kodefinere JMF 2.0 API, som vil inneholde en spesifikasjon og gi en referanseimplementering av neste JMF API: Java Media Capture. La oss håpe IBM vil finne ut hvordan man senere kan rulle JMF-funksjonalitet til noen av sine forretningsorienterte Java-baserte programvareprodukter - en potensielt god ting for lang levetid for JMF-teknologi.

Hva er nytt i JMF 2.0 vs. 1.0?

JMF 1.0 API spesifiserer komponentene som er nødvendige for å håndtere avspilling av synkronisert lyd og video. Se min forrige JMF-artikkel (se Ressurser) for en gjennomgang av funksjonene til JMF 1.0.

JMF 2.0 gir flere viktige tillegg til spesifikasjonen:

  • Lyd- og videoopptak
  • Streaming av lyd og video, og dermed muligheten for å bygge alle Java-streaming-servere i tillegg til klienter
  • Pluggbar kodekstøtte innen spillere

For mer informasjon om JMF 2.0 og dens nye funksjoner, se Java Media Framework Programmererveiledning (se Ressurser), for øyeblikket tilgjengelig i versjon 0.5 tidlig tilgang.

Installasjon av JMF-utviklingsverktøy og kjøretid

Både Silicon Graphics og Intel har fjernet tidligere versjoner av JMF fra sine respektive nettsteder. Du kan imidlertid laste ned de siste referanseimplementeringene (betegnet JMF 1.1, kompatibel med 1.0 API-spesifikasjonen) for Win32-, Solaris- og Java-plattformer fra Sun-siden (se Ressurser).

Merk at dokumentasjonen for all-Java-versjonen nevner spesifikt AIX, noe som indikerer at IBM har testet denne programvaren på AIX Java-kjøretiden. Jeg forventer at fremtidige utgivelser av JMF (2.0 og utover) spesielt støtter IBMs operasjonsmiljøer, enten gjennom en ren Java-implementering eller OS-spesifikke native implementeringer.

Oppdaterte JMF eksempler

Jeg har oppdatert det JMF 1.0 beta-kompatible eksemplet fra min forrige JMF-artikkel for å kjøre i JMF 1.0 API-kompatible miljøer. Du kan laste ned eksempelkoden og prøve den under JMF 1.1-implementeringer ved hjelp av dine egne mediefiler. Appleten skal også kjøre på JMF 2.0-kjøretider når de blir tilgjengelige. (For å laste ned alle filene som er tilknyttet denne artikkelen i zip-format, se Ressurser.)

001 // Kommenter følgende pakkeuttalelse for å kompilere separat. 002 // pakke com.javaworld.media.jmf; 003 004 importere java.applet. *; 005 import java.awt. *; 006 importere java.net. *; 007 importere java.io. *; 008 import javax.media. *; 009010 / ** 011 * JMF11Applet oppdaterer JMFApplet fra april 1997 012 * JavaWorld-artikkelen for JMF 1.1 API-samsvar. Vennligst 013 * referer til artikkelen på:

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

016 * I tillegg har JMF11Applet blitt omarbeidet til 017 * ved å bruke Java 1.1 (og utover) hendelsesmodellen. Denne 018 * -versjonen er utviklet og testet på Java 2 019 * og JMF 1.1 all-Java-implementering, mai 1999. 020 *

021 * Denne appleten kan distribueres til offentlige webservere 022 * ved hjelp av jmf-server.jar som er gitt i JMF 1.1 023 * for nedlasting av webservere. Dette JAR-arkivet inneholder 024 * nødvendige JMF-runtime-klasser for alle Java. JMF11Applet 025 * er distribuert på denne måten for 026 * -kolonnen i juni 1999:

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 ** / 038039 offentlig klasse JMF11Applet utvides Applet implementerer ControllerListener {040 privat URL myURL = null; 041 privat spiller myPlayer = null; 042 privat komponent myVisual = null; 043 private komponenter myControls = null; 044 private Panel visualPanel = null; 045 046 / ** 047 * Initialiser JMF11-applet. Vi legger ut grensesnittet og 048 * oppretter spilleren vår i init (). 049 ** / 050 offentlig ugyldig init () {051 super.init (); 052053 // Spesifiser AWT Layout Manager. 054 setLayout (ny BorderLayout ()); 055 056 // Last inn URL fra websiden JMF11Applet er innebygd i. 057 String asset = getParameter ("ASSET"); 058 059 // Sjekk URL-en og opprett et URL-objekt for å holde den. 060 hvis (asset.equals ("")) {061 // vi ikke har lagt inn et aktivum i appleten. 062} annet {063 prøv {064 myURL = ny URL (getDocumentBase (), ressurs); 065} fangst (MalformedURLException e) {066 // Vi skrev inn en ufullstendig ressurs eller bygde feil URL. 067 // Mer robust applet bør takle dette elegant. 068} 069} 070 prøv {071 // Her er en interessant bit. Manager brukes til å 072 // lage den faktiske spilleren for denne URL-en. Vi 073 // legger til JMF11Applet som en ControllerListener for myPlayer. 074 // Dette lar oss svare på RealizeCompleteEvents. 075 myPlayer = Manager.createPlayer (myURL); 076 myPlayer.addControllerListener (dette); 077} catch (IOException e) {078 // Støtte på noe problem med I / O; exit. 079 System.out.println ("I / O-problem med å prøve å lage spiller ... avsluttende"); 080 System.exit (1); 081} fangst (NoPlayerException e) {082 // Kan ikke returnere en brukbar spiller; exit. 083 System.out.println ("Ingen brukbar spiller returnert ... avsluttende"); 084 System.exit (1); 085} 086} 087 088 / ** 089 * Overstyr standardmetoden for start av applet for å ringe Player 090 * realisere (). Dette vil først gjøre realiseringen, som igjen 091 * utløser de siste bitene av GUI-bygningen i controllerUpdate () 092 * -metoden. Vi starter ikke automatisk avspilling: Brukeren trenger 093 * for å klikke på "spill" -knappen i min applet for å begynne å spille av 094 * medieeksemplet. 095 ** / 096 ugyldig start () {097 myPlayer.realize (); 098} 099 100 101 / ** 102 * Overstyr standardmetoden for stopp av applet for å ringe myPlayer.stop () 103 * og myPlayer.deallocate () slik at vi frigjør ressurser 104 * riktig hvis noen kommer ut av denne siden i nettleseren sin. 105 ** / 106 offentlig ugyldig stopp () {107 myPlayer.stop (); 108 myPlayer.deallocate (); 109} 110 111 / ** 112 * Siden vi må vite når realiseringen er fullført, bruker vi 113 * controllerUpdate () til å håndtere RealizeCompleteEvents. 114 * Når vi mottar RealizeCompleteEvent, layouter vi 115 * og viser videokomponenten og kontrollene i vår 116 * applet GUI. 117 ** / 118 public void controllerUpdate (ControllerEvent event) {119 if (event instanceof RealizeCompleteEvent) {120 //System.out.println("Received RCE ... "); 121 // Nå som vi har en realisert spiller, kan vi få 122 // VisualComponent og ControlPanelComponent og pakke 123 // dem i min applet. 124 myVisual = myPlayer.getVisualComponent (); 125 if (myVisual! = Null) {126 // For å sikre at VisualComponent 127 // ikke endres av BorderLayout, hekker jeg den 128 // i visualPanel ved hjelp av FlowLayout. 129 visualPanel = nytt panel (); 130 visualPanel.setLayout (ny FlowLayout ()); 131 visualPanel.add (myVisual); 132 legg til (visualPanel, BorderLayout.CENTER); 133 //System.out.println("Lagt til VisualComponent ... "); 134} 135 myControls = myPlayer.getControlPanelComponent (); 136 if (myControls! = Null) {137 add (myControls, BorderLayout.SOUTH); 138 //System.out.println("Added controls ... "); 139} 140 // ugyldiggjøre (); 141 validere (); 142} 143 // Ellers konsumerer vi begivenheten. 144} 145}

Jeg har tatt med et enkelt eksempel HTML-dokument, eksempel.html (som du kan prøve i nettleseren din nå ved å klikke her), for å vise deg hvordan du legger inn appleten på dine egne websider. Bare endre mediefilen i RESSURS tag og av går du!

For dette eksemplet brukte jeg nedlasting av JMF 1.1 for webservere (dokumentert på JMF-nettstedet) for å aktivere JMF11Applet for å laste ned automatisk jmf-server.jar, et kodearkiv som inneholder de nødvendige JMF-kjøretidsklassene. Dette gjør at appleten kan kjøres i en hvilken som helst Java 1.1-kompatibel nettleser, uten programvare for sluttbrukeren å installere. (Merk at JMF for webserverversjonen også inneholder et tilpasningsverktøy, JMFCtilpasning, som potensielt vil tillate deg å fjerne enda flere unødvendige klasser fra JMF JAR-filen. Dette verktøyet fungerer for øyeblikket ikke under Java 2, siden det bruker et utdatert pakkenavn for Swing.)

I det spesielle eksemplet innebygd i eksempel.html, laster vi inn en WAV-fil (welcome.wav), finner ut hvilke kontrollkomponenter som skal gjøres tilgjengelige (ingen videokomponenter, siden dette kun er lydfiler) og spiller av multimediefilen. Merk at WAV-filen (600 KB) og JMF-klassene (570 KB) kan ta flere minutter å laste ned til maskinen din, avhengig av tilkoblingshastigheten.

Etter å ha analysert eksempelsiden, bør Java 1.1-kompatible nettlesere laste inn appleten og støtte JMF-klasser automatisk fra JavaWorld Internett server. Når appleten er lastet inn og kjører, kan du trykke på Play-knappen for å starte avspilling av WAV-lydfilen. Prøv å plassere avspillingen på nytt ved å bruke rullefeltet og pause og starte avspillingen på nytt med Pause / Play-knappen.

JMF 1.1 Java-plattformimplementeringen bruker alle Java-widgets for sine kontroller, slik at kontrollene har samme utseende fra nettleser til nettleser og plattform til plattform. Legg merke til hvordan appleten ser ut i Netscape Communicators JVM på Solaris 7 og Microsofts JVM i Internet Explorer på Win32.

Knappen merket Jeg gir informasjon om mediefilen som spilles av i JMF-appleten. Klikk på denne informasjonskoblingen for å få detaljer om WAV-filen som kjører på denne websiden.

$config[zx-auto] not found$config[zx-overlay] not found