理解java媒體框架(二)
4.1播放器(Players)
播放器(Player)對一個媒體數據輸入流進行處理,並實現時間上的精確播放。數據源(DataSource)將輸入流傳遞到播放器。播放器將聲音或(和)視頻傳遞到相應的目標地(destination)。
圖9爲JMF播放器模型
播放器(Player)對一個媒體數據輸入流進行處理,並實現時間上的精確播放。數據源(DataSource)將輸入流傳遞到播放器。播放器將聲音或(和)視頻傳遞到相應的目標地(destination)。
圖9爲JMF播放器模型
播放器在處理和顯示媒體數據過程中不提供任何控制。通過繼承Clock和Controller類,播放器可支持標準的用戶控制功能以及部分限制操作。
圖10爲JMF 播放器
圖10爲JMF 播放器
4.1.1播放器狀態(Player States)
播放器對象有多種狀態,JMF中定義了6 種狀態。在正常情況下播放器對象需要經歷每個狀態,然後才能播放媒體數據。下面是對這些狀態的說明:
(1)Unrealized:在這種狀態下播放器對象已經被實例化,但是並不知道它需要播放的媒體的任何信息。
(2)Realizing:當調用realize方法時,播放器對象的狀態從Unrealized轉變爲Realizing。 在這種狀態下Player對象正在確定它需要佔用資源。在此過程中,播放器取得的資源都是那些只需取得一次的資源,不是那些獨佔的資源。
(3)Realized:在這種狀態下播放器對象已經確定了它需要的資源並且也知道要播放的媒體的類型(type)。
(4)Prefetching:當調用prefectch方法時,播放器對象的狀態從Realized變爲Prefetching 在該狀態下的播放器對象正在爲播放媒體做一些準備工作。其中包括加載媒體數據而需要獲得的獨佔資源等。這個過程被稱爲預取Prefetch。
(5)Refetched:當播放器對象完成了預取操作後就到達了該狀態。
(6)Started:當調用start方法後播放器對象就進入了該狀態並開始播放媒體。
圖11爲播放器的狀態轉換圖
播放器對象有多種狀態,JMF中定義了6 種狀態。在正常情況下播放器對象需要經歷每個狀態,然後才能播放媒體數據。下面是對這些狀態的說明:
(1)Unrealized:在這種狀態下播放器對象已經被實例化,但是並不知道它需要播放的媒體的任何信息。
(2)Realizing:當調用realize方法時,播放器對象的狀態從Unrealized轉變爲Realizing。 在這種狀態下Player對象正在確定它需要佔用資源。在此過程中,播放器取得的資源都是那些只需取得一次的資源,不是那些獨佔的資源。
(3)Realized:在這種狀態下播放器對象已經確定了它需要的資源並且也知道要播放的媒體的類型(type)。
(4)Prefetching:當調用prefectch方法時,播放器對象的狀態從Realized變爲Prefetching 在該狀態下的播放器對象正在爲播放媒體做一些準備工作。其中包括加載媒體數據而需要獲得的獨佔資源等。這個過程被稱爲預取Prefetch。
(5)Refetched:當播放器對象完成了預取操作後就到達了該狀態。
(6)Started:當調用start方法後播放器對象就進入了該狀態並開始播放媒體。
圖11爲播放器的狀態轉換圖
當一個播放器從一個狀態轉換到另一個狀態時,它將給出TransitionEvents。通過ControllerListener接口,你的程序可以確定播放器在什麼狀態並作出相應的反應。
使用這種時間報告機制,你可以通過控制一個播放器對象的Realizing和Prefetching的開始點來管理它的緩衝時間(start latency)。同時,你也可以在調用播放器的方法前確定播放器是否在其適當的狀態。
使用這種時間報告機制,你可以通過控制一個播放器對象的Realizing和Prefetching的開始點來管理它的緩衝時間(start latency)。同時,你也可以在調用播放器的方法前確定播放器是否在其適當的狀態。
4.1.2每個狀態下播放器對象可執行的方法
爲了避免混亂情況,在一個播放器所有狀態下,不是所有的方法都能被調用的。下表定義了JMF規定的限制。如果你在一個播放器對象的當前狀態下,調用了一個非法的方法,播放器對象將拋出異常或錯誤。
爲了避免混亂情況,在一個播放器所有狀態下,不是所有的方法都能被調用的。下表定義了JMF規定的限制。如果你在一個播放器對象的當前狀態下,調用了一個非法的方法,播放器對象將拋出異常或錯誤。
4.2處理器(Processors)
處理器(Processors)同樣可以用來播放媒體數據。處理器是一種特殊的播放器,它可以對輸入媒體流進行過程控制。處理器支持所有播放器擁有的播放控制功能。
除了將媒體數據傳送至播放終端外,處理器可以將媒體數據輸出至一個數據源(DataSource),此數據源可以作爲其它的播放器或處理器的數據源,或是通過其它的處理器對其進行進一步操作控制,或將其傳輸到一個文件進行存儲。
圖12爲處理器模型
處理器(Processors)同樣可以用來播放媒體數據。處理器是一種特殊的播放器,它可以對輸入媒體流進行過程控制。處理器支持所有播放器擁有的播放控制功能。
除了將媒體數據傳送至播放終端外,處理器可以將媒體數據輸出至一個數據源(DataSource),此數據源可以作爲其它的播放器或處理器的數據源,或是通過其它的處理器對其進行進一步操作控制,或將其傳輸到一個文件進行存儲。
圖12爲處理器模型
處理器對應的接口是Processor。在JMF API中Processor接口繼承了Player接口。
圖13 爲JMF處理器
圖13 爲JMF處理器
如圖12 所示,處理器對象除了支持播放器對象支持的所有功能外,還可以對輸入的媒體數據流進行處理,並通過數據源向其他的播放器對象或處理器對象輸出數據。
4.2.1處理器狀態(Processor States)
如圖13所示,除了在播放器中提到了的6種狀態以外,處理器對象還包括兩種新的狀態。這兩種狀態是在Unrealized狀態之後,在Realizing 狀態之前。
(1)Configuring:當調用configure方法後,處理器對象進入該狀態。在該狀態下處理器對象連接到數據源並獲取輸入數據的格式信息。
(2)Configured:當完成數據源連接,獲得輸入數據格式的信息後,處理器對象就處於Configured狀態。
圖14爲處理器的狀態轉換圖
如圖13所示,除了在播放器中提到了的6種狀態以外,處理器對象還包括兩種新的狀態。這兩種狀態是在Unrealized狀態之後,在Realizing 狀態之前。
(1)Configuring:當調用configure方法後,處理器對象進入該狀態。在該狀態下處理器對象連接到數據源並獲取輸入數據的格式信息。
(2)Configured:當完成數據源連接,獲得輸入數據格式的信息後,處理器對象就處於Configured狀態。
圖14爲處理器的狀態轉換圖
4.2.2每個狀態下控制器對象可執行的方法
4.3 Controller 事件
Controller(播放器或控制器)註冊的ControllerEvents被分爲三類:改變通知(change notifications),關閉事件(closed events),狀態轉變事件(transtion events):
(1)改變通知事件如RateChangeEvent,DurationUpdateEvent,FormatChangeEvent表明一些Controller的屬性的改變。
(2)狀態轉變事件可以使你的程序對Controller對象的狀態轉變作出反應。
(3)當Controller關閉時,它將註冊關閉事件。
圖15 爲JMF Controller事件
Controller(播放器或控制器)註冊的ControllerEvents被分爲三類:改變通知(change notifications),關閉事件(closed events),狀態轉變事件(transtion events):
(1)改變通知事件如RateChangeEvent,DurationUpdateEvent,FormatChangeEvent表明一些Controller的屬性的改變。
(2)狀態轉變事件可以使你的程序對Controller對象的狀態轉變作出反應。
(3)當Controller關閉時,它將註冊關閉事件。
圖15 爲JMF Controller事件
5.媒體處理者結構(MediaHandler Construction)
播放器(Players),處理器(Processors),數據池(DataSinks)都是媒體處理者的一種,它們都從數據源(DataSource)中讀取數據。每個媒體處理者都是爲專爲一個數據源創建的。
圖16爲JMF的媒體處理者結構
播放器(Players),處理器(Processors),數據池(DataSinks)都是媒體處理者的一種,它們都從數據源(DataSource)中讀取數據。每個媒體處理者都是爲專爲一個數據源創建的。
圖16爲JMF的媒體處理者結構
6.參考資料
JMF2.0 API Guide
JMF2.0 API Guide