用Java多媒體框架實現自播放
|
作為客戶端安裝的媒體播放器,Java Media Framework并沒有給人很深的印象。它僅僅支持一部分媒體類型,而這些類型只是其他播放系統比如說Windows Media Player和QuickTime支持類型的子集。
但是從內容供應商的觀點來看,故事就變的有趣多了:JMF在所有的java模式下都可以適用,這樣我們在部署媒體的時候客戶端不需要任何媒體播放技術――只需要一個J2SE的運行環境就可以了。舉例來說,工程巨人Robert X. Cringely最近宣布一項計劃: 他們將提供一個被稱為"NerdTV"的純java的MPEG-4 系統,這個系統不需要任何客戶端的預安裝。
更進一步來說,我們還可以利用.jar格式來把解碼器和媒體文件打包成一個文件,以此,從效果上來說創建了一個"自播放電影",與壓縮系統WinZip和StuffIt可以創建自擴展歸檔文件的方式相似。
實現的策略分三步走:
1.使JMF可以播放在.jar文件里的媒體文件。
2.創建一個精簡型的.jar 文件,只包括JMF里必須播放本地媒體文件的部分。
3.把代碼和媒體文件都放進.jar里,創建一個合適的manifest 文件來支持雙擊。
JMF基本放像功能的關鍵在于得到一個可以解碼和播放媒體文件的播放器。一般來說,這個動作通過使用管理器來得到一個合適的數據源,這個數據源在放像模式下同時提供媒體流和關于媒體流的元數據,比如說媒體文件的格式。管理器接著找到一個播放器來處理這個數據源。在兩種情形下,管理器把一系列的包前綴(javax.media,com.ibm.media等等)綁定在反射機制上來尋找合適的類,在某種情形下拋出錯誤,比如說當找到的播放器不能接受提供的數據源。
接下來管理器沒有更多的辦法,通常只是查看URL里的協議和文件擴展名,所以它可以很容易的知道如何處理file&:///Users/cadamson/mymp3stash/some.mp3 ,卻不知道如何處理jar:file&:/Users/cadamson/dev/jmftests/spmovie-old/src/gatsbymovie.jar!/movie/themovie.mov。
為了讓事情變得更簡單,我們來寫一個數據源,或者更確切的說,寫一個牽引式數據源。它的職責是為管理器描速數據源本身。JarEntryDataSource里的方法都很簡單;但是有很多,因為我們提供的PullSourceStream需要使用很多接口的實現。
這種做法看起來有些不妥――類是通過文件的擴展名來返回"內容類型"的。它類似于MIME類型,只是它用句點而不是用斜杠來構建(MIME類型video/mpeg 轉換為video.mpeg,這樣管理器可以找到包com.sun.media.codec.video.mpeg )。下面是簡單的實現:
public String getContentType() { try { URL url = getLocator().getURL(); String urlFile = url.getFile(); if (urlFile.endsWith(".mov")) return "video.quicktime"; else if (urlFile.endsWith(".mpg")) return "video.mpeg"; else if (urlFile.endsWith(".avi")) // Manager needs '_' insted of '-' return "video.x_msvideo"; else return "unknown"; } catch (MalformedURLException murle) { return "unknown"; } } |