电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:51日期:2024-06-23 09:52:24
內容: 翻譯作者:cocoqin原文作者:Chris Adamson 10/09/2002 原文出處:http://www.onjava.com/pub/a/onjava/2002/10/09/jmf.html作為客戶端安裝的媒體播放器,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()方法來保證我們是真正的結束。public long seek (long position) { try { if (position> tellPoint) { thoroughSkip (position - tellPoint); } else { close(); open(); thoroughSkip (position); } return tellPoint; } catch (IOException ioe) { return 0; // bogus... }}使用這個類,管理器可以找到一個可用的播放器來播放.jar里的.mov或者.avi 格式的文件。在我們的例子里TinyPlayer使用ClassLoader.getResource()來在classpath里找到movie/themovie.mov或者movie/themovie.avi。當classpath只包括.jar文件的時候,我們就實現了自播放。準備一個合適的.jar文件的第一步是使用JMF的工具創建一個僅僅包含播放所必須的類的jar包,忽略那些流化,尋找,轉碼和其他任何不是骨架播放器所需要的功能。不幸的是,Sun在純java版本的JMF里沒有包括jmfcustomizer的幫助文件,但是我們可以很容易的描速出定制所需要的一系列頁面。媒體源和媒體接收器: 選擇'媒體文件'和'播放'協議:'文件'媒體格式:'QuickTime (.mov)' 和 'Avi.'解碼器:不論你計劃用什么,最可能的是'A-law,' 'U-law,' 或者音頻用'IMA4' ,視頻用'H263'處理:音頻,我們需要'JavaSound'來支持java1.3或者更高版本,SunAudio來支持Sun 的pre-1.3 JVMs。視頻,'AWT'就夠了。創建的結果是我們得到了一個精簡的.jar文件――從普通1.9 MB的 jmf.jar 到我們定制的小于700K的jar包。假定你已經編譯了兩個com.mac.invalidname.spmovie類,并把他們加到了定制的jar包里:jar uf customized.jar com/mac/invalidname/spmovie/*.classJMF的許可條例要求任何JMF的定制子集里都必須包括他的read-me文件。我已經在目錄misc里提供了這個文件,TinyPlayer可以找到它。jar uf customized.jar misc/為了實現.jar的可雙擊,我們提供了一個manifest文件來告訴Java runtime 在雙擊或者使用-jar命令行參數調用的時候.jar里的哪個類包含可以調用的main()。Manifest還提供僅僅包括jar 自身的一個classpath:Main-Class: com.mac.invalidname.spmovie.TinyPlayerClass-Path: .用以下命令來加入manifest:jar ufm customized.jar manifest-stub.txt現在這個文件已經包含在jar播放電影所需要所有的代碼了。為了將來的使用,把它保存為spmovie-engine.jar或者任何類似的文件。現在引擎已經設置好了,所需要的就只剩下媒體文件。我們可以從JMF 支持類型頁面可以看到,純java版本的JMF只支持有限集合的類型。可能視頻的最好選擇是H.263,它在很寬的比特率范圍里都表現的很好,但是對于很多老機器來說它顯得過于臃腫,你可以通過減小視頻或者保持一個較低的幀數率來解決。音頻沒有這么的約定俗成,但是我想IMA4:1表現的相當不錯。把你的媒體文件通過合適的編碼或者轉碼,拷貝到movie/themovie.mov或者movie/themovie.avi。如果需要你可以重命名.jar文件(我用的是spmovie.jar)然后通過下面的方式加入媒體文件:jar u0f spmovie.jar media/注意是'0'數字零,而不是字母0;表明我們不想壓縮這個目錄,因為媒體文件已經被壓縮過了。我們得到的結果就是自播放電影――一個在雙擊的時候知道該運行那個類,提供所有信號分離,解碼,處理電影所需要的代碼和電影本身。作為示例,這里有個小型的自播放電影,它是我4個月兒子Keagan在玩耍的時候錄制的(使用了FreePlay Music免版稅的音樂)。把這個概念擴展到applet是一件很簡單的事情,這樣我們可以讓媒體文件在所有支持的java的瀏覽器里播放。可能有人會說我們解決錯了問題――是java虛擬機而不是媒體播放器在客戶端提供了支持。但是通過提供'一次創作,到處運行'的媒體文件,我們實現了java的初衷。Chris Adamson是一個亞特蘭大籍的咨詢師,擅長java, Mac OS X,和多媒體開發。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標簽: Java
相關文章:
主站蜘蛛池模板: 板材品牌-中国胶合板行业十大品牌-环保板材-上海声达板材 | 轴流风机-鼓风机-离心风机-散热风扇-罩极电机,生产厂家-首肯电子 | 临海涌泉蜜桔官网|涌泉蜜桔微商批发代理|涌泉蜜桔供应链|涌泉蜜桔一件代发 | 北京办公室装修,办公室设计,写字楼装修-北京金视觉装饰工程公司 北京成考网-北京成人高考网 | 山东臭氧发生器,臭氧发生器厂家-山东瑞华环保设备 | 深圳市简易检测技术有限公司| 400电话_400电话申请_888元包年_400电话办理服务中心_400VIP网 | 灌木树苗-绿化苗木-常绿乔木-价格/批发/基地 - 四川成都途美园林 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 铁素体测量仪/检测仪/铁素体含量测试仪-苏州圣光仪器有限公司 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 低合金板|安阳低合金板|河南低合金板|高强度板|桥梁板_安阳润兴 北京租车牌|京牌指标租赁|小客车指标出租 | 砂尘试验箱_淋雨试验房_冰水冲击试验箱_IPX9K淋雨试验箱_广州岳信试验设备有限公司 | 广东佛电电器有限公司|防雷开关|故障电弧断路器|智能量测断路器 广东西屋电气有限公司-广东西屋电气有限公司 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 电动打包机_气动打包机_钢带捆扎机_废纸打包机_手动捆扎机 | 厌氧反应器,IC厌氧反应器,厌氧三相分离器-山东创博环保科技有限公司 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 亚洲工业智能制造领域专业门户网站 - 亚洲自动化与机器人网 | 高压油管,液压接头,液压附件-烟台市正诚液压附件 | EPK超声波测厚仪,德国EPK测厚仪维修-上海树信仪器仪表有限公司 | 工业淬火油烟净化器,北京油烟净化器厂家,热处理油烟净化器-北京众鑫百科 | 正压密封性测试仪-静态发色仪-导丝头柔软性测试仪-济南恒品机电技术有限公司 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 棕刚玉-白刚玉厂家价格_巩义市东翔净水材料厂 | 会议会展活动拍摄_年会庆典演出跟拍_摄影摄像直播-艾木传媒 | 合肥白癜风医院_合肥治疗白癜风医院_合肥看白癜风医院哪家好_合肥华研白癜风医院 | 泰国试管婴儿_泰国第三代试管婴儿费用|成功率|医院—新生代海外医疗 | 上海恒驭仪器有限公司-实验室平板硫化机-小型平板硫化机-全自动平板硫化机 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 地图标注|微信高德百度地图标注|地图标记-做地图[ZuoMap.com] | 康明斯发电机,上柴柴油发电机,玉柴柴油发电机组_海南重康电力官网 | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | TYPE-C厂家|TYPE-C接口|TYPE-C防水母座|TYPE-C贴片-深圳步步精 | 电销卡_北京电销卡_包月电话卡-豪付网络 | 环氧铁红防锈漆_环氧漆_无溶剂环氧涂料_环氧防腐漆-华川涂料 | 电地暖-电采暖-发热膜-石墨烯电热膜品牌加盟-暖季地暖厂家 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 |