Programování

Pokrok v JMF a Java Media API

Můj první JavaWorld článek way-back-when was on the Java Media Framework (JMF). Vzhledem k tomu, že různá mediální rozhraní API dozrála, mám pocit, že se věci dostaly do úplného kruhu. Proto věnuji své finále Programování médií sloupec k revizi JMF a obecnému stavu všech rozhraní Java Media API.

Došlo k několika pozoruhodným změnám v JMF a dalších technologiích Java Media, společnostech vyvíjejících jejich implementace a jejich dostupnosti pro vývojáře. Tento článek podle potřeby aktualizuje materiál z předchozích článků.

Důležitá připomínka: Java Media Framework je specifické rozhraní API pro synchronizaci multimediálních proudů (soubory, síťové proudy atd.). Je to jeden z několika Java Media API, který zahrnuje také Java 2D, Java 3D, Java Speech atd. Java Media Framework označuji jako JMF, vyhrazení termínu Java Media pro celou kolekci multimediálních API.

Historie a základy JMF

Z JMF 1.0, aka Java Media Player API, jsem napsal následující v dubnu 1997 (viz Zdroje):

Rozhraní Java Media Player API, část Java Media Framework (JMF), umožňuje programátorům Java snadno vložit zvuk a video do appletů a aplikací. Statické i streamované multimédia jsou podporovány z jakékoli platné adresy URL. Přehrávače JMF mohou být ovládány jinými přehrávači, což umožňuje synchronní přehrávání více zvukových a obrazových vzorků.

Tyto informace stále platí s aktualizacemi a doplňky posledních dvou let. JMF však vyvinul nové funkce a rozšířil se do rozsahu, zejména s připravovaným vydáním 2.0 API (očekává se ve druhé polovině roku 1999).

Hráči v oboru JMF

Nejprve se podívejme na průmyslové hráče. Sun, Silicon Graphics (SGI) a Intel navrhli a specifikovali původní JMF 1.0 v polovině roku 1998. V mezidobí od počáteční verze API SGI i Intel stáhly z procesu specifikace JMF. V komunitě uživatelů JMF na chvíli existovaly značné obavy, že Sun byl jediným prodejcem podporujícím JMF. Tato situace byla nežádoucí.

Naštěstí na konci roku 1998 vstoupila IBM se zájmem o JMF. Krátce poté, co se IBM připojila k Sunu, byla vydána celojávská implementace 1.0 API (prosinec 1998). Tato implementace, známá jako JMF 1.1 pro platformy Java, podporuje omezenou, ale významnou podmnožinu typů obsahu a protokolů podporovaných implementacemi JMF 1.1, které jsou nativní pro Win32 a Solaris (známé jako výkonnostní balíčky). Dostupnost all-Java JMF 1.1 byla významným milníkem pro JMF, protože tato technologie byla k dispozici pro jakýkoli běhový modul kompatibilní s Java 1.1 nebo Java 2. Ve skutečnosti je implementace JMF 1.1 Java k dispozici dokonce i ve webové verzi s nástroji, které vývojářům umožňují zahrnout pouze příslušné třídy JMF do souboru JAR ke stažení s jejich applety JMF. To umožňuje nasadit applety založené na JMF na webový server pro použití jakýmkoli prohlížečem kompatibilním s Java 1.1. Jak Netscape, tak Microsoft podporují Java 1.1 - a tedy JMF 1.1 pro Javu - ve svých nedávných verzích prohlížečů Navigator a Internet Explorer.

IBM pomáhá Sunu s definováním API JMF 2.0, které bude obsahovat specifikaci a poskytne referenční implementaci dalšího API JMF: Java Media Capture. Doufejme, že IBM přijde na to, jak následně zavést funkčnost JMF do některých svých obchodně orientovaných softwarových produktů založených na Javě - což je potenciálně dobrá věc pro dlouhověkost technologie JMF.

Co je nového v JMF 2.0 vs. 1.0?

Rozhraní JMF 1.0 API určuje komponenty nezbytné pro zpracování přehrávání synchronizovaného zvuku a videa. Přečtěte si můj předchozí článek o JMF (viz Zdroje), kde najdete přehled možností JMF 1.0.

JMF 2.0 přináší několik klíčových doplňků specifikace:

  • Záznam zvuku a videa
  • Streamování zvuku a videa, a tím i možnost vybudování serverů pro streamování všeho Java kromě klientů
  • Podpora připojitelných kodeků v přehrávačích

Další informace o JMF 2.0 a jeho nových funkcích najdete v Příručka programátora Java Media Framework (viz Zdroje), aktuálně k dispozici ve verzi 0.5 předčasný přístup.

