- 論壇徽章:
- 0
|
第一節(jié). 關(guān)于此指南
此指南包含的內(nèi)容?
Java媒體架構(gòu)(JMF)是一個令人激動的通用的API,它允許Java開發(fā)者用許多不同的方法處理媒體。本指南主要通過使用工作的例子提供一個
JMF的一些主要的特征的概述。閱讀完本指南后,你將會明白JMF體系結(jié)構(gòu)中的主要播放功能。你同樣能正確的使用JMF,使用現(xiàn)存的例子和可為更多特殊功
能擴(kuò)展的源代碼。
本指南包含著以下主題:
· 下載和安裝JMF
· 主要的JMF類以及它們在JMF體系結(jié)構(gòu)中的應(yīng)用
· 播放本地的媒體文件
· 為媒體的存取和操作制作以和圖形用戶界面(GUI)
· 通過網(wǎng)絡(luò)傳播媒體
· 通過網(wǎng)絡(luò)接收媒體
幾乎所有的媒體類型的操作和處理都可以通過JMF來實現(xiàn)。全面的討論JMF所提供的所有特征已經(jīng)超過了本指南的范圍,我們將使用三個簡單的媒體應(yīng)用程序來學(xué)習(xí)此框架的構(gòu)建模塊。通過這個方法,本指南將為你未來學(xué)習(xí)和實施更多特殊的應(yīng)用提供準(zhǔn)備。
我應(yīng)該使用此指南嗎?
本指南會帶你學(xué)習(xí)使用JMF工作的基礎(chǔ)。為完成這些,我們會創(chuàng)建三個的獨(dú)立工作的例程序。每個例子都會建立前一個例子的基礎(chǔ)上,顯示JMF功能性的不同方面。
在本指南中的例子假定你曾經(jīng)使用過并且已經(jīng)熟悉了Java程序語言。除了Java核心和JMF的類之外,我們會使用一些Java
AWT和Swing類(用于創(chuàng)建GUI),也會有一些Java網(wǎng)絡(luò)類(用于在網(wǎng)絡(luò)中傳輸媒體)。對GUI和網(wǎng)絡(luò)類一些熟悉有助于你更快的明白觀點(diǎn)和這里的
例子,但并非是閱讀本指南必須的。
我們將學(xué)習(xí)的例程序如下
· 一個簡單的音頻播放器(JMF的HelloWorld應(yīng)用):這個字符界面的播放器通過在命令行中簡單的輸入媒體文件的名字就可以播放大多數(shù)的音頻類型。此音頻播放器的演示大體上顯示了JMF的特有的類。
· 一個圖形界面的媒體播放器:我們將使用JMF內(nèi)置的接口組件來建立圖形界面,所以在此練習(xí)中必須有一些圖形界面的編程經(jīng)驗。這個媒體閱覽器演示使用了一些Java AWT和Swing類來為用戶顯示圖形組件。
· 一個媒體廣播應(yīng)用:此應(yīng)用程序允許一個本地媒體文件通過網(wǎng)絡(luò)傳播。此程序能靈活的使媒體只傳輸?shù)街付ǖ木W(wǎng)絡(luò)節(jié)點(diǎn),或者傳輸?shù)揭粋子網(wǎng)絡(luò)中的所有節(jié)點(diǎn)。此演示使用了一些Java的網(wǎng)絡(luò)APIs來在網(wǎng)絡(luò)中傳輸媒體。
作為第三個練習(xí)的一部分,我們將修改圖形界面的播放器,讓其能接收并且播放媒體。
跳至23頁觀看Resources,文章,指南,和其他參考書目的列表,這會幫助你學(xué)習(xí)到更到關(guān)于此指南包括的主題。
安裝需求
要運(yùn)行此指南中的例程序,你需要如下的工具和組件:
· Java 2 平臺,標(biāo)準(zhǔn)版,編譯和運(yùn)行演示程序
· Java媒體框架,版本2.1.1a或者更高
· 一塊已經(jīng)安裝并且配置號的適當(dāng)?shù)穆暱?
· 一臺或者多臺測試機(jī)器
· 演示的源代碼文件在mediaplayer.jar中
最后的一個演示應(yīng)用顯示了JMF在網(wǎng)絡(luò)中的應(yīng)用。如果需要,此演示能運(yùn)行在一個獨(dú)立的機(jī)器上,使用此機(jī)器即是傳輸方也是接收方。可是要觀察到在網(wǎng)絡(luò)中使用JMF的所有功能,你仍然需要至少兩臺聯(lián)網(wǎng)的機(jī)器。
在23頁中的Resources可下載Java 2平臺,完整的源代碼文件,以及其他一些完成本指南所需要的工具。
下載安裝文件
將JMF安裝到你的計算機(jī)中的第一步是在JMF的主頁中下載安裝文件,它同樣包括了JMF源代碼和API文檔的鏈接。23頁的Resources中有下載JMF的鏈接。
目前,JMF有Windows, Solaris,
Linux等版本,以及可運(yùn)行在任何裝有虛擬機(jī)的計算機(jī)上一個純Java版本。為了增加性能,你需要下載一個與你操作系統(tǒng)所適應(yīng)的版本。任何在一個操作系
統(tǒng)JMF版本下書寫和編譯的代碼都可以方便的移植到另外的操作系統(tǒng)上。例如,如果你下載了一個Solaris版本的JMF并且編譯了一個類,這些類就可以
在Linux上使用,不會有任何問題。
作為選擇,你可以選擇下載純Java版本,或者跨平臺版本的JMF。這些版本沒有使用操作系統(tǒng)特有的庫文件。如果沒有合適的JMF版本適合的操作系統(tǒng),那么跨平臺版本就是一個不錯的選擇。
安裝JMF
下載完JMF安裝程序后,雙擊安裝程序的圖標(biāo)。
大部分安裝程序都會有個選項,安裝本地庫到系統(tǒng)目錄中;例如,Windows版本安裝程序會有一個選項“Move DLLs to Windows/System directory.”。最好將此選項選中,因為它能確保這些操作系統(tǒng)的庫文件能正確的安裝
在安裝的過程中,你還需要選擇項目來更新系統(tǒng)的CLASSPATH和PATH變量。如果這些選項被關(guān)閉,那么在你編譯和運(yùn)行本指南的例程序的時候就需要在classpath中引入JMF的jar文件。
第二節(jié). 一個簡單的音頻播放器
瀏覽
在本節(jié)中,我們將進(jìn)行創(chuàng)建一個簡單的音頻播放器的第一個練習(xí)。本例將介紹Manager類和Player接口,中兩個都是建立大多數(shù)基于JMF應(yīng)用的重要部分。
本例的功能目標(biāo)是在字符界面下播放本地的音頻文件。我們將學(xué)習(xí)此源代碼,并了解每一行所做的任務(wù)。完成本節(jié)后,你將會有一個基于JMF的可播放包括MP3, WAV, AU等多種音頻文件的演示程序。
在本練習(xí)后的源代碼分類種可查詢文件SimpleAudioPlayer.java。
引入必要的類
SimpleAudioPlayer類中包括了一些調(diào)用,在其前幾行中需要引入所有必要的類:
import javax.media.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.MalformedURLException;
The javax.media包是由JMF定義的多個包之一。javax.media是一個核心包,包括了定義Manager類和Player接口等。本節(jié)中,我們主要學(xué)習(xí)Manager類和Player接口,其余的javax.media類放在后面的章節(jié)中。
除了引入javax.media聲明外,以上的代碼片斷引入了一些創(chuàng)建媒體播放器的輸入的聲明。
Player接口
在下面的代碼片斷中,創(chuàng)建一個公共類SimpleAudioPlayer并舉例定義一個Player變量:
public class SimpleAudioPlayer {private Player audioPlayer = null;
術(shù)語Player聽起來由點(diǎn)熟悉,因為它是建立在我們公用的音頻或者視頻播放器的基礎(chǔ)上的。事實上,這個接口的例子就像是當(dāng)作它們的真實的副本。
Players揭示了一個實體上的媒體播放器(如立體音箱系統(tǒng)或者VCR)涉及到功能上的方法。例如,一個JMF媒體播放器可以開始和結(jié)束一個媒體流。在
本節(jié)種,我們將使用Player的開始和結(jié)束功能。
在一個文件上創(chuàng)建一個Player
使用JMF獲得一個特定媒體文件的Player實例非常簡單。Manager類在JMF中如同一個工廠制作許多的特殊接口類型,包括Player接口。因此,Manager類的責(zé)任就是創(chuàng)建Player實例,如下例:
public SimpleAudioPlayer(URL url) throws
IOException,NoPlayerException,CannotRealizeException {audioPlayer =
Manager.createRealizedPlayer(url);}public SimpleAudioPlayer(File file)
throws IOException,NoPlayerException,CannotRealizeException
{this(file.toURL());}
如果你看完本節(jié)的代碼,你可以注意到Manager類包含了創(chuàng)建一個Player實例的其他方法。我們會研究其中的一些,如在后面的章節(jié)中的DataSource或者M(jìn)ediaLocator的實例化。
Player的狀態(tài)
JMF定義了大量的一個Player實例可能存在的不同狀態(tài)。如下:
· Prefetched
· Prefetching
· Realized
· Realizing
· Started
· Unrealized
使用這些狀態(tài)
因為使用媒體常常是資源非常密集的,由JMF對象揭示的許多方法都是不閉塞的,允許一系列事件監(jiān)聽的狀態(tài)改變的異步通知。例如,一個Player在它
可以啟動之前,必須經(jīng)過Prefetched和Realized狀態(tài)。由于這些狀態(tài)的改變都需要一些時間來完成,JMF媒體應(yīng)用可以分配一個線程來初始化
創(chuàng)建Player實例,然后再繼續(xù)其他的操作。當(dāng)Player準(zhǔn)備就緒的時候,它會通知應(yīng)用程序其狀態(tài)已經(jīng)改變。
在一個如同我們的這樣簡單的程序中,多功能性的類型并不是很重要。處于這個原因,Manager類也提供了一些創(chuàng)建Realized
player的有用方法。調(diào)用一個createRealizedPlayer()方法來阻塞調(diào)用線程,直到player達(dá)到Realized狀態(tài)。為了調(diào)
用一個無阻塞的創(chuàng)建player的方法,我們在Manager類中使用了一個createPlayer()方法。下面的一行代碼中創(chuàng)建了一個我們需要在例
程序中使用的
Realized player:audioPlayer = Manager.createRealizedPlayer(url);
啟動和停止Player
設(shè)定一個Player實例的啟動或是停止就如同調(diào)用Player的一個簡單的認(rèn)證方法,如下所示:
public void play() {audioPlayer.start();}public void stop() {audioPlayer.stop();audioPlayer.close();}
調(diào)用SimpleAudioPlayer類中的play()方法來實現(xiàn)調(diào)用Player實例的start()方法。調(diào)用此方法后,你能聽到本地的喇叭的聲音文件。同樣的,stop()方法使player停止并且關(guān)閉掉Player對象。
對于讀取和或者播放本地媒體文件來說,關(guān)閉Player實例釋放所有資源是一個有用的方法。因為這是一個簡單的例子,關(guān)閉Player是終止一個會話
可接受的方法。但是在實際的應(yīng)用中,你需要小心的確認(rèn)在除掉Player之前必須要關(guān)閉掉。一但你已經(jīng)關(guān)閉掉player,在再次播放一個媒體之前你必須
要創(chuàng)建一個新的Player實例
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u3/110548/showart_2152215.html |
|