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