




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、javatm media framework api guideno.3 september 11 , 2000 presenting time-based media with jmfcontrolling a player creating a player displaying media interface components setting the playback rate setting the start position preparing to start starting and stopping the presentation releasing player re
2、sources querying a player getting the playback rate getting the media time getting the time-base time getting the duration of the media stream responding to media events implementing the controllerlistener interface using controlleradapter synchronizing multiple media streams using a player to synch
3、ronize controllers synchronizing players directly example: playing an mpeg movie in an applet overview of playerapplet initializing the applet controlling the player responding to media events presenting media with the mediaplayer bean presenting rtp media streams listening for rtp format changes pr
4、esenting time-based media with jmf以 jmf呈現以 time-base 為主的 media 像是 audio 或 video ,我們可以使用playback 去控制媒體,或是讓使用者用控制面板去控制錄放功能。如果有多個 media streams ,要撥放每一個,都需要用單獨的player 去撥放;若要同步撥放它們,需要使用一個player物件去控制其他的 operation 。processor 是種特殊裝置的 player ,它可以去處理、 控制展示前的媒體資料, 不論是使用基本的或較高階的player都需要用到一些 methods 去管理錄放裝置,med
5、iaplayer bean是可以提供一個簡單的方法在我們在applet 或 applictation實現 media player ,當選擇不同的串流媒體時,mediaplayer bean會自動產生一個新的 player 。controlling a player撥放 media stream ,我們需要先建構一個plyaer ,安裝並且準備執行。creating a player我們可以透過 media manager間接地去建構一個player ,首先取得 player 的元件,並且將它們加至applet 或 application上。如果你需要建立一個新的player , 你可以從 m
6、anager去呼叫 createplayer或 createprocessor 。 manager使用 media url或 medialocator 去具體的建立一個player ,使用 url必須要安裝 urlstreamhandler才行, medialocator 則沒有限制。blocking until a player is realized在 realized 狀態下, player 可以呼叫許多 methods,當我們呼叫createrealizedplayer去建立一個 player 時,我們可以保證player 是在realized 狀態下;這個 method提供一個間單的
7、步驟去建立player 。當這個method被呼叫,它會被 blocks 住直到 player完成 realized 。同樣地,manager也提供了 createrealizeprocessor方法來建構一個 realized processor。using a processormodel to create a processor processor 只能使用 processor model ,它定義了 processor 輸入與輸出條件,用 processormodel 建立 processor 時,我們需要呼叫manager.createrealizedprocessor metho
8、d(example3-1) 去建立一個 realized processor ,可以產生一個 44.1khz 16-bit的 ima4編碼立體聲音軌。example 3-1: constructing a processor with a processormodel.audioformat afs = new audioformat1; afs0 = new audioformat(ima4, 44100, 16, 2); manager.createrealizedprocessor(new processormodel(afs, null); 這個例子並沒有說明資料的來源(url),但是
9、可以利用擷取設備去擷取聲音或影像經過處裡編成 ima4的格式。需注意的是, 當我們在 porcessormodel 去建立一個 realized processor時,我們將不能夠透過processor objects trackcontrols去詳述 processing options(詳細資料在 p.71 )。displaying media interface components 一般 player有兩種使用者介面元件: visual component 、control-panel component,有些會多加 volume controls、download-progress
10、bars。displaying a visual component media 撥放都會有一個視覺元件,甚至有些聲音也會有視覺元件,像是波器或是活動字幕。為了顯示視覺元件,我們可以:1. 呼叫 getvisualcomponent 取得元件2. 將原件加入到 applet 或 application視窗你可以透過 visualcomponent 存取所有 player 物件的屬性、像是x、y 軸,而player components的 layout是透過 awt layout 做管理。displaying a control panel component player 通常有一個控制面板供
11、使用者使用,像撥放、停止、暫停?每一個 player 提供一個內定的 control panel。為了顯示一個內定的control panel ,我們可以:1. 呼叫 getcontrolpanelcomponent取得元件2. 將傳回元件加到展示視窗使用者也可以自訂 gui控制元件,如果將制定元件註冊像controllerlisteners,也可以在 player 更換的時更新它們。displaying a gain-control componentplayer 可以 implement gaincontrol interface來得到聲音的調節裝置。gaincontrol提供一個可以調整
12、聲音的methods,像是 setlevel和 setmute。為了顯示 gaincontrolcomponent ,我們可以:1. 從 player 取得 gaincontrol須呼叫 getgaincontrol ,如果傳回 null表示沒有支援 gaincontrol interface 2. 從傳回的 gaincontrol中呼叫 getcontrolcontrol 3. 將傳回的元件加入視窗中須注意: getcontrol不能傳回 player objects gaincontrol,只能呼叫getgaincontrol來 access gaincontrol。displaying
13、custom control components許多 player有其他附加的功能,例如亮度、對比,你可以呼叫getcontrolsmethod找出 player 支援哪些自訂元件。example 3-2: 使用 getcontrols 找出支援哪些控制.control controls = player.getcontrols(); for (int i = 0; i controls.length; i+) if (controlsi instanceof cachingcontrol) cachingcontrol = (cachingcontrol) controlsi; displ
14、aying a download-progress componentcachingcontrol介面是 player 的一個特殊的型態,可以記載下載的進度,cachingcontrol提供一個內建的 progress-bar ,這個 progress-barr會在下載進行時自動更新,在applet 內為了使用這個功能,我們必須:1. implement controllerlistener interface並且在 controllerupdate中去 listen cachingcontrolevents2. 第一次接收 cachingcontrolevents a. 在事件中呼叫 get
15、cachingcontrol取得 caching control b. 在 cachingcontrol中呼叫 getprogressbar取得內定的projress-bar元件c.加入元件至 applet 中3. 在每個時間中必須去接收cachingcontrolevent用來 check 是否下載完成,當 getcontrentprogress傳回來的值等於 getcontentlength ,則移除 progress-bar 如果我們要 implement 自己的 progress-bar component,我們必須隨時listen cachingcontrolevent和 updat
16、e download progress。setting the playback rateplayer objects rate 決定了 media time 如何改變,它著重於time-base time ;它定義在每一個 base-time time 中 media time 前進了多少單位, 例如,當 rate設定為 2.0 時表示 player 撥放時將會比 time-based 快兩倍的速度撥放。理論上, player objects rate可以設定為 any real number ,negative rates表示 player中的 media 是倒轉的。對於設定比例,我們可以
17、呼叫setreat ,當setreat 被呼叫, method 會傳回一個 actually set 的 rate 。如果沒有改變將會將 rate 內定為 1.0 。setting the start position設定 player物件的媒體時間相當於設定讀取媒體的時點,媒體資料來源若像是一個檔案, 媒體時間是有限制的, 最大媒體時間就是媒體流結束的地方,我們可以呼叫 setmediatime 可以設定想要的時間。frame positioning有些 player允許尋找特定影像 frame,讓你可以容易的設定media 起始點。為了要設定 frame 的位置,我們可以呼叫framepo
18、sitioningcontrol來尋找method,當你找到 frame,就可以設定 player media time的值與 frame 開始的值相一致,會發出mediatimesetevent。有些 player可以在媒體時間與框架位址間轉換,你可以使用framepositioningcontrol mapframetotime與 maptimetoframe 兩種 methods存取資料。preparing to start有些媒體 player 並不會立即開始,因為在開始前要視某些硬體與軟體連接情況而定,例如沒有啟動過的player 需要在記憶體中配置媒體資料緩衝區,如果是網路裝置上的
19、媒體,則需要先建立網路連線。realizing and prefetching a playerjmf 流程中的兩個階段: realizing 與 prefetching。在 player 運轉開始後可以執行 controllerlistener介面去控制。可以呼叫 realize讓 player進入 realizing狀態以及開始 realization程序、也可以呼叫 prefetch讓 player進入 prefetching程序。 realize 與 prefetch methods是非同步的且會自動回傳的。當player 完成運作會丟出realizecompleteevent 或 p
20、refetchcompleteevent表示 player 完成這些運作。player 可以透過 setmediatime 設定媒體時間, 會傳回 realize 狀態並且增加前置時間。記住 prefetched狀態會佔住系統資源,因為像音效卡一次只能提供一個程式使用,prefetched 狀態會阻礙到其他player 的撥放。determining the start latency可以呼叫 getstartlatency決定開始需要多少時間, 將會傳回一個最大可能的開始前置時間, getstartlatenc也可能傳回 latency_unknown 。開始的前置時間是由 getstart
21、latency依 player objects 目前狀態的不同而定。starting and stopping the presentationclock 和 player interface定義著 starting和 stopping 的 method。starting the presentationstart mrthod告訴 player 立即開始展示,如果有需要會執行realize 與prefetch運作,如果在 started player 中 start被呼叫後,將丟出 startevent。clock 定義了 syncstart method,可以用在 synchronizat
22、ion(同步) 上。在 media stream 中要 start a player,必須:1.呼叫 setmediatime. 設定想要的開始點2.呼叫 player 中的 start stopping the presentation有四種情況將被停止:1. 當 stop method 被呼叫時2. 當到達指定停止的時間時3. 當媒體撥放完畢時4. 接收速度低於撥放裝置可接受值時當 player 被停止時,假如媒體來源是被控制住的, 那 media time 也會被凍結住。如果是串流媒體則不能凍結媒體時間,媒體時間會繼續前進。 當 stopped 重新開始,時間會從暫停的地方繼續前進。如果
23、執行stop 於一個已經停止的player ,將會丟出一個 stopbyrequestevent。stopping the presentation at a specified time 我們可以呼叫 setstoptime 來指定 player 何時要停止,媒體時間到達設定時間就會停止。如果正在撥放媒體的時間已經超過設定的時間,將會立即停止撥放。如果已經設定過停止時間,再去設定就會產生一個錯誤。你可以呼叫 getstoptime 取得 currently scheduled stop time.(目前停止時間表單) , 如果 clock 沒有 scheduled stop time , g
24、etstoptime 會傳回 clock.reset ,如果移除設定的時間,媒體將會撥放到結束為止。releasing player resources 我們可以呼叫 deallocate method 釋放 player 全部的資源,像緩衝器、內部記憶體。 deallocate method只能在停止的 player 上呼叫。為了避免產生clockstartederrors, 我們必須先呼叫 stop 再呼叫 deallocate 。 在 prefetching 或 prefetched狀態呼叫 deallocate將會回到 realized 狀態,如果是在realized 狀態呼叫 dea
25、llocate player會丟出一個 deallocateevent並且傳回一個 unrealized狀態。當你完成一個 player或是不再使用,你必須呼叫close ,它會釋放所有的資源,所有的控制元件關閉後會丟出一個controllerclosedevent,並且不能重新開啟,否則會產生錯誤。querying a playerplayer 有提供一切資訊,例如撥放比例、媒體時間以及長度。getting the playback rate呼叫 getrate 可以傳回撥放裝置比例值。getting the media time 呼叫 getmediatime 可以得到媒體時間,如果不是目
26、前的媒體資料,將會顯示媒體展示的開始點。圖為 frame duration and media time.例如有一個 player 撥放一個 frame 要 5 秒,原本的比例設定為0.2 如果開始時間在 0.0 ,就會從 0.0 到 5.0 會撥放第一個 frame,如果從 2.0 開始撥放,直到 5.0 時,第一個畫面只會顯示3 秒。getting the time-base time我們可以由 player objects timebase和呼叫 gettime,得到 player objects 目前的 time-base time:mycurrenttbtime = player1.
27、gettimebase().gettime();當 player 正在執行,可以呼叫maptotimebase 取得時間基準。getting the duration of the media stream我們可以從 controllers去 implement duration interface,知道知道串流媒體的長度,這一個 interface只定義了單一的 method:getduration 。如果無法決定媒體長度的話, 當我們呼叫 getduration ,會傳回 duration_unknown。但是像現場立即的廣播不知道長度,執行get duration則會傳回一個durati
28、on_unbounded。responding to media eventscontrollerlistener是一個 asynchronous interface(非同步介面 ) ,透過controller objects處理事件產生, 可以去管理像 prefetching的 operations 。implementing the controllerlistener interface為了 implementing the controllerlistener interface,必須:1. 在 class 中 implement controllerlistener interfac
29、e 2. register that class as a listener by calling addcontrollerlistener on the controller that you want to receive events from. 當一個 controller丟出 event 時,它會在其他的觸發事件上去呼叫controllerupdate,而 controllerupdate像是在執行一連串的if-else敘述。example 3-3: implementing controllerupdate.if (event instanceof eventtype) . el
30、se if (event instanceof othereventtype) . 有些 controllerevents包含額外的狀態資訊,例如startevent stopevent classes定義一個 method 允許你當事件發生時可以重新取得媒體時間。using controlleradapter用 controlleradapter執行 controllerlistener介面example 3-4: using controlleradapter.player.addcontrollerlistener(new controlleradapter() public void
31、endofmedia(endofmediaevent e) controller controller = e.getsource(); controller.stop(); controller.setmediatime(new time(0); controller.deallocate(); ) synchronizing multiple media streams 同步複合的串流媒體錄放裝置要結合timebase ,需要用到 clock 介面的gettimebase 與 settimebasemethods定義, 例如要同步兩個 player , player1要使用 player2
32、 的時間。player1.settimebase(player2.gettimebase(); 當 player 同步之後還是可以個別的控制。using a player to synchronize controllers同步 player直接使用 syncstart , jmf提供一個簡單的方法, 一個 player可以管理運作任何的控制器。一般而言需要同步player 或是控制器,必須使用到 addcontroller裝置,它比個別管理同步的player更快速、簡單、更少錯誤。當 player 採用控制器控制controller採用 player 物件基準時間player 物件時間長度變
33、長player 物件前置時間變長adding a controller用 addcontroller method加入一個控制器到 player , 必須回到 realized狀態,否則會送出notrealizederror,在 player1 還沒有移除控制器時player2 不能使用。在 player2 呈現 player1 控制:player2.addcontroller(player1); controlling managed controllers functionstopped playerstarted playersetmediatimeinvokes setmediatim
34、e on all managed controllers.stops all managed controllers, invokes setmediatime, and restarts controllers.setrateinvokes setrate on all managed controllers. returns the actual rate that was supported by all controllers and set.stops all managed controllers, invokes setrate, and restarts controllers
35、. returns the actual rate that was supported by all controllers and set.startensures all managed controllers are prefetchedand invokes syncstart on each of them, taking into account their start latencies.depends on the playerimplementation. playermight immediately post a startevent.realizethe managi
36、ng playerimmediately posts a realizecompleteevent. to be added, a controller must already be realized.the managing playerimmediately posts a realizecompleteevent. to be added, a controller must already be realized.prefetchinvokes prefetch on all managed controllers. the managing playerimmediately po
37、sts a prefetchcompleteevent, indicating that all managed controllers are prefetched .stopno effect.invokes stop on all managed controllers.deallocateinvokes deallocate on all managed controllers.it is illegal to call deallocate on a startedplayer.setstoptimeinvokes setstoptime on all managed control
38、lers. (playermust be realized .)invokes setstoptime on all managed controllers. (can only be set once on a startedplayer.)syncstartinvokes syncstart on all managed controllers. it is illegal to call syncstarton a startedplayer.closeinvokes close on all managed controllers.it is illegal to call close
39、on a startedplayer.table 3-1: calling control methods on a managing player.removing a controller使用 removecontroller method移除 player 上的控制器,在 player2上釋放 player1 的控制:player2.removecontroller(player1); synchronizing players directly 在一些情況,需要靠自己去管理複合的同步player 物件,可以個別控制比例、媒體時間,你必須:1.每一個同步 player 註冊觸發事件2.決
40、定哪一個 player 基準時間作為其他player 的基準時間3.設定 player的撥放比例,如果沒有支援設定的比例,會傳回比例已經使用(這裡沒有可以詢問是否支援比例的裝置) 4. 所有 player進入同步狀態5.player 物件同步運作設定每一個 player的媒體時間prefetch 所有 player 決定同步 player 的最大前置開始時間呼叫 syncstart開始同步 player物件如果要改變同步 player 的時間1.首先 setmediatime 設定所以同步 player物件2.呼叫每個 player 準備開始3.當第二次設定被接受,呼叫每一個player 停止
41、4.setmediatime 設定每一個 player 新的時間5.重新執行 prefetching 運作6.全部的 player 都在 prefetched狀態,呼叫 syncstartexample: playing an mpeg movie in an applet在 java applet撥放 mpeg 電影,包含視覺元件與控制面板在 html 中的標記:example 3-5: invoking playerapplet. playerapplet定義五個步驟1.init-透過 applet 標記建立一個 player 2.start-當 playerapplet啟動,開始 pla
42、yer 3.stop- 當 playerapplet停止4.destroy- 當 playerapplet移除,關閉 player 5. controllerupdate-回應 player 事件example 3-6: playerapplet.import java.applet.*; import java.awt.*; import .*; import javax.media.*; public class playerapplet extends applet implements controllerlistener player player = null; public vo
43、id init() setlayout(new borderlayout(); string mediafile = getparameter(file); try url mediaurl = new url(getdocumentbase(), mediafile); player = manager.createplayer(mediaurl); player.addcontrollerlistener(this); catch (exception e) system.err.println(got exception +e); public void start() player.s
44、tart(); public void stop() player.stop(); player.deallocate(); public void destroy() player.close(); public synchronized void controllerupdate(controllerevent event) if (event instanceof realizecompleteevent) component comp; if (comp = player.getvisualcomponent() != null) add (center, comp); if (com
45、p = player.getcontrolpanelcomponent() != null) add (south, comp); validate(); initializing the applet1.接收 applet 檔案參數2.利用檔案參數確定媒體檔案並且建立url物件3.呼叫 manager.createplayer建立一個 player4. 呼叫 addcontrollerlistener註冊 applet上的控制觸發事件example 3-7: initializing playerapplet. public void init() setlayout(new borderl
46、ayout(); / 1. get the file parameter. string mediafile = getparameter(file); try / 2. create a url from the file parameter. the url / class is defined in . url mediaurl = new url(getdocumentbase(), mediafile); / 3. create a player with the url object. player = manager.createplayer(mediaurl); / 4. ad
47、d playerapplet as a listener on the new player. player.addcontrollerlistener(this); catch (exception e) system.err.println(got exception +e); controlling the player這個 class 定義當 applet 包含打開與關閉,自動呼叫start與 stopmethods。example 3-8: starting the player in playerapplet. public void start() player.start();
48、 example 3-9: stopping the player in playerapplet. public void stop() player.stop(); player.deallocate(); 當 applet 離開 player 釋放資源供其他 player 使用並且關閉。example 3-10: destroying the player in playerapplet. public void destroy() player.close(); responding to media events當 playerapplet回應一個事件,丟出 realizecompl
49、eteevent , playerapple顯示 player 的元件example 3-11: responding to media events in playerapplet. public synchronized void controllerupdate(controllerevent event) if (event instanceof realizecompleteevent) component comp; if (comp = player.getvisualcomponent() != null) add (center, comp); if (comp = play
50、er.getcontrolpanelcomponent() != null) add (south, comp); validate(); playerapple 等待 player 丟出 realizecompleteevent ,然後顯示內含的視覺元件,與控制面板,呼叫validate 觸發 layout 管理,顯示新加入的元件。presenting media with the mediaplayer bean透過 mediaplayer bean 展示媒體使用 mediaplayer java bean是一個間單的方法在applet 或 applications上展示串流媒體,也可以在
51、這上面定義自己的元件。它會再選擇不同的串流媒體時自動產生一個新的 player ,一個 mediaplayer bean 有幾個特殊用具可以設定propertytypedefault descriptionshow control panel booleanyescontrols whether or not the video control panel is visible.loopbooleanyescontrols whether or not the media clip loops continuously.media locationstringn/athe location o
52、f the media clip to be played. it can be an url or a relative address. for example: file:/e:/video/media/ sample1.movhttp:/webserver/media/sample1.movmedia/sample1.mov show caching controlbooleannocontrols whether or not the download-progress bar is displayed.fixed aspect ratiobooleanyescontrols whe
53、ther or not the medias original fixed aspect ratio is maintained.volumeint3 controls the audio volume.用 mediaplayer bean撥放媒體1.mediaplayer 建立一個 instance mediaplayer mp1 = new javax.media.bean.playerbean.mediaplayer();2.設定要撥放的位址mp1.setmedialocation(new java.lang.string(file:/e:/jvideo/media/ sample1.mov); 3.開始 mediaplayer mp1.start(); 4.停止錄放裝置 mp1.stop();presenting
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋预售合同(6篇)
- 供应商采购合同(7篇)
- 有关2025年应急管理培训心得体会(9篇)
- 高效学习公路工程考试要素试题及答案
- 二手房屋买卖合同模板(16篇)
- 深入弘扬数据库知识的实践精神试题及答案
- 领导者如何管理跨文化团队试题及答案
- 行政组织理论考试特点的试题及答案
- 历史文化常识模拟试题集
- 租赁物业长期使用权转让合同
- 河北开放大学2025年《医用基础化学#》形考任务2答案
- 2024年江苏省南京中考模拟英语试题(原卷版+解析版)
- 北森测评试题及答案全部
- 2025年江苏省南京市鼓楼区中考一模英语试卷(含答案)
- 北森测评试题及答案
- (课件)国家综合性消防救援队伍基层建设纲要
- 电工电子技术 课件 41.三极管的结构与分类 -50.放大电路中的反馈
- 高标准农田施工安全教育
- 自然疗法研究与培训中心行业深度调研及发展战略咨询报告
- 2025年砂石常规检测试题及答案
- 机械设计制造及其自动化毕业论文-温室用小型电动旋拼机设计
评论
0/150
提交评论