承接上篇,本文深入剖析 JMF (Java Media Framework) 中最核心的兩個組件——Player(播放器)與 Processor(處理器) 的狀態機模型、方法調用約束與事件機制,為多媒體應用開發提供架構級指導。
Player 負責從 DataSource 讀取媒體流,經解碼、渲染後輸出至音視頻設備。其生命週期由 6 個標準狀態構成有限狀態機:
| 狀態 | 觸發條件 | 核心活動 | 資源特徵 |
|---|---|---|---|
| Unrealized | new Player() | 實例化完成,不知媒體詳情 | 無資源佔用 |
| Realizing | realize() | 分析媒體類型、尋找解碼器 | 獲取可共享資源 |
| Realized | Realizing 完成 | 知曉媒體格式、解碼器就緒 | 非獨佔資源已獲取 |
| Prefetching | prefetch() | 緩衝數據、獲取獨佔資源(聲卡/顯卡) | 準備獨佔資源 |
| Prefetched | Prefetching 完成 | 數據預載完成,可立即播放 | 獨佔資源已鎖定 |
| Started | start() | 實際播放媒體數據 | 佔用所有資源 |
JMF 嚴格限制各狀態下可調用的方法,違規將拋出 NotRealizedError、ClockStartedError 等異常。關鍵約束表:
getVisualComponent():Realized 後可調用setRate():Realized 後可調用syncStart():Prefetched 後可調用deallocate():除 Started 外均可調用開發者必須透過 ControllerListener 監聽 TransitionEvent 確認狀態,再安全調用對應方法。
Processor 繼承 Player,新增兩大能力:
Processor 在 Unrealized 與 Realizing 之間插入兩個配置階段:
configure() 觸發,連接 DataSource、分析輸入格式setContentDescriptor()、軌道控制 TrackControl此設計允許在實現前精確控制編碼參數(如比特率、幀率、關鍵幀間隔),是媒體轉碼應用的關鍵。
所有 Controller (Player/Processor) 事件分三類:
RateChangeEvent、DurationUpdateEvent、FormatChangeEventTransitionEvent 實現狀態機監控ControllerClosedEvent 資源釋放通知透過 addControllerListener() 註冊監聽器,實現非阻塞式狀態協調。
Player、Processor、DataSink 統稱為 MediaHandler,皆由 Manager 根據 DataSource 動態構建。JMF 採用 Plug-in 架構:
PlugInManager 管理所有底層插件註冊,實現格式支援的動態擴展。
start latency,平衡啟動速度與流暢度close() 而非僅 stop()掌握 Player/Processor 狀態機與約束,是構建穩健 JMF 應用的基石。下篇將探討捕獲、傳輸與自定義插件開發。