Instalace vývojových nástrojů JMF a běhového prostředí

Jak Silicon Graphics, tak Intel odstranily předchozí verze JMF ze svých příslušných webových stránek. Můžete si však stáhnout nejnovější referenční implementace (označené JMF 1.1, kompatibilní se specifikací API 1.0) pro platformy Win32, Solaris a Java ze stránek společnosti Sun (viz Zdroje).

Všimněte si, že dokumentace k verzi pro všechny Java se konkrétně zmiňuje o AIX, což naznačuje, že IBM testuje tento software na svém běhovém prostředí AIX Java. Očekávám, že budoucí vydání JMF (2.0 a novější) budou konkrétně podporovat operační prostředí IBM, ať už prostřednictvím čisté implementace Java nebo nativních implementací specifických pro OS.

Aktualizované příklady JMF

Aktualizoval jsem příklad kompatibilní s JMF 1.0 beta z mého předchozího článku JMF tak, aby běžel v prostředích kompatibilních s JMF 1.0 API. Ukázkový kód si můžete stáhnout a vyzkoušet v rámci implementací JMF 1.1 pomocí vlastních mediálních souborů. Když budou applet k dispozici, měl by také běžet na běhových prostředích JMF 2.0. (Chcete-li stáhnout všechny soubory spojené s tímto článkem ve formátu zip, přečtěte si Zdroje.)

001 // Komentujte následující příkaz balíčku, který chcete sestavit samostatně. 002 // balíček 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. *; 009 010 / ** 011 * JMF11Applet aktualizuje JMFApplet z článku 012 * JavaWorld z dubna 1997 o shodě s JMF 1.1 API. Prosím 013 * viz článek na:

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

016 * Kromě toho byl přepracován JMF11Applet tak, aby 017 * používal model události Java 1.1 (a dále). Tato verze 018 * byla vyvinuta a testována na platformě Java 2 019 * a implementaci JMF 1.1 pro celou Java, květen 1999. 020 *

021 * Tento applet může být nasazen na veřejné webové servery 022 * pomocí souboru jmf-server.jar poskytovaného v JMF 1.1 023 * pro stahování webových serverů. Tento archiv JAR obsahuje 024 * potřebných běhových tříd JMF pro celou Javu. JMF11Applet 025 * byl nasazen tímto způsobem pro sloupec Červen 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 veřejná třída JMF11Applet rozšiřuje Applet implementuje ControllerListener {040 soukromá URL myURL = null; 041 soukromý hráč myPlayer = null; 042 private Component myVisual = null; 043 private Component myControls = null; 044 soukromý panel visualPanel = null; 045 046 / ** 047 * Inicializovat JMF11Applet. Rozložíme rozhraní a 048 * vytvoříme našeho hráče v init (). 049 ** / 050 public void init () {051 super.init (); 052 053 // Určete AWT Layout Manager. 054 setLayout (nový BorderLayout ()); 055 056 // Načíst URL z webové stránky, do které je vložen JMF11Applet. 057 String asset = getParameter ("ASSET"); 058 059 // Zkontrolujte adresu URL a vytvořte objekt URL, který ji udrží. 060 if (asset.equals ("")) {061 // nezadali jsme do appletu žádné dílo. 062} else {063 try {064 myURL = new URL (getDocumentBase (), asset); 065} catch (MalformedURLException e) {066 // Zadali jsme neúplné dílo nebo vytvořili nesprávnou adresu URL. 067 // Robustnější applet by to měl elegantně zvládnout. 068} 069} 070 vyzkoušet {071 // Tady je zajímavý kousek. Správce se používá k vytvoření 072 // skutečného hráče pro tuto adresu URL. Poté 073 // přidáme JMF11Applet jako ControllerListener pro myPlayer. 074 // To nám umožňuje reagovat na RealizeCompleteEvents. 075 myPlayer = Manager.createPlayer (myURL); 076 myPlayer.addControllerListener (this); 077} catch (IOException e) {078 // Došlo k nějakému problému s I / O; výstup. 079 System.out.println ("Problém I / O při pokusu o vytvoření přehrávače ... ukončení"); 080 System.exit (1); 081} catch (NoPlayerException e) {082 // Nelze vrátit použitelného hráče; výstup. 083 System.out.println ("Žádný použitelný hráč se nevrátil ... končí"); 084 System.exit (1); 085} 086} 087 088 / ** 089 * Přepsat výchozí metodu spuštění appletu pro volání hráče 090 * uvědomit (). Nejprve provedete realizaci, která zase 091 * spustí finální bity budování grafického uživatelského rozhraní v metodě controllerUpdate () 092 *. Přehrávání nespouštíme automaticky: Aby uživatel mohl přehrát ukázku média 094 *, musí uživatel kliknout na tlačítko „přehrát“ v našem appletu 093 *. 095 ** / 096 public void start () {097 myPlayer.realize (); 098} 099 100 101 / ** 102 * Přepsat výchozí metodu zastavení appletu pro volání myPlayer.stop () 103 * a myPlayer.deallocate (), abychom správně uvolnili prostředky 104 *, pokud někdo opustí tuto stránku ve svém prohlížeči. 105 ** / 106 public void stop () {107 myPlayer.stop (); 108 myPlayer.deallocate (); 109} 110 111 / ** 112 * Protože musíme vědět, kdy je realizace dokončena, používáme ke zpracování RealizeCompleteEvents 113 * controllerUpdate (). 114 * Když obdržíme RealizeCompleteEvent, rozložíme 115 * a zobrazíme video komponentu a ovládací prvky v našem 116 * appletu GUI. 117 ** / 118 public void controllerUpdate (událost ControllerEvent) {119 if (událost instanceof RealizeCompleteEvent) {120 //System.out.println("Received RCE ... "); 121 // Nyní, když máme Realizovaného hráče, můžeme získat 122 // VisualComponent a ControlPanelComponent a zabalit 123 // do našeho appletu. 124 myVisual = myPlayer.getVisualComponent (); 125 if (myVisual! = Null) {126 // Aby bylo zajištěno, že BorderLayout nezmění velikost VisualComponent 127 //, vnořím jej 128 // do VisualPanel pomocí FlowLayout. 129 visualPanel = nový Panel (); 130 visualPanel.setLayout (nový FlowLayout ()); 131 visualPanel.add (myVisual); 132 add (visualPanel, BorderLayout.CENTER); 133 //System.out.println("Added VisualComponent ... "); 134} 135 myControls = myPlayer.getControlPanelComponent (); 136 if (myControls! = Null) {137 add (myControls, BorderLayout.SOUTH); 138 //System.out.println("Added controls ... "); 139} 140 // invalidate (); 141 validate (); 142} 143 // Jinak událost jednoduše zkonzumujeme. 144} 145}

Zahrnul jsem jednoduchý ukázkový dokument HTML, example.html (který si nyní můžete vyzkoušet ve svém prohlížeči kliknutím sem), abych vám ukázal, jak vložit applet na své vlastní webové stránky. Jednoduše změňte mediální soubor v AKTIVUM tag a můžete jít!

V tomto příkladu jsem použil JMF 1.1 pro stahování webových serverů (dokumentováno na webu JMF) k povolení JMF11Applet automaticky stáhnout jmf-server.jar, archiv kódu obsahující potřebné běhové třídy JMF. To umožňuje appletu spouštět se v libovolném prohlížeči kompatibilním s Java 1.1 bez nutnosti instalace softwaru pro koncového uživatele. (Upozorňujeme, že verze JMF pro webové servery také obsahuje nástroj pro přizpůsobení, JMFCustomizer, což vám potenciálně umožní odstranit ještě více nepotřebných tříd ze souboru JMF JAR. Tento nástroj aktuálně nefunguje v prostředí Java 2, protože používá zastaralý název balíčku pro Swing.)

V konkrétním příkladu vloženém do example.html, načteme soubor WAV (welcome.wav), zjistíme, které příslušné ovládací prvky jsou k dispozici (žádná video složka, protože se jedná o zvukový mediální soubor), a přehrajeme multimediální soubor. Upozorňujeme, že stahování souborů WAV (600 kB) a JMF (570 kB) může v závislosti na rychlosti připojení trvat několik minut.

Po analýze vzorové stránky by prohlížeče kompatibilní s Java 1.1 měly automaticky načíst applet a podporovat třídy JMF z JavaWorld Webový server. Jakmile je applet načten a spuštěn, můžete stisknutím tlačítka Přehrát zahájit přehrávání zvukového souboru WAV. Zkuste přemístit přehrávání pomocí posuvníku a pozastavit a znovu spustit přehrávání pomocí tlačítka Pozastavit / Přehrát.

Implementace platformy JMF 1.1 Java používá pro své ovládací prvky widgety vše-Java, takže ovládací prvky mají stejný vzhled od prohlížeče k prohlížeči a od platformy k platformě. Všimněte si, jak vypadá applet spuštěný v prostředí JVM aplikace Netscape Communicator na systému Solaris 7 a Microsoft JVM v aplikaci Internet Explorer na systému Win32.

Tlačítko označené i poskytuje informace o přehrávání mediálního souboru v appletu JMF. Kliknutím na tento informační odkaz zobrazíte podrobnosti o souboru WAV spuštěném na této webové stránce.

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