JMF用戶界面組件

播放視頻
在前一節中,我們學習了建立一個通過字符界面播放音頻文件的應用程序。JMF中一個最重要的特點就是你不需要爲了配置媒體播放器而去了解媒體文件的格式;一切都內置了。舉一個例子,再我們前面的例子中,需要使用MP3格式的時候,我們不需要讓應用程序爲一個MP3文件建立一個特殊的Player。
如同你將會再本節所見到的,對於視頻文件的操作同樣有效。JMF有所有媒體文件類型接口的詳細資料。
處理視頻媒體與音頻最大的不同就是,我們必須建立一個能播放視頻的顯示屏幕。幸運的是,JMF能處理許多的這些資料。如同再上例一樣我們會建立一個Player對象,並且使用很多的可視組件來直接從JMF對象中創建我們的可視的媒體瀏覽器。
本節中,我們將學習兩個例程序。In thissection, we&aposll walk through the second example application. 請再後面的練習的源代碼分佈中查閱MediaPlayerFrame.java。

關於例子
在本節中,我們將創建一個能顯示和運行本地音頻和視頻媒體的應用程序。作爲練習的一部分,我們將研究JMF內置的一些GUI組件。熟悉AWT和Swing將有助於你理解本例,但這並不是必須的。除非需要直接涉及到JMF的GUI組件,或者我們是不會詳細介紹源代碼的。你可以在源代碼的註釋中找到這裏未涉及的詳細說明。
本例中我們使用的許多概念,類和方法都和第一個例子的類似。建立Player的基本操作大都一樣。最大的不同就是我們需要對Player對象專研更深一點,特別當需要從Player獲取媒體信息的時候。

如何開始
視頻播放器例子被設計得如同音頻播放例子一樣通過命令行來運行,但是本例需要建立在GUI基礎上。如同在上節一樣,我們先通過媒體文件名調用應用。然後,應用程序顯示一個帶有可操作媒體組件的窗體。
在MediaPlayerFrame開始的一行中我們定義了類並擴展自javax.swing.Jframe類。這就是使媒體播放器如同一個在桌面上的單獨窗體的方法。任何客戶機程序創建了本媒體播放對象後都可以通過調用Jframe類中定義的show()方法來顯示。
下面是一個MediaPlayerFrame正在播放MPEG電影的屏幕截圖:

獲取GUI組件
Player界面有一些方法來獲取已選擇可視組件的涉及。在MediaPlayerFrame中,我們使用如下組件:
·player.getVisualComponent()是一個播放所有視頻媒體的可視組件。
· player.getControlPanelComponent() 是一個操作時間軸的可視組件(包括開始,停止,回放),也包含了一些媒體流的有用信息。
· player.getGainControl().getControlComponent() 是操作音量(增加)的可視組件。getGainControl()方法返回一個GainControl實例,可用於改變節目的增加等級。

使用可視化組件
上面的界面方法都返回一個java.awt.Component類的實例。每個實例都是可加載到我們窗體上的可視組件。這些組件都與Player有直接的聯繫,所以在這些組件上的所有可視元素的處理都會產生Player播放媒體後相應的變化。
在我們將這些組件加入到我們的窗體的之前,必須要保證它們不爲空。因爲並不是所有的媒體播放器包括每一種可視組件,我們只需添加相關播放器類型的組件。比如,一般來說一個音頻播放器沒有可視組件,所以getVisualComponent()就要返回空。你不會想在音頻播放器窗體上添加可視組件的。

獲得媒體的特殊控制
一個Player實例也可以通過getControl()和getControls()方法來暴露其控制,getControls()返回一個控制對象集,而getControl()返回一個控制。不同的播放器類型可選擇爲特殊的操作來暴露控制集去指定的媒體類型,或者用於獲取該媒體的傳輸機制。如果你在寫一個只支持某些媒體類型的播放器,你需要依靠某些在Player實例中可用Control對象。
由於我們的播放器是非常抽象的,被設計於播放多種不同媒體類型,我們簡單的爲用戶暴露所有的Control對象。如果找到任何擴展的控制集,我們就可使用getControlComponent()方法來增加相應的可視控件到標籤面板上。通過這個辦法,用戶就可以觀察播放器上的所有組件。以下代碼片斷將所有的控制對象暴露給用戶:

Control[] controls = player.getControls();
for (int i = 0; i< controls.length; i++) {
if (controls[i].getControlComponent() != null) {
tabPane.add(controls[i].getControlComponent());
}
}

爲了使一個真實的應用程序能用Control實例做一些有用的事(除了能顯示可視組件之外),應用程序需要知道該Control的特殊類型,並分配它。此後,應用程序就可使用這些control來控制媒體節目了。例如,如果你知道你經常使用的媒體暴露javax.media.control.QualityControl類型的Control,你能使用QualityControl界面,之後在QualityControl界面上通過調用各種方法來改變性質設定。

使用一個MediaLocator
在我們新的基於GUI的媒體播放器和我們的第一個簡單播放器之間最大的不同就是,我們使用一個MediaLocator對象而不是URL來創建Player實例,如下所示:

public void setMediaLocator(MediaLocator locator) throws IOException,
NoPlayerException, CannotRealizeException {
setPlayer(Manager.createRealizedPlayer(locator));
}

我們將在稍後的章節中討論這個變化的原因。目前,在網絡上資源站點上,關於MediaLocator對象和URL的描述被認爲是非常相似的。事實上,你可以從一個URL創建一個MediaLocator,也可以從MediaLocator獲取到URL。我們的新媒體播放器一個URL中創建一個MediaLocator,並使用該MediaLocator通過文件創建了一個Player。

編譯和運行MediaPlayerFrame
通過在命令提示行輸入javacMediaPlayerFrame.java來編譯例程序。在工作目錄下將創建一個名爲MediaPlayerFrame.class的文件。
在命令提示行中鍵入如下來運行例程序:

java MediaPlayerFrame mediaFile

你需要用你本機上的一個媒體文件來替換掉mediaFile(音頻或者視頻文件都可以)。所有的相對文件名都是相對於當前工作目錄。你會看見一個顯示控制媒體文件的GUI控制集的窗口。欲瞭解JMF支持的音頻和視頻文件列表,在23頁的資源。
如果初始編譯時失敗,請確認JMF的jar文件已經包含在當前的CLASSPATH環境變量中。

MediaPlayerFrame在行動
在本節前你看見的一個視頻播放器正在播放MPEG視頻文件的屏幕截圖。下面的屏幕截圖顯示了一個音頻播放器正在播放一個MP3文件:

要更多的學習本練習中的例子,查看完成的MediaPlayerFrame源代碼。

原文鏈接:http://blog.csdn.net/icecream0

發佈了1 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章