【正文】
每個(gè)容器都獨(dú)立實(shí)現(xiàn)各自的功能。 利用 DirectShow 框架,開發(fā)人員得以從數(shù)據(jù)傳輸、同步性、硬件差異等瑣碎且復(fù)雜的工作中解脫出來 [10]。 在“流水線”的入口處輸入原始的多媒體文件,流水線的出口處將會(huì)輸出畫面、聲音等。 Filter Graph 是 Filter 的“容器”,而 Filter 是 Filter Graph 中的最小功能模塊。 本章給出了 IPTV播放器內(nèi)核的設(shè)計(jì)與主要模塊的實(shí)現(xiàn)。這樣的業(yè)務(wù)特征,非常適合采用先進(jìn)先出的“隊(duì)列”結(jié)構(gòu)。 支持動(dòng)態(tài)拆卸和組裝 Filter 組件作為流數(shù)據(jù)處理的基礎(chǔ)模塊,必須具備足夠的靈活度,可以在播放狀態(tài)下,動(dòng)態(tài)組裝或者拆卸 Filter。文件內(nèi)容中有某些數(shù)據(jù)可以標(biāo)志文件的格式,這里以 TS文件( TS文件是擴(kuò)展名為 .ts的文件 , 是 高清影片格式之一)為例進(jìn)行說明。 播放器框架為每個(gè)播放引擎賦予一個(gè)全局唯一的識(shí)別符,稱之為句柄( HANDLE) .一個(gè)引擎句柄就是一個(gè)整形數(shù)字。一條流水線都是由一個(gè)播放基本功能的組件相連而構(gòu)成的(類似 DirectShow中的 FitlerGraph),可以形象地將這么一條完整的多媒體處理流水線稱 為一個(gè)播放引擎。同時(shí),建立新線程,循環(huán)接收該連接上的 socket數(shù)據(jù) ,用于不定時(shí)接收播放器返回的事件通知。 內(nèi)核接口庫層:通過 TCP協(xié)議與播放器內(nèi)核建立連接,通過這個(gè)連接向內(nèi)核發(fā)送控制碩士學(xué)位論文 第 14 頁 命令,并向內(nèi)核查詢播放狀態(tài);內(nèi)核的播放事件,也通過這個(gè)連接傳遞給上層應(yīng)用。 7) EsData數(shù)據(jù)長(zhǎng)度:媒體流的數(shù)據(jù)長(zhǎng)度; 8) 結(jié)束標(biāo)志( MagicEnd):類似于 MagicStart,用于聲明每段媒體流數(shù)據(jù)的結(jié)束位置。其中音視頻寫入數(shù)據(jù)時(shí)一個(gè)很關(guān)鍵的方法,對(duì)寫入的數(shù)據(jù)格式有特殊要求。這也為設(shè)計(jì)硬件適配層提供了切入點(diǎn)。內(nèi)核進(jìn)程通過調(diào)用底層硬件適配接口完成“解碼”和“輸出”。常見的播放器狀態(tài)事件有:播放開始、播放異常、播放完畢等 [12],或者打開失敗、緩沖不足等錯(cuò)誤信息。一個(gè)連接建立在端口 8082上,用于視音頻應(yīng)用程序向播放器內(nèi)核傳遞播放指令。 第 二 章 IPTV 播放器 框架 設(shè)計(jì) 第 11 頁 圖 5 業(yè)務(wù)進(jìn)程主流程 業(yè)務(wù)進(jìn)程主函數(shù)啟動(dòng)后,首先根據(jù)業(yè)務(wù)需要?jiǎng)?chuàng)建并初始化不同的子類對(duì)象,然后調(diào)用InitPlayer方法初始化播放器,更新共享內(nèi)存中的播放器狀態(tài)信息,之后就一直處于消息接收狀態(tài),捕獲接口傳來控制命令并根據(jù)命令內(nèi)容調(diào)用恰當(dāng)?shù)奶幚矸椒āI(yè)務(wù)進(jìn)程接收并判斷播放器業(yè)務(wù)接口層傳來的 控制命令是否滿足執(zhí)行條件,然后根據(jù)需要改變播放器狀態(tài),并將播放器最新的狀態(tài)信息更新到業(yè)務(wù)層共享內(nèi)存里,工業(yè)務(wù)接口層隨時(shí)訪問。 下面以新浪視頻業(yè)務(wù)為例,描述媒體業(yè)務(wù)邏輯層的層次與接口。 視頻業(yè)務(wù)服務(wù)層 視頻業(yè)務(wù)服務(wù)層處于視頻業(yè)務(wù)應(yīng)用層的下方,專門為紛繁復(fù)雜度視頻應(yīng)用業(yè)務(wù)提供所需的播放服務(wù)。 IPTV 播放器框架分層結(jié)構(gòu) 圖 2是基于 ,所設(shè)計(jì)的 IPTV播放器框架的分層結(jié)構(gòu)圖。 根據(jù) 劃分的層次,定義好層間接口之后,開發(fā)人員可以僅僅專注于自己所負(fù)責(zé)的邏輯模塊,無需關(guān)心其它模塊,這樣可以相互獨(dú)立的開展工作、齊頭并進(jìn)。因此,數(shù)據(jù)源讀取與解復(fù)用才是機(jī)頂盒播放器軟件的核心功能。解碼器有純軟件、硬件芯片兩大類,前者便于升級(jí),后者更加穩(wěn)定高效。電腦本地硬盤上存儲(chǔ)的媒體文件、用于點(diǎn)播的 HTTP服務(wù)器上的媒體文件、 UDP組播的媒體文件、 RTSP服務(wù)器提供的 RTP數(shù)據(jù)包等 [5][6][7],均為有效的數(shù)據(jù)源。 第五章: IPTV播放器測(cè)試。依據(jù)該思路,設(shè)計(jì)了一個(gè) 可復(fù)用程度高、易擴(kuò)展、利于開發(fā)各種音視頻播放應(yīng)用的先進(jìn)框架,并對(duì) 框架的層次結(jié)構(gòu)、層間通訊和框架所支持的技術(shù)特性進(jìn)行了闡述。 播放器內(nèi)核按照服務(wù)層級(jí)來劃分模塊,內(nèi)層模塊為外層模塊提供服務(wù),由外層的模塊完成邏輯控制,內(nèi)層模塊完成實(shí)際的工作任務(wù)。 播放器通訊控制層:通常將該層叫做“播放器內(nèi)核接口庫層”。但是根據(jù)當(dāng)前的播放器發(fā)展情況可以發(fā)現(xiàn):由 于 IPTV所用到的硬件設(shè)備各有差異,所以目前對(duì) IPTV播放器沒有統(tǒng)一的播放器或播放器框架可以直接使用。這些開源項(xiàng)目的共同特點(diǎn)是廣泛的格式支持及開源。雖然已經(jīng)過了多年的運(yùn)營(yíng),各國 IPTV運(yùn)營(yíng)商仍然面臨運(yùn)營(yíng)模式和生態(tài)鏈的問題,但各運(yùn)營(yíng)商都在積極探索自己的發(fā)展模式 [2]。歐洲是全球最大的 IPTV市場(chǎng),IPTV在法國呈現(xiàn)爆炸性增長(zhǎng)。 IPTV的出現(xiàn)使這種愿望成為可能。由于 IPTV硬件平臺(tái)尤其是解碼硬件多樣性問題的存在,導(dǎo)致目前還沒有統(tǒng)一的標(biāo)準(zhǔn)供機(jī)頂盒制作廠家遵循,市場(chǎng)上也沒有完全支持以上特點(diǎn)的播放器內(nèi)核可以使用,常用的開源播放器更是無法滿足不同廠家對(duì) IPTV業(yè)務(wù)能力的擴(kuò)展需求。 本地媒體文件是指存儲(chǔ)在機(jī)頂盒內(nèi)置存儲(chǔ)設(shè)備如 Flash存儲(chǔ)器、內(nèi)置硬盤,或可熱插拔的移動(dòng)存儲(chǔ)設(shè)備如 SD卡、 U盤、移動(dòng)硬盤等上的媒體文件。所以隨著IPTV的發(fā)展與普及, IPTV播放器也顯示出至關(guān)重要的作用。 3. 設(shè)計(jì)了播放器內(nèi)核接口庫。 本文以設(shè)計(jì)一種支持 可復(fù)用、易擴(kuò)展的先進(jìn)播放器框架及內(nèi)核為目標(biāo),針對(duì)其中所涉及的關(guān)鍵技術(shù)問題展開研究。完成的主要工作包括: 1. 研究了播放器框架。為避免播放器內(nèi)核因夾雜播放邏輯而影響其在上層業(yè)務(wù)中的普適性的問題,定義了一套 API 接口供業(yè)務(wù)層調(diào)用。 IPTV已經(jīng)從其最初的以 “ 互聯(lián)網(wǎng) +機(jī)頂盒終端 +普通電視 ” 的形式,轉(zhuǎn)而向一體式智能電視(內(nèi)置 IPTV模塊)、 PC平臺(tái)、手機(jī)電視等多種多樣的形式發(fā)展。 網(wǎng)絡(luò)媒體文件,則是指那些位于遠(yuǎn)端服務(wù)器,需要通過網(wǎng)絡(luò)協(xié)議交互,通過網(wǎng)絡(luò)獲取到數(shù)據(jù)的媒體文件。 除此之外,嵌入式設(shè)備資源有限性(處理器運(yùn)算速度不夠高,運(yùn)行內(nèi)存不夠大)也使嵌入式播放器的開發(fā)難度遠(yuǎn)遠(yuǎn)高于 PC播放器。 IPTV主要是以網(wǎng)絡(luò)機(jī)頂盒作為用戶終端,以顯示器為顯示設(shè)備,以寬帶為主要傳輸網(wǎng)絡(luò),為用戶提供多媒體信息服務(wù)。法國目前已經(jīng)成為 IPTV領(lǐng)先發(fā)展的國家 [3]。 2) 國內(nèi)外 IPTV播放器發(fā)展研 究現(xiàn)狀 全球播放器的發(fā)展大致經(jīng)歷了三個(gè)階段: ① 第一階段:格式封閉階段 這是個(gè)“各自為政”的階段。不少播放器都是在這三個(gè)項(xiàng)目的基礎(chǔ)上修改而來,如韓國 Kmplayer、中國的暴風(fēng)影音、射手播放器等。所有廠家都需要根據(jù)設(shè)備架構(gòu)和硬件平臺(tái),開發(fā)配套的視頻播放器。該層通過 TCP連接與內(nèi)核進(jìn)程進(jìn)行通訊,實(shí)現(xiàn)對(duì)內(nèi)核的控制及狀態(tài)查詢,接收內(nèi)核發(fā)送的事件通知。 IPTV 播放器內(nèi)核接口庫層實(shí)現(xiàn) 播放器內(nèi)核接口庫層(即:播放器通訊控制層)提供一套接口,供業(yè)務(wù)層對(duì)播放器內(nèi)第一章 緒論 第 5 頁 核進(jìn)程進(jìn)行控制,從而控制視頻的播放。 第三章: IPTV播放器內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)。首先給出了測(cè)試目的和測(cè)試環(huán)境,然后描述了測(cè)試過程,之后通過調(diào)用播放器內(nèi)核接口庫提供的接口, 對(duì)播放器內(nèi)核和播放器內(nèi)核接口庫進(jìn)行了功能測(cè)試 。讀取成功后,就可開始解讀該媒體文件 —— 解復(fù)用。 輸出 解碼之后的視頻信息將以 YUV或 RGB格式輸出到顯示外設(shè)、音頻信息將以 PCM(脈沖編碼調(diào)試 )的形式輸出到聲音外設(shè),整個(gè)過程也被稱為渲染。這兩個(gè)部分也就是我們研究 IPTV播放器的核心。例如,界面設(shè)計(jì)師( UI)只需思考如何滿足并提高用戶體驗(yàn);軟件工程師只需要考慮如何實(shí)現(xiàn)播放器的功能。 碩士學(xué)位論文 第 8 頁 圖 2 播放器分層結(jié)構(gòu)示意圖 如圖 2所示,根據(jù)播放器功能與軟件組織需求,將播放器涉及的進(jìn)程和庫分為三層,分別如下:業(yè)務(wù)層、 播放器內(nèi)核接口 庫層、播放器內(nèi)核層。同時(shí),視頻業(yè)務(wù)服務(wù)層處于通訊控制層上方,結(jié)合通訊控制層為視頻業(yè)務(wù)應(yīng)用層提供有針對(duì)性的功能接口。 1) 新浪業(yè)務(wù)代碼組織結(jié)構(gòu) 圖 3 新浪業(yè)務(wù)代碼組織結(jié)構(gòu)圖 目錄結(jié)構(gòu)及功能說明如下:公用的基類代碼存放于 base文件夾; previewService文件夾用于存放業(yè)務(wù)調(diào)用接口,業(yè)務(wù)調(diào)用接口被分為業(yè)務(wù)接口層( interface)和業(yè)務(wù)子類與主函數(shù)( manager) 2) 業(yè)務(wù)層與其它各模塊的關(guān)系 圖 4給出了業(yè)務(wù)層與其它各模塊的關(guān)系。 基類、子類、主函數(shù)是業(yè)務(wù)進(jìn)程的三大核心。 播放器內(nèi)核接口庫層 播放器內(nèi)核接口庫層,我們又可以將其叫做播放器通訊控制層。另一個(gè)連接建立在端口 8083上,用于播放內(nèi)核向外傳遞播放器狀態(tài)。這些關(guān)鍵的狀態(tài)信息必須及時(shí)準(zhǔn)確的反饋給業(yè)務(wù)應(yīng)用層,確保用戶體驗(yàn)良好 。 硬件適配層 適用于視頻播放設(shè)備的解碼芯片,可能是來自不同廠家的不同型號(hào)的專用芯片。 硬件適配層提供兼容不同解碼芯片的適配功能,為上層提供統(tǒng)一的接口。 第 二 章 IPTV 播放器 框架 設(shè)計(jì) 第 13 頁 寫入的音視頻數(shù)據(jù)必須包含“媒 體格式說明( Meta)”和“媒體流數(shù)據(jù)( ESData)”。 媒體流數(shù)據(jù)( ESData)處于 Meta信息之后。業(yè)務(wù)層通過調(diào)用內(nèi)核接口層提供的一些列 API,即可實(shí)現(xiàn)與播 放器內(nèi)核的交互。然后通過 TCP連接發(fā)送 VPLAYER_CMD_INIT消息給播放器內(nèi)核,播放器內(nèi)核接收到消息后會(huì)執(zhí)行實(shí)際的 init功能,并將執(zhí)行結(jié)果返回給內(nèi)核第 二 章 IPTV 播放器 框架 設(shè)計(jì) 第 15 頁 接口庫層。在一個(gè)進(jìn)程內(nèi)同時(shí)創(chuàng)建若干個(gè)獨(dú)立啟動(dòng)、獨(dú)立管理的多媒體處理流水線,就實(shí)現(xiàn)了多播放引擎功能。該句柄在通訊控制層的 API接口內(nèi)被當(dāng)做參數(shù),廣泛使用。如果第一個(gè)字節(jié)是 0x47,且每隔 188個(gè)字節(jié)就又出現(xiàn) 0x47,就可以判定該文件為 TS文件。創(chuàng)建一個(gè) Filter 組件,并將其加入到流數(shù)據(jù)處理流水線的過程,就是組裝。將視頻、銀屏、字幕等多種媒體格式,按照時(shí)間先后組織成多個(gè)隊(duì)列,播放時(shí)從各個(gè)隊(duì)列的頭部獲取時(shí)間戳相近的數(shù)據(jù) ,優(yōu)先投遞時(shí)間值較小的視頻或者銀屏數(shù)據(jù),這樣就基本實(shí)現(xiàn)了音視頻數(shù)據(jù)的均勻交織投遞。 IPTV 播放器內(nèi)核設(shè)計(jì)思路 開發(fā)多媒體應(yīng)用,必然會(huì)面對(duì)以下這些挑戰(zhàn): 1) 如果快速準(zhǔn)確的處理大量的多媒體數(shù)據(jù); 2) 視頻和音頻文件往往獨(dú)立存放,播放時(shí)如何確保二者時(shí)刻同步; 3) 多 媒體數(shù)據(jù)來源眾多,有網(wǎng)絡(luò)的、有本地,有直播的、有點(diǎn)播的,如何設(shè)計(jì)簡(jiǎn)單的接口來處理這些復(fù)雜的數(shù)據(jù)源; 4) 視頻和音頻文件格式繁多(如: AVI、 MPEG[8]、 MP MOV 等等),并且還在不斷的推陳出新,如何兼容舊的多媒體文件格式,如何支持新的文件格式; 5) 在目標(biāo)系統(tǒng)中,如何支持不可預(yù)知的硬件。各個(gè) Filter 按照一定的規(guī)則被加入“ 容器”,組成一條“流水線”,協(xié)同工作。在 DirectShow 系統(tǒng)中,將這么一條流水線稱之為 FilterGraph,由 Filter Graph Manager管理著這條流水線。 DirectShow 承擔(dān)了總體框架和底層工作,基于 DirectShow 框架開發(fā)多媒體應(yīng)用顯得簡(jiǎn)單高效 [10]。圖 9 是多媒體播放器內(nèi)核架構(gòu)示意圖。可將外層模塊視為一個(gè)處于外部的大容器,內(nèi)層模塊是處于外層模塊容器之內(nèi)的較小碩士學(xué)位論文 第 20 頁 的容器,外層容器內(nèi)可以有多個(gè)內(nèi)層容器。支持某種文件格式的 DemuxFilter 組件開發(fā)完畢之后,其它開發(fā)者只需在恰當(dāng)?shù)牡胤阶?cè)這個(gè)組件,該播 放器即可支持該格式的多媒體文件。 ? 渲染輸出組件( RenderFitler):主要負(fù)責(zé)多媒體數(shù)據(jù)的最終去向,或者送給顯卡、聲卡進(jìn)行多媒體的演示;或者輸出到文件進(jìn)行存儲(chǔ)。參與數(shù)據(jù)處理的各個(gè)功能模塊均可叫做 Filter(過濾器)。 碩士學(xué)位論文 第 18 頁 第三章 IPTV 播放器內(nèi)核設(shè)計(jì)與實(shí)現(xiàn) 在播放器軟件框架結(jié)構(gòu)中,播放器內(nèi)核實(shí)現(xiàn)多媒體文件的播放和控制等具體的功能,并通過通訊控制層對(duì)上層應(yīng)用提供播控功能。 使用緩沖池和隊(duì)列管理數(shù)據(jù) 播放視頻數(shù)據(jù)和音頻數(shù)據(jù)必須按照實(shí)現(xiàn)先后順序逐條播放,并且要求視頻和音頻時(shí)間對(duì)照。 便于播放器支持格式的易擴(kuò)展性 Filter之間采用專用的部件、統(tǒng)一的接口進(jìn)行連接,添加新 Filter時(shí)只要遵守已定義好的接口,就無需對(duì)播放器架構(gòu)做改動(dòng),便于擴(kuò)展播放器支持的格式。每一種文件類型都有自己的格式。如果采用播放引擎技術(shù),只需要在前一個(gè)播放即將結(jié)束是,立即啟動(dòng)另一個(gè)播放引擎并使其處于待命狀態(tài),待上一視頻播放完畢,立即啟動(dòng)下一個(gè)引擎,即可實(shí)現(xiàn)無縫連播。即:完成四個(gè)基本步驟:數(shù)據(jù)源讀取、解復(fù)用、解碼、輸出。1 . 4 : V P L A Y E R _ C M D _ I N I T 消 息1 . 4 . 1 : 創(chuàng) 建 M e d i a R e n d e r M a n a g e r 、 M e d i a S o u r c e M a n a g e r1 . 5 : O K 或 F A I L返 回 值2 : O p e n ( u r l , f l a g )2 . 1 : V P L A Y E R _ C M D _ O P E N 消 息2 . 1 . 2 : M e d i a S o u r c e M a n a g e r 初 始 化 ( 調(diào) 用 D e m u x 的 初 始 化 )2 . 1 . 1 : M e d i a S o u r c e M a n a g e r 根 據(jù) 不 同 的 媒 體 格 式 , 創(chuàng) 建 不 同 的 D e m u x2 .