摘要:介紹了IPTV 機(jī)頂盒流媒體播放器的設(shè)計(jì)過(guò)程 ,利用live555 開(kāi)源代碼中playCommON. cpp 的功能 ,結(jié)合 IPTV機(jī)頂盒的軟件結(jié)構(gòu)設(shè)計(jì)開(kāi)發(fā)了 IPTV 機(jī)頂盒的傳輸模塊。然后將這個(gè)傳輸模塊通過(guò)消息隊(duì)列與中間件連接 ,同時(shí)通過(guò)播放模塊的入口函數(shù)與播放模塊連接 ,最后組成了 IPTV 機(jī)頂盒的流媒體播放器。該播放器經(jīng)測(cè)試 ,性能穩(wěn)定。
開(kāi)源代碼live555是用來(lái)實(shí)現(xiàn)流媒體傳輸功能的SDK.用該SDK中teSTProgs文件夾中的play Common. cpp 來(lái)設(shè)計(jì) IP TV 機(jī)頂盒的傳輸模塊 ,并與播放模塊一起構(gòu)成 IPTV 機(jī)頂盒的流媒體播放器的過(guò)程。playCommon. cpp 是連接服務(wù)器和客戶端的橋梁 ,它的工作原理就是客戶端向服務(wù)器請(qǐng)求數(shù)據(jù)時(shí) ,從服務(wù)器的 URL 處獲得 SDP 描述信息并根據(jù) SDP 創(chuàng)建多媒體會(huì)話 ,最后播放數(shù)據(jù)流的過(guò)程。
1 IPTV 機(jī)頂盒流媒體播放器設(shè)計(jì)
1. 1 IPTV機(jī)頂盒軟件結(jié)構(gòu)
機(jī)頂盒的軟件代碼實(shí)現(xiàn)分4部分 :硬件驅(qū)動(dòng)、操作系統(tǒng)、中間件、應(yīng)用層,如圖1所示。
圖1 機(jī)頂盒軟件結(jié)構(gòu)
1) 硬件驅(qū)動(dòng) 連接底層硬件和上層操作系統(tǒng)。2) 操作系統(tǒng) 這里用的是免費(fèi)的開(kāi)源代碼 Linux。3) 中間件 隔離上層應(yīng)用層與底層操作系統(tǒng)及硬件的軟件適配層。中間件的核心模塊主要包括:( 1) 瀏覽器 : 從服務(wù)器端獲得 URL ,并將對(duì)應(yīng)的EPG 頁(yè)面顯示出來(lái)。( 2) 圖形用戶界面管理:為應(yīng)用程序提供用戶界面控制(如按鈕 、列表)以及圖形圖像繪制等圖形功能。4)應(yīng)用層 實(shí)現(xiàn)對(duì)音、頻媒體文件的播放。
1. 2 IPTV 機(jī)頂盒流媒體播放器系統(tǒng)結(jié)構(gòu)
Live555開(kāi)源代碼中playCommon.cpp 實(shí)現(xiàn)了以電腦作為接收終端 ,用VLC軟件進(jìn)行接收并播放 ,最后在電腦上顯示出 來(lái) 的 功 能。研 究 的 內(nèi) 容 是 將 playCommon.cpp 融合到機(jī)頂盒的軟件代碼中,最終實(shí)現(xiàn)以IPTV 機(jī)頂盒作為接收終端并對(duì)其進(jìn)行播放,并在電視上顯示出來(lái)的功能。這就對(duì)代碼的設(shè)計(jì)提出了新的要求:一方面 ,playCommon.cpp 獲得服務(wù)器的URL 是通過(guò)在 VLC的RTSP 一欄中輸入rtsp ://本機(jī) IP 地址:端口號(hào)/要播放的文件名來(lái)獲取的。然而對(duì)于IPTV 機(jī)頂盒,傳輸模塊獲得的URL是用戶通過(guò)遙控器選擇EPG上的節(jié)目時(shí)對(duì)應(yīng)的URL.這個(gè) URL是通過(guò)中間件中的瀏覽器讀取的,因此這就需要將中間件和傳輸模塊銜接起來(lái)。另一方面playCommon.cpp 發(fā)送出來(lái)的數(shù)據(jù)流是通過(guò)VLC接收并播放的 ,而對(duì)于IPTV機(jī)頂盒 ,傳輸模塊發(fā)送出來(lái)的數(shù)據(jù)流是通過(guò)播放模塊接收并播放的 .因此就需要銜接傳輸模塊和播放模塊。
為了銜接中間件、輸模塊和播放模塊,設(shè)計(jì)了消息隊(duì)列,以實(shí)現(xiàn)這3個(gè)模塊間的數(shù)據(jù)通信。另外程序中還設(shè)計(jì)了 pt hread create ()來(lái)創(chuàng)建線程 rt spmain(),實(shí)現(xiàn)程序的并發(fā)。IPTV 播放器的系統(tǒng)構(gòu)架見(jiàn)圖2。
圖2 IPTV 播放器的系統(tǒng)構(gòu)架
1.3 程序結(jié)構(gòu)分析
1.3.1 傳輸模塊。
1) main 函數(shù) (1) void initMsgQ ()初始化消息隊(duì)列。dataQid 代表數(shù)據(jù)的消息隊(duì)列 ,裝著一些在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù) ,最后通過(guò) void send data to player ()函數(shù)將消息隊(duì)列中的數(shù)據(jù)發(fā)送至播放器。msgkeyQid代表消息鍵值的消息隊(duì)列 ,傳輸模塊接收從中間件獲得的遙控器鍵值指令 ,并發(fā)送至播放器以實(shí)現(xiàn)快進(jìn) 、快退 、 停 、播放等操作。fromeMiddleQid 代表中間件的消息隊(duì)列,傳輸模塊接收從中間件發(fā)來(lái)的 URL,作為客戶端播放器向服務(wù)器請(qǐng)求數(shù)據(jù)時(shí)的目的地址。playerStateQid 代表播放狀態(tài)的消息隊(duì)列,傳輸模塊用來(lái)收發(fā)播放器的狀態(tài), 控制播放器是點(diǎn)播 、直播還是時(shí)移。(2) phread_create(&g_session_thread_info ,&tattr,(void*(*)(void*))rtsp_main ,(void*)&urlInform);創(chuàng)建rtsp_main()線程。保證消息隊(duì)列的通信和流媒體的傳輸同時(shí)運(yùn)行。
2) rtsp_main 函數(shù)。(1) recvMiddlewareMsg(fromeMiddleQid,url):從中間件傳遞url的值賦給變量url.(關(guān)于url的定義是在中間件里完成的,因此需要從中間件獲得);(2)playCommon.cpp中的函數(shù):客戶端向服務(wù)器發(fā)出請(qǐng)求時(shí),服務(wù)器響應(yīng)請(qǐng)求,創(chuàng)建媒體會(huì)話并播放數(shù)據(jù)流。(3) main_player_entry(gTrans. first Create):客戶端接收流并調(diào)用播放器的入口函數(shù),對(duì)播放器進(jìn)行初始化配置。(4) void send_data_to_player():調(diào)用播放器 ,將從網(wǎng)上接收來(lái)的數(shù)據(jù)發(fā)送至播放器,并開(kāi)始播放。
1. 3. 2 播放模塊
播放模塊如圖 3 所示 ,主要完成點(diǎn)播、直播、時(shí)移模式下文件的播放以及對(duì)播放狀態(tài)的控制, 如快進(jìn)、快退、暫停、播放等。1 )process_playback_state( )根據(jù)點(diǎn)播 、直播、時(shí)移調(diào)用不同的函數(shù),相同的是要設(shè)置音視頻同 步 .2) handle_playback_state(state,time) 設(shè)置不同的時(shí)間戳 ( state Tmp . multiple) 來(lái)控制播放狀態(tài)。
圖3 播放模塊結(jié)構(gòu)圖
2 結(jié) 語(yǔ)
IPTV 機(jī)頂盒軟件功能模塊主要包括: 流媒體的傳輸模塊,媒體播放器模塊,電子節(jié)目菜單模塊, WEB瀏覽器模塊。其中,流媒體的傳輸模塊、媒體播放器模塊合起來(lái)構(gòu)成機(jī)頂盒播放器; 電子節(jié)目菜單模塊、WEB 瀏覽器模塊合起來(lái)構(gòu)成中間件的基本模塊。研究的重點(diǎn)就是播放器。運(yùn)用設(shè)計(jì)的方法制作的IPTV機(jī)頂盒已經(jīng)生產(chǎn)出來(lái),并且經(jīng)測(cè)試性能穩(wěn)定。