国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用Java多媒體框架實現自播放

2019-11-18 15:44:06
字體:
來源:轉載
供稿:網友

  作為客戶端安裝的媒體播放器,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";
}
}

  另一個令人頭疼的問題是JMF的源代碼(目前從Sun的網站拿走了不過很快就會放上去)表明假如提供的流是Seekable,(一個提供隨機訪問方法seek()的接口) 缺省的播放器只能播放一個QuickTime的數據源。JarEntryDataSource的解決策略是在尋找點在媒介流前面的情況下使用InputStream.skip()。假如尋找點在當前讀取點(被稱為tellPoint因為這個值是由方法Seekable.tell()返回的)的后面,必須關閉InputStream,重開,然后跳到尋找點。它使用一個內部的thoroughSkip()方法來保證我們是真正的結束。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 胶州市| 徐汇区| 宜都市| 深州市| 井研县| 利津县| 舟曲县| 孟村| 肥乡县| 昆明市| 历史| 本溪市| 宁安市| 柘城县| 新巴尔虎右旗| 汤阴县| 元朗区| 高阳县| 台湾省| 佳木斯市| 玛沁县| 陇南市| 互助| 山丹县| 苏州市| 勐海县| 鄂托克前旗| 阿拉善右旗| 曲周县| 双城市| 九台市| 阿瓦提县| 肥乡县| 简阳市| 舟曲县| 凌源市| 酒泉市| 湟中县| 吉木萨尔县| 井研县| 长沙县|