IPTV機(jī)頂盒終端技術(shù)說明_第1頁
IPTV機(jī)頂盒終端技術(shù)說明_第2頁
IPTV機(jī)頂盒終端技術(shù)說明_第3頁
IPTV機(jī)頂盒終端技術(shù)說明_第4頁
IPTV機(jī)頂盒終端技術(shù)說明_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、IPTV機(jī)頂盒終端技術(shù)說明1 引言機(jī)頂盒終端可以實(shí)現(xiàn)“網(wǎng)絡(luò)電視”的功能,具有良好的人機(jī)交互界面,方便用戶操作。具體為:終端接收來自IPTV平臺(tái)服務(wù)器的音頻視頻流,將音視頻流解碼并將碼流輸出到電視上顯示。用戶采用遙控器來實(shí)現(xiàn)所有的操作功能。終端功能如下:Ø 實(shí)現(xiàn)網(wǎng)絡(luò)電視功能,即通過建立多個(gè)頻道接收不同類型節(jié)目的音頻/視頻流,支持的媒體解碼格式包括:MP3、WMA/WMV、MPEG-2、MPEG-4、AVI。Ø 實(shí)現(xiàn)VOD(視頻點(diǎn)播),用戶可以根據(jù)喜好自行點(diǎn)播喜愛的電影。支持的媒體解碼格式同上。Ø 實(shí)現(xiàn)硬盤數(shù)字播放器功能,通過外接SATA硬盤,終端可以直接讀取硬盤媒體

2、內(nèi)容并播放。支持的媒體解碼格式同上。Ø 實(shí)現(xiàn)圖片瀏覽功能,用戶可隨意瀏覽移動(dòng)存儲(chǔ)介質(zhì)中的圖片,支持的圖片格式包括:PNG,JPG,GIF,BMP。Ø 實(shí)現(xiàn)家庭視頻監(jiān)控功能,通過外接攝像頭可以記錄被監(jiān)控區(qū)域的圖像變化并保存在外接存儲(chǔ)設(shè)備上。Ø 實(shí)現(xiàn)用戶對(duì)系統(tǒng)參數(shù)的自由調(diào)節(jié)。Ø 實(shí)現(xiàn)業(yè)務(wù)分級(jí)的節(jié)目管理控制。2 終端系統(tǒng)終端由流媒體編解碼芯片(DSP)、流媒體接入模塊與流媒體接入軟件平臺(tái)構(gòu)成。研發(fā)工作分為兩部分:研制支持多種編解碼格式的流媒體編解碼芯片;編寫支持硬件平臺(tái)運(yùn)行,可實(shí)現(xiàn)良好人機(jī)交互的流媒體接入軟件平臺(tái)。2.1 終端的層次結(jié)構(gòu)圖.1 終端系統(tǒng)的層次結(jié)

3、構(gòu)整個(gè)終端的層次結(jié)構(gòu)如圖.1所示,分為三個(gè)層次:內(nèi)核層:主要包括流媒體接入模塊的硬件與流媒體解碼芯片(機(jī)頂盒硬件),中間層:包括一個(gè)用于音視頻直播/點(diǎn)播使用的視頻傳輸協(xié)議棧;用于驅(qū)動(dòng)流媒體解碼芯片的驅(qū)動(dòng)程序和外接存儲(chǔ)設(shè)備以及攝像頭的驅(qū)動(dòng)程序;用于繪制界面、將解碼后的數(shù)據(jù)顯示并輸出到電視上的DirectFB庫。應(yīng)用層:包括基于中間層開發(fā)的一個(gè)核心主程序以及模塊化的各個(gè)模塊。2.2 流媒體接入軟件的系統(tǒng)結(jié)構(gòu)圖.1 終端的系統(tǒng)結(jié)構(gòu)由于嵌入式平臺(tái)下面沒有集成類似MFC的基礎(chǔ)類庫和完善的消息響應(yīng)機(jī)制,故我們借助于DirectFB實(shí)現(xiàn)了一套自己的事件響應(yīng)、處理機(jī)制。下面詳細(xì)述之。用戶事件緩沖區(qū):基于Dir

4、ectFB庫的一個(gè)事件緩沖區(qū),內(nèi)建了遙控器、鍵盤、鼠標(biāo)等事件的二進(jìn)制碼,在程序中會(huì)根據(jù)事先定義好的命令碼將用戶事件的二進(jìn)制碼轉(zhuǎn)化為預(yù)定義的命令碼,機(jī)頂盒終端只解析這些命令碼,具體碼表.2如下:命令碼功能命令碼功能commandMenu,顯示菜單commandDigit0數(shù)字 0 commandUp向上方向鍵commandDigit1數(shù)字 1commandDown向下方向鍵commandDigit2數(shù)字 2commandLeft向左方向鍵commandDigit3數(shù)字 3commandRight向右方向鍵commandDigit4數(shù)字 4commandPrevious選擇前一級(jí)菜單command

5、Digit5數(shù)字 5commandChannelUp選擇上一頻道commandDigit6數(shù)字 6commandChannelDown選擇下一頻道commandDigit7數(shù)字 7commandVolume顯示音量進(jìn)度條commandDigit8數(shù)字 8commandVolumeUp增大音量commandDigit9數(shù)字 9commandVolumeDown減小音量commandShutdown關(guān)機(jī)commandMute靜音commandPause播放中暫停commandOK確定commandFullscreen全屏commandInfo顯示所選節(jié)目/頻道的信息commandNone空命令表.

6、2 機(jī)頂盒接收的命令碼表應(yīng)用程序全局環(huán)境配置表:將一些全局需要的環(huán)境變量集中起來管理,在程序中具體為一個(gè)名為appControlInfo的數(shù)據(jù)結(jié)構(gòu)。其包含的各個(gè)數(shù)據(jù)成員(全局環(huán)境變量參數(shù))如表.3:環(huán)境變量說明audioStatus描述音量狀態(tài)(是否為靜音)ipInfoscreenOutputs包含2個(gè)成員的數(shù)組,分別描述直播/點(diǎn)播播放的狀態(tài)及網(wǎng)絡(luò)信息soundInfo描述音量與音頻解碼選項(xiàng)的信息mediaInfo描述本地媒體文件的信息digitInfo描述使用遙控器時(shí)數(shù)字按鍵狀態(tài)的信息timeInfo描述時(shí)間信息pictureInfo描述設(shè)置圖像的信息outputInfo描述輸出圖像選項(xiàng)的信

7、息imageInfo描述本體圖片文件的信息scanActive目前未使用timeout描述流媒體解碼芯片內(nèi)部連接超時(shí)的標(biāo)志displayCount描述顯示圖層的個(gè)數(shù)enableWatchdog是否啟用watchdog線程表.3 全局環(huán)境變量表應(yīng)用程序管理器:負(fù)責(zé)整個(gè)程序的總體管理,如各個(gè)模塊的初始化以及退出的銷毀工作,其核心為一個(gè)消息命令循環(huán)。通過判斷一個(gè)消息命令開關(guān)是否為真來決定是否繼續(xù)執(zhí)行消息命令的循環(huán)。其消息循環(huán)機(jī)制如圖.4所示:圖.4 應(yīng)用程序管理器的消息循環(huán)機(jī)制菜單結(jié)構(gòu)與控制模塊:構(gòu)建菜單(如菜單的大小,顏色,邊框等參數(shù)),菜單的跳轉(zhuǎn)控制等操作。機(jī)頂盒的流媒體接入軟件平臺(tái)的菜單結(jié)構(gòu)是

8、一個(gè)狀態(tài)機(jī),如圖.5所示:圖.5 菜單結(jié)構(gòu)狀態(tài)轉(zhuǎn)移圖每一個(gè)菜單界面是一個(gè)結(jié)構(gòu)體menuContainer,記錄了菜單的一些基本參數(shù)。其成員如下表.6所示:成員名稱說明_menuContainer *prev一個(gè)指向自己前一個(gè)菜單的指針,通過記錄自己的前一個(gè)菜單來實(shí)現(xiàn)菜單的跳轉(zhuǎn)int width定義了菜單的寬度int height定義了菜單的高度int posX定義菜單左上角的x坐標(biāo)int posY定義菜單左上角的y坐標(biāo)int highlight菜單目前是否高亮int selected菜單目前是否被選中int numEntries菜單包含幾個(gè)菜單項(xiàng)int firstShownIndex菜單中的第

9、一個(gè)顯示的菜單項(xiàng)索引int lastShownIndex菜單中的最后一個(gè)顯示的菜單項(xiàng)索引menuEntry menuEntryNUM_MENU_ENTRIES菜單中菜單項(xiàng)構(gòu)成的數(shù)組menuHighlightFunction *pHighlight高亮菜單項(xiàng)的執(zhí)行動(dòng)作函數(shù)menuDrawFunction *pDraw菜單的自繪制函數(shù)表.6 menuContainer結(jié)構(gòu)的成員描述表其中menuEntry表示一個(gè)菜單項(xiàng),同樣它記錄了一個(gè)菜單項(xiàng)所擁有的一些基本參數(shù)。其成員如下表.7所示:成員名稱說明char infoMENU_ENTRY_INFO_LENGTH菜單項(xiàng)的描述信息char iconMEN

10、U_ENTRY_ICONNAME_LENGTH菜單項(xiàng)的圖標(biāo)的描述信息menuActionFunction *pAction菜單項(xiàng)的執(zhí)行動(dòng)作函數(shù)void *pArg傳遞給執(zhí)行動(dòng)作函數(shù)的參數(shù)表.7 menuEntry結(jié)構(gòu)的成員描述表網(wǎng)絡(luò)傳輸模塊:接收并處理來自網(wǎng)絡(luò)的數(shù)據(jù)流。媒體播放模塊:包含了直播/點(diǎn)播/本地播放的解碼播放處理與控制。移動(dòng)檢測模塊:包含了啟動(dòng)監(jiān)控設(shè)備、監(jiān)控區(qū)域的圖像采集、圖像碼流轉(zhuǎn)碼、圖片比較分析、圖片顯示、整個(gè)模塊的控制等功能。詳細(xì)技術(shù)說明見3.2。圖片瀏覽模塊:分幻燈片與縮略圖兩種模式瀏覽圖片。系統(tǒng)設(shè)置模塊:分別實(shí)現(xiàn)對(duì)系統(tǒng)視頻的亮度、對(duì)比度、飽和度、音量的設(shè)置。圖形圖像顯示模塊

11、:使用封裝好的DirectFB API接口直接將圖形圖像數(shù)據(jù)解碼并顯示。2.3 終端初始化 應(yīng)用程序管理器應(yīng)用程序管理器為整個(gè)終端軟件平臺(tái)的核心,負(fù)責(zé)終端軟件應(yīng)用平臺(tái)與操作系統(tǒng)的交互;接收用戶的響應(yīng)并分發(fā)命令給相應(yīng)的模塊執(zhí)行;初始化并銷毀各個(gè)模塊。其初始化過程和銷毀流程并非一一對(duì)應(yīng),原因主要是很多在堆棧中分配的空間會(huì)隨著程序退出自動(dòng)銷毀,只有在堆上分配的空間才需要手工銷毀。如涉及DirectFB的各個(gè)菜單與模塊,隨著DirectFB的銷毀會(huì)自動(dòng)銷毀。其處理流程為圖.1所示:圖.1 應(yīng)用程序管理器流程以下幾個(gè)小結(jié)分別就重要的操作進(jìn)行詳細(xì)敘述。 遠(yuǎn)程登錄與EPG光纖到戶流媒體接入系統(tǒng)支持用戶認(rèn)證與

12、業(yè)務(wù)分級(jí)管理機(jī)制。通過在機(jī)頂盒終端內(nèi)嵌用戶名與授權(quán)密碼,可以對(duì)用戶進(jìn)行身份授權(quán)認(rèn)證,通過查詢用戶在服務(wù)器端的用戶等級(jí),可以實(shí)現(xiàn)不同用戶有不同業(yè)務(wù)級(jí)別的分級(jí)管理機(jī)制,即不同級(jí)別的用戶獲取的EPG節(jié)目信息并不相同,可以收看的節(jié)目、使用的功能也不相同,從而實(shí)現(xiàn)了業(yè)務(wù)分級(jí)管理。終端機(jī)頂盒首先登錄服務(wù)器端系統(tǒng)獲取EPG節(jié)目信息數(shù)據(jù)(點(diǎn)播節(jié)目信息與直播節(jié)目信息),然后通過人機(jī)界面交互模塊將節(jié)目信息顯示到界面供用戶選擇。終端遠(yuǎn)程登錄服務(wù)器端并獲取EPG的流程如圖.1所示:圖.1 終端遠(yuǎn)程登錄服務(wù)器并獲取EPG流程(0.1&1)客戶端網(wǎng)絡(luò)連接初始化&客戶端登錄驗(yàn)證:由于傳送的EPG節(jié)目信息為文

13、本信息,故客戶端與服務(wù)器端的連接采用可靠的TCP傳送,服務(wù)器端通過固化的驗(yàn)證字符串對(duì)客戶端進(jìn)行驗(yàn)證。目前暫定的格式為:LOG#usernamepassword。如:LOG#whu12345。其初始化流程主要如圖.2所示:圖.2 客戶端網(wǎng)絡(luò)連接初始化流程(2)驗(yàn)證用戶信息: 驗(yàn)證過程主要由服務(wù)器端通過數(shù)據(jù)庫的查詢來對(duì)客戶端進(jìn)行驗(yàn)證。其驗(yàn)證過程如圖.3所示:圖.3 服務(wù)器端對(duì)客戶端的驗(yàn)證過程(5)客戶端存儲(chǔ)EPG數(shù)據(jù)到本地:EPG文件格式存儲(chǔ)為文本格式,一共有2個(gè),LIVE.TXT存儲(chǔ)直播節(jié)目信息。VOD.TXT存儲(chǔ)點(diǎn)播節(jié)目信息。其格式分別如圖格式:ChannelEntrychannelnameu

14、rlpidvpidapidpvformataformatchannel_descriptionprograms_contains_by_channelprogramname1programname2示例:ChannelEntryTiYuurl=rtsp:/192.168.101.188:554/musicpidv=1000pida=1002pidp=0fffvformat=0003aformat=0001entertainment channelprogNum=3dangerous_gameFor_My_Dearzc2圖.4 直播節(jié)目信息格式格式:VoDEntryprogramnameurlp

15、idvpidapidpvformataformatprogram,_description示例:VoDEntryMr.Smith.by.20th.FOXurl=rtsp:/192.168.101.188:8554/0122pidv=0044pida=0045pidp=0044vformat=0003aformat=0002Mr.Smith is a movie which describes a killer couple.圖.4 點(diǎn)播節(jié)目信息格式對(duì)于任何一個(gè)直播節(jié)目和點(diǎn)播節(jié)目,都是采用ts流格式對(duì)原有的音視頻流進(jìn)行封裝,而對(duì)ts碼流進(jìn)行解碼,需要提供5個(gè)參數(shù)。它們分別是video_pid,

16、audio_pid, pcr_pid, video_type, audio_type。分別對(duì)應(yīng)上述的pidv,pida,pidp,vformat,aformat。(6)客戶端解析EPG數(shù)據(jù):將EPG文件解析為系統(tǒng)所要求的數(shù)據(jù)結(jié)構(gòu)。 初始化DirectFBDirectFB是流媒體接入軟件中圖像顯示的核心技術(shù),同時(shí)為上層應(yīng)用提供了音視頻解碼的接口調(diào)用,使得音視頻編解碼器的開發(fā)和上層應(yīng)用開發(fā)完全隔離開來,方便了系統(tǒng)的擴(kuò)展并縮短了應(yīng)用開發(fā)的周期。下面就DirectFB的初始化工作做一個(gè)詳細(xì)的介紹。其初始化流程如圖.1所示:圖.1 DirectFB的初始化流程Ø 創(chuàng)建IDirectFB對(duì)象:任

17、何一個(gè)使用DirectFB進(jìn)行顯示操作的應(yīng)用都需要首先創(chuàng)建一個(gè)IDirectFB對(duì)象,它為整個(gè)DirectFB操作提供接口。Ø 設(shè)置DirectFB的操作級(jí)別:將操作級(jí)別設(shè)置為全屏,因?yàn)樵陔娨暽巷@示的圖像為全屏顯示。Ø 創(chuàng)建IDirectFBSurface對(duì)象:surface對(duì)象的接口,為渲染,狀態(tài)控制,緩沖操作和調(diào)色板等提供操作接口。Ø 創(chuàng)建字體對(duì)象:創(chuàng)建字體并設(shè)置字體的大小、內(nèi)容和編碼格式。Ø 獲取IDirectScreen對(duì)象:IDirectScreen是不同顯示輸出、編碼器等的操作接口。Ø 獲取顯示層的個(gè)數(shù):終端的DirectFB共有5

18、層。編號(hào)為04,其中:0層為主層(fb_layer),2層為圖像層(image_layer),3層為畫中畫層(pip_layer),4層為視頻顯示主層(main_layer)。(詳細(xì)解釋見3.1)Ø 1層暫時(shí)未用。上述4層按照0層在最上層,4層在最下層的順序疊加。故當(dāng)設(shè)置上面一層為透明時(shí)可以看到它下面一層的內(nèi)容。Ø 獲取輸出配置的參數(shù):將獲取的輸出配置參數(shù)直接寫入應(yīng)用程序全局環(huán)境配置表。Ø 清屏準(zhǔn)備顯示:實(shí)際上是在主層上繪制一個(gè)標(biāo)準(zhǔn)的全屏黑屏直接將其他層內(nèi)容全部覆蓋。Ø 執(zhí)行雙緩沖互換操作并顯示:DirectFB顯示操作的一個(gè)特點(diǎn)支持雙緩沖(甚至三緩沖)

19、直接操作硬件的特點(diǎn),將準(zhǔn)備好的緩沖區(qū)內(nèi)容通過IDirectFBSurface接口直接輸出顯示。 建立信號(hào)處理器終端中直接調(diào)用Linux內(nèi)核的signal函數(shù)將3個(gè)信號(hào)綁定到同一個(gè)信號(hào)處理器上,這個(gè)信號(hào)處理器用于終止主程序的命令循環(huán),實(shí)際上就是退出程序。signal函數(shù)原型如下:sighandler_t signal (int signum, sighandler_t action)signum為綁定的信號(hào),action為被綁定的信號(hào)處理器。sighandler_t為信號(hào)處理器函數(shù)的類型。綁定的3個(gè)信號(hào)分別為:SIGINT:用戶按下Ctrl-c產(chǎn)生的中斷信號(hào)SIGTERM:引起程序中斷的通用中斷

20、信號(hào)SIGSEGV:內(nèi)存非法讀寫產(chǎn)生的信號(hào)當(dāng)系統(tǒng)捕獲到上述三種信號(hào)時(shí),通過信號(hào)處理器signal_handler將keepCommandLoopAlive標(biāo)識(shí)置為0來退出程序的循環(huán)。 初始化圖片瀏覽圖片瀏覽模塊有一個(gè)屬于自身的一個(gè)控制環(huán)境配置表,如表.1所示:成員名稱說明int state圖片瀏覽狀態(tài)int keepAlive是否持續(xù)瀏覽pthread_t thread瀏覽圖片的線程標(biāo)識(shí)displayWidth瀏覽圖片的顯示區(qū)域?qū)挾萪isplayHight瀏覽圖片的顯示區(qū)域高度char directory1024圖片所處目錄int imageFile當(dāng)前圖片的文件句柄int filter過濾選

21、項(xiàng)int thumb方陣的個(gè)數(shù)int immediate立即切換圖片選項(xiàng)int userFlickerFiltering是否防止顯示圖片抖動(dòng)IDirectFBSurface* pImageBuffer動(dòng)態(tài)創(chuàng)建的存儲(chǔ)圖片數(shù)據(jù)surface對(duì)象指針I(yè)DirectFBSurface* pFrameBuffer硬件圖片緩沖區(qū)的surface對(duì)象指針表.1 圖片瀏覽模塊的控制環(huán)境配置表在初始化圖片瀏覽模塊的過程中,首先對(duì)上述的控制環(huán)境配置表中的參數(shù)進(jìn)行初始化;然后獲取圖像層的層ID;然后將圖像層的透明度設(shè)置為255(即完全不透明);進(jìn)而獲取圖像層的配置信息并設(shè)置顯示區(qū)域矩形大小;然后通過圖像層的surf

22、ace對(duì)象獲取圖像層的緩沖區(qū)大小,設(shè)置緩沖區(qū)的背景色,填充緩沖區(qū);最后創(chuàng)建一個(gè)單獨(dú)用于對(duì)圖片進(jìn)行解碼的線程。整個(gè)流程如圖.2所示:圖.2 圖片瀏覽初始化模塊 初始化所有菜單菜單的初始化和菜單的繪制是兩個(gè)不同的概念,菜單的初始化是指構(gòu)建menuContainer和menuEntry中的各項(xiàng)參數(shù)內(nèi)容,而繪制則是通過使用DirectFB技術(shù)將構(gòu)建好的各個(gè)菜單顯示出來。菜單初始化按照從上而下的順序進(jìn)行初始化(構(gòu)建)。首先構(gòu)建頂級(jí)菜單,然后構(gòu)建各級(jí)菜單。各個(gè)菜單的構(gòu)建過程大同小異,基本上都有以下步驟,如圖.1所示:Ø 菜單menuContainer中的參數(shù)初始化:主要是指定菜單中的菜單項(xiàng)個(gè)數(shù);

23、指定本菜單的上一級(jí)菜單是哪一個(gè)(用于菜單回退跳轉(zhuǎn));指定菜單的起始菜單項(xiàng)索引和結(jié)束菜單項(xiàng)索引。Ø 設(shè)置菜單位置:設(shè)置菜單的左上角坐標(biāo)。Ø 設(shè)置菜單的繪制函數(shù):指定菜單進(jìn)行繪制、重新繪制的函數(shù)。格式一般為XXX_drawXXX。Ø 設(shè)置高亮選項(xiàng):高亮選項(xiàng)指當(dāng)前光標(biāo)停留的菜單項(xiàng),初始值為0。Ø 設(shè)置被選中選項(xiàng):被選中選項(xiàng)有別于高亮選項(xiàng),指通過OK鍵(enter鍵)選中的菜單項(xiàng)。Ø 顯示菜單:將初始化的菜單結(jié)構(gòu)顯示出來,一般顯示菜單的函數(shù)名稱的格式為XXX_displayXXX(具體的關(guān)于終端菜單繪制、顯示的細(xì)節(jié)見3.1)。圖.1 菜單初始化流程2.

24、4 命令循環(huán)設(shè)置一個(gè)循環(huán)標(biāo)識(shí)keepCommandLoopAlive。初始化為1。然后使用一個(gè)while循環(huán)控制整個(gè)循環(huán)。while ( keepCommandLoopAlive )/循環(huán)體整個(gè)循環(huán)流程如圖2.4.1所示:整個(gè)循環(huán)其中很重要的一個(gè)if判斷在于判斷是否存在滑動(dòng)條(pCurrentSilder是否為真),因?yàn)榛瑒?dòng)條本身是一個(gè)菜單(menuContainer),它作為音量、視頻文件播放進(jìn)度的控制單元和其他菜單一樣位于主層之上。不過它一般浮現(xiàn)于各級(jí)菜單之上。因此當(dāng)有滑動(dòng)條存在時(shí),它會(huì)臨時(shí)的建立與主層菜單之間的關(guān)系,所有存在與不存在滑動(dòng)條,對(duì)于某些命令而言其執(zhí)行的操作是不同的。另一個(gè)特殊

25、情況就是數(shù)字命令的執(zhí)行操作。當(dāng)使用遙控器直接按下數(shù)字鍵操作系統(tǒng)時(shí),可能存在連續(xù)按下2個(gè)鍵的情況(比如將音量調(diào)為78需要連續(xù)按下7和8,這時(shí)不是把音量調(diào)為7后再調(diào)為8)。在應(yīng)用程序配置環(huán)境表中有digitInfo這個(gè)參數(shù)結(jié)構(gòu)專門負(fù)責(zé)管理,這樣當(dāng)數(shù)字鍵狀態(tài)(digitInfo.active)為真時(shí),需要采取額外的操作。圖2.4.1 命令循環(huán)流程圖2.5 媒體播放媒體播放實(shí)際上涵蓋了本地影片播放、視頻直播、視頻點(diǎn)播三個(gè)模塊中關(guān)于媒體播放功能的總和。其主要是調(diào)用DirectFB中的VideoProvider接口類來完成播放功能。本小節(jié)主要描述終端中的媒體播放模塊如何將緩存中的媒體數(shù)據(jù)渲染到指定圖層上顯

26、示出來(播放操作)。凡直播和點(diǎn)播模塊中涉及網(wǎng)絡(luò)相關(guān)的操作(見3.3)一概略去不述。啟動(dòng)播放過程的核心為gfx_startVideoProvider函數(shù),其函數(shù)原型為:void gfx_startVideoProvider(char* videoSource, int videoLayer, int force, char* options): 該函數(shù)實(shí)現(xiàn)播放功能參數(shù)名:videoSource 視頻源的名稱 videoLayer 播放視頻所在圖層 force 是否強(qiáng)制從頭播放 options 附加選項(xiàng)返回值:無該函數(shù)主要調(diào)用更底層的DirectFB庫接口實(shí)現(xiàn)DSP解碼并反饋數(shù)據(jù)到幀緩沖中實(shí)現(xiàn)顯示

27、。具體的啟動(dòng)播放的流程如圖2.5.1所示:圖2.5.1 啟動(dòng)播放模塊的流程圖Ø 判斷文件或者URL的合法性:判斷播放的文件與流媒體播放中URL是否為正確的參數(shù),這樣可以防止系統(tǒng)播放非法的文件或其他錯(cuò)誤的URL,防止系統(tǒng)崩潰。Ø 關(guān)閉其他播放線程:由于可能存在多個(gè)播放線程,考慮實(shí)際應(yīng)用場景(用戶不可能同時(shí)觀看兩個(gè)節(jié)目),為保證系統(tǒng)穩(wěn)定性預(yù)先設(shè)計(jì)各線程同步的互斥量,這樣保證了系統(tǒng)中只能存在一個(gè)播放線程。所以播放啟動(dòng)前,事先強(qiáng)行關(guān)閉其他所有播放線程。Ø 獲取圖層ID:視頻播放有兩個(gè)層,4層和5層。視頻點(diǎn)播在4層;而本地播放和視頻直播在5層。Ø 設(shè)置播放區(qū)域大小

28、:由于播放存在全屏和預(yù)覽兩種模式,故在播放之前需要預(yù)先設(shè)定播放區(qū)域大小,預(yù)覽模式的目標(biāo)播放區(qū)域?yàn)橐粋€(gè)指定大小的非全屏矩形;而全屏模式的目標(biāo)播放區(qū)域?yàn)槿辆匦巍?#216; 設(shè)置應(yīng)用程序全局環(huán)境配置表:主要設(shè)置appInfo結(jié)構(gòu)中的ipInfo和mediaInfo兩個(gè)成員的某些參數(shù),如狀態(tài)信息。Ø 開始播放:調(diào)用底層的接口播放緩存中的數(shù)據(jù)。啟動(dòng)和停止播放都是通過OK鍵來操作,通過判斷mediaInfo或ipInfo中的active參數(shù)來判斷是否處于正在播放的過程之中,從而判斷是啟動(dòng)還是停止播放線程。2.6 圖片瀏覽圖片瀏覽是將存儲(chǔ)介質(zhì)上的圖片通過各種顯示模式顯示出來。顯示模式支持類似幻

29、燈片式的上開、下開、左開、右開等多種。核心操作控制函數(shù)為一個(gè)線程函數(shù)slideShow_Thread,通過預(yù)先設(shè)定的宏定義模式,其流程如圖2.6.1所示。圖2.6.1 圖片瀏覽線程slideShow_Thread流程圖keepAlive為是否持續(xù)slideShow_Thread線程的標(biāo)識(shí)。線程內(nèi)部共定義了幾種狀態(tài)標(biāo)識(shí),分別為IAMGE_STOP、IMAGE_START、IMAGE_DECODED、IMAGE_DISPLAY、IMAGE_EXIT。通過switch開關(guān)語句來依次實(shí)現(xiàn)狀態(tài)跳轉(zhuǎn)。對(duì)圖片實(shí)現(xiàn)解碼渲染的核心函數(shù)為decodeImage。函數(shù)內(nèi)通過DirectFB提供的關(guān)于圖片解碼的接口I

30、DirectFBImageProvider來實(shí)現(xiàn)圖片的解碼、渲染。最終將解碼后的圖片數(shù)據(jù)顯示出來是通過displayImage函數(shù)實(shí)現(xiàn)。displayImage實(shí)現(xiàn)了前述的多種圖片的瀏覽方式,如上開,下開,左開,右開等。流程如圖2.6.2。圖2.6.2 displayImage函數(shù)流程下面簡單說明左開方式的實(shí)現(xiàn)。在slideShowInfo控制結(jié)構(gòu)中有兩個(gè)參數(shù)pFrameBuffer和pImageBuffer。pImageBuffer存儲(chǔ)了解碼后的圖片數(shù)據(jù)。而pFrameBuffer則是系統(tǒng)設(shè)備上圖片層的surface對(duì)象指針。進(jìn)入不接循環(huán)緩沖處理中,逐步按照x方向坐標(biāo)拷貝pImageBuff

31、er中的數(shù)據(jù)至pFrameBuffer之中,如圖所示,每次拷貝一個(gè)豎形條狀矩形塊,順序?yàn)橄瓤截惿钌?,后拷貝淺色,這樣,配以適當(dāng)?shù)难訒r(shí)就形成了向左開的效果。最終pImageBuffer中的數(shù)據(jù)會(huì)全部拷貝到pFrameBuffer之中。實(shí)現(xiàn)了整幅圖片的顯示。其它模式的顯示原理與此類似。圖2.6.3 左開模式實(shí)現(xiàn)示意圖3 終端系統(tǒng)關(guān)鍵技術(shù)說明IPTV機(jī)頂盒終端是一個(gè)智能多媒體處理平臺(tái),這個(gè)平臺(tái)可以看作是一臺(tái)專門針對(duì)流媒體應(yīng)用的計(jì)算機(jī)。但是它明顯有別于普通的一般PC。主要區(qū)別在于它采用嵌入式芯片,針對(duì)特定的流媒體應(yīng)用。它包括以下三項(xiàng)關(guān)鍵技術(shù):嵌入式平臺(tái)的圖像顯示技術(shù);移動(dòng)檢測技術(shù);環(huán)形視頻緩沖區(qū)技術(shù)。

32、3.1 嵌入式平臺(tái)的圖像顯示技術(shù) 概述嵌入式環(huán)境下的圖像顯示技術(shù)不同于普通PC,普通PC有專門的顯卡來承擔(dān)相關(guān)的計(jì)算工作,但是嵌入式平臺(tái)限于體積、成本等特點(diǎn)不能配備獨(dú)立的顯卡。故我們采用DirectFB(Direct FrameBuffer)技術(shù),即直接操作顯示幀緩沖。DirectFB作為一項(xiàng)開源的技術(shù),專門應(yīng)用于Linux上具有FrameBuffer的設(shè)備之上。它是一個(gè)等同于QT、GTK+等開源技術(shù)的重量級(jí)庫,具有硬件圖形加速、輸入設(shè)備管理、多層顯示等功能。本平臺(tái)使用了DirectFB的架構(gòu),如圖所示:圖 DirectFB的架構(gòu)DirectFB使用的分層雙緩沖技術(shù)。即同時(shí)使用兩個(gè)幀緩沖區(qū)來加

33、快顯示過程,一個(gè)用于準(zhǔn)備顯示,另一個(gè)置入下一幀將要顯示的內(nèi)容。當(dāng)需要顯示下一幀時(shí),直接將緩沖指針切換到另一個(gè)幀緩沖。好像兩個(gè)緩沖不斷的交替裝載數(shù)據(jù)來實(shí)現(xiàn)顯示。另一方面,DirectFB具有多層顯示的功能,一般最多支持5層。DirectFB實(shí)現(xiàn)終端上的顯示功能通過兩種方式,一種是直接的繪制方式,這種一般直接通過IDirectFBSurface接口提供的各種接口操作函數(shù)如FillRectangle來實(shí)現(xiàn),主層(即0層)上可以實(shí)現(xiàn)任意圖像的繪制;另外的方式為渲染方式,是將視頻、圖片內(nèi)容渲染到圖層上顯示,其余幾層都為這種方式,使用的接口為DirectFB中的ImageProvider、VideoPro

34、vider等。渲染方式不允許在渲染的區(qū)域上直接繪制圖形。但是不論采用直接繪制方式還是渲染方式,都可以設(shè)定目標(biāo)顯示區(qū)域,即是否全屏或者非全屏。顯示的時(shí)候各層有一個(gè)疊加順序,0層在最上,4層在最下。如果想顯示下層的內(nèi)容,必須將上一層的alpha通道置為0。這樣下層的內(nèi)容自然浮現(xiàn)上來。下面著重闡述幾個(gè)關(guān)鍵的部分。 預(yù)覽窗口在直播、點(diǎn)播、本地影片都需要都視頻預(yù)覽,如果內(nèi)容滿足用戶需要才有必要全屏瀏覽。首先在主層上繪制頂級(jí)菜單后繪制一個(gè)小矩形用于作為預(yù)覽窗口,然后將矩形的透明度設(shè)為0,這樣視頻層的內(nèi)容就可以浮現(xiàn)上來,實(shí)現(xiàn)預(yù)覽效果,但是必須將預(yù)覽時(shí)的視頻目標(biāo)顯示區(qū)域設(shè)為上述的小矩形那般大小。 全屏播放全屏

35、播放需要將視頻層整個(gè)屏幕大小的內(nèi)容全部浮現(xiàn)上來,這時(shí)先要在主層上繪制一個(gè)全屏大小的透明菜單,并將這個(gè)菜單的前驅(qū)菜單設(shè)為當(dāng)前菜單。以便可以從全屏播放退回到預(yù)覽狀態(tài)。當(dāng)從預(yù)覽窗口切換到全屏播放時(shí),需要重新設(shè)置視頻播放層的目標(biāo)顯示區(qū)域大小從預(yù)覽窗口大小到全屏大小。 界面顯示過程每一個(gè)菜單界面都不相同,但是顯示過程的原理大同小異,繪制的差別在于每個(gè)menuContainer中的pDraw成員,這是一個(gè)專門繪制菜單自身的函數(shù),一般格式為XXX_drawXXX。當(dāng)所有菜單全部構(gòu)建完畢后(即完成所有的XXX_buildXXX函數(shù)之后)。調(diào)用menuApp_displayMain函數(shù),這個(gè)函數(shù)繼而調(diào)用menu

36、Infra_display函數(shù),傳給這個(gè)函數(shù)的參數(shù)的參數(shù)就是指向topLevelMenu(頂級(jí)菜單)的指針。而menuInfra_display函數(shù)則直接調(diào)用topLevelMenu自身的draw函數(shù)topLevel_drawMenu函數(shù)繪制自身。每次當(dāng)主界面發(fā)生改變時(shí),都會(huì)引起調(diào)用topLevel_drawMenu函數(shù)來重新繪制主界面。其他界面的繪制過程都以此類推。其關(guān)系如圖所示:圖 顯示函數(shù)的關(guān)系 菜單的切換菜單的切換通過定義每個(gè)menuContainer的prev成員變量實(shí)現(xiàn)。每當(dāng)切換到另一個(gè)菜單時(shí),首先在主層上繪制將要顯示的菜單,同時(shí)通過prev成員記錄下上一級(jí)菜單的指針,這樣就可以回

37、退到上一級(jí)菜單了。而prev的賦值一般在進(jìn)入某個(gè)菜單項(xiàng)的時(shí)候賦值。比如從頂級(jí)菜單進(jìn)入直播菜單。首先要對(duì)直播菜單項(xiàng)的pAction成員變量賦值。pAction就是選中菜單項(xiàng)時(shí)執(zhí)行的動(dòng)作。這里執(zhí)行的動(dòng)作就是執(zhí)行menuInfra_display(void*(&IpMenu)。3.2 移動(dòng)檢測技術(shù) 概述移動(dòng)檢測主要是用來監(jiān)控并記錄被監(jiān)控區(qū)域發(fā)生的場景變化,當(dāng)被監(jiān)控場景中發(fā)生了場景變化,終端可以發(fā)出報(bào)警信息并記錄場景變化中的關(guān)鍵場景快照?qǐng)D片。終端的這項(xiàng)功能可用于簡單的家庭視頻監(jiān)控,當(dāng)開啟終端切換到移動(dòng)檢測菜單,通過USB攝像頭來掃描室內(nèi)的情況,將讀取的圖像轉(zhuǎn)換成RGB格式的圖像信息,同時(shí)不斷運(yùn)

38、用移動(dòng)檢測技術(shù)來比較相鄰時(shí)間間隔中攝入圖像的亮度和色彩,如有明顯差別,則就表示有人或物體進(jìn)入或移動(dòng),便記錄這些存在差異的圖片到終端存儲(chǔ)設(shè)備上,同步顯示給終端用戶觀看。同時(shí)根據(jù)需要在檢測到場景變化的時(shí)候可以發(fā)出警報(bào)。 整體過程首先在系統(tǒng)的啟動(dòng)腳本中我們直接啟用了攝像頭的驅(qū)動(dòng)程序驅(qū)動(dòng)攝像頭工作,這實(shí)際上是初始化移動(dòng)檢測設(shè)備。然后用戶通過主界面進(jìn)入移動(dòng)檢測界面。整個(gè)移動(dòng)檢測模塊的核心是一個(gè)移動(dòng)檢測線程motion_start線程函數(shù),先給出其整個(gè)運(yùn)行流程圖.1:圖.1 motion_start移動(dòng)檢測線程流程圖 設(shè)備初始化驅(qū)動(dòng)攝像頭通過一個(gè)類quickCam實(shí)現(xiàn)。quickCam類包含以下成員變量和

39、成員函數(shù):成員名稱說明quickCam(string devname="/dev/video")與攝像頭建立連接quickCam()釋放開辟的緩存空間,與攝像頭斷開連接unsigned int set_fps (unsigned int fps)設(shè)置攝像頭的采樣頻率unsigned int get_fps (void)獲得攝像頭的采用頻率bool set_resolution (int width, int height)設(shè)置攝像頭的分辨率void get_resolution (int * width, int * height)獲得所采集圖片的寬和高unsigned c

40、har * get_buffer (void)獲得緩存原生圖片的地址size_t get_buffer_size (void)獲得圖片的大小unsigned char * get_rgbbuffer(void)獲取緩存RGB圖片的地址bool take_photo ()采集圖片bool yuv2rgb()將原生圖片轉(zhuǎn)換成RGB格式的圖像信息enum ERRCODE 列舉狀態(tài)信息:正常,出錯(cuò),警告等enum ERRCODE error返回 _error_codevoid _set_error設(shè)置_error_sring和_error_codevoid _unset_error(void)清除錯(cuò)誤

41、狀態(tài)信息string _error_string錯(cuò)誤描述enum ERRCODE _error_code錯(cuò)誤碼unsigned char * _buffer用以存儲(chǔ)原生圖片unsigned char * _rgb_buffer用以存儲(chǔ)RGB圖片int _fps攝像頭采樣頻率int _image_width采集圖片的寬度int _image_height采集圖片的高度static const float _bytes_per_pixel = 1.5每像素占字節(jié)數(shù)bool _sync_settings (void)同步設(shè)置攝像頭參數(shù)bool _setup_camera (void)啟動(dòng)攝像頭voi

42、d _usleep (unsigned long usecs)休眠usecs微秒int _devfd攝像頭設(shè)備描述符表.1 quickCam類攝像頭的具體初始化過程如圖.2所示:圖.2 攝像頭的初始化過程 圖像采集移動(dòng)檢測模塊采用的是快照式的檢測方式,故圖像采集就是攝像頭每隔一定的時(shí)間間隔便對(duì)被監(jiān)測場景取景一次,記錄在緩存中。其具體流程如圖.1所示:圖3.2.4.1 圖像采集流程圖攝像頭連接成功后,調(diào)用函數(shù)take_photo ()和yuv2rgb()分別來實(shí)現(xiàn)對(duì)場景的快照?qǐng)D像采集和圖像格式的轉(zhuǎn)換。take_photo ():完成對(duì)圖片的采集,具體過程為首先調(diào)用mmap()將磁盤文件映像到內(nèi)存

43、中;通過訪問被映射的內(nèi)存結(jié)構(gòu)體vmap就可以讀出攝像頭采集的圖片的寬、高和類型;在未出現(xiàn)任何異常的情況下,將采集到的圖片存儲(chǔ)到緩存_buffer中。最后,調(diào)用munmap解除內(nèi)存映像并把內(nèi)存釋放返回給操作系統(tǒng)。yuv2rgb():將原生圖像轉(zhuǎn)換成RGB格式的圖像信息,并將轉(zhuǎn)換后的圖片存儲(chǔ)到緩存_rgb_buffer中。繼而,按照預(yù)定的象素值和圖片格式來存儲(chǔ)圖像。其過程實(shí)際是一個(gè)拷貝過程。將緩沖區(qū)中的圖片信息拷貝到應(yīng)用程序中,然后再控制和處理圖片數(shù)據(jù)。該過程就是通過拷貝函數(shù)memcpy(imagesbuffer_pos, cam.get_rgbbuffer(), IMAGE_BUFFER)來完成

44、的。將轉(zhuǎn)換后的RGB圖像存儲(chǔ)在*images指針數(shù)組中,方便后期的圖像比較。當(dāng)*image中存滿五幅圖片時(shí),轉(zhuǎn)入detect_motion()函數(shù),比較五幅圖片的差異。 啟動(dòng)和停止移動(dòng)檢測移動(dòng)檢測菜單為motionMenu,啟動(dòng)移動(dòng)檢測菜單項(xiàng)的動(dòng)作函數(shù)為motion_threadstart,停止移動(dòng)檢測菜單項(xiàng)的動(dòng)作函數(shù)為motion_threadstop。移動(dòng)檢測模塊的啟動(dòng)/結(jié)束調(diào)用過程如圖.1所示:圖3.2.5.1 移動(dòng)檢測的啟動(dòng)/結(jié)束調(diào)用過程啟動(dòng)移動(dòng)檢測的動(dòng)作函數(shù)motion_threadstart的具體過程如圖.2所示:圖.2 啟動(dòng)移動(dòng)檢測的具體過程其中值得注意的是在創(chuàng)建移動(dòng)檢測線程之前

45、一般關(guān)閉其他所有的視頻播放線程,這樣既防止了資源競爭,也保證了系統(tǒng)的穩(wěn)定性。這里主要主要?jiǎng)?chuàng)建了兩個(gè)線程:motion_start和motionShow_start。下屬小節(jié)有詳細(xì)敘述。停止移動(dòng)檢測模塊由motion_threadstart函數(shù)完成。其具體流程如圖.3所示:圖.3 停止移動(dòng)檢測的具體過程 移動(dòng)檢測通過比較當(dāng)前幀與平均幀的亮度和RGB來判斷是否有移動(dòng)發(fā)生,當(dāng)其變化超過一定值時(shí),我們便認(rèn)為移動(dòng)發(fā)生,返回相應(yīng)值。平均幀的定義是將所有比較過的變化不大的幀信息總和取均值。幾個(gè)重要函數(shù)如下:int detect_motion(const int width, const int height

46、, const int no_images, const int current_image_pos, unsigned char *images): 該函數(shù)實(shí)現(xiàn)移動(dòng)檢測功能參數(shù)說明:width, height 待比較的圖片的寬和高 no_images 緩存中圖片的數(shù)目 current_image_pos 當(dāng)前指針 *images 用于存儲(chǔ)圖片的指針數(shù)組返回值 0:表示未檢測到移動(dòng); 1:表示檢測到了移動(dòng);intmotion_index(struct PixelpixelblockMOTION_DETECTION_BLOCKMOTION_DETECTION_BLOCK, unsigned sh

47、ort int mode)mode:用來表示獲取信息的類型,如:MOTION_DETECTION_INDEX_BRIGHTNESS、MOTION_DETECTION_INDEX_RED、MOTION_DETECTION_INDEX_BLUE等;返回值為 avg;通過調(diào)用int motion_index()來獲取當(dāng)前象素塊的亮度(brightness)和RGB顏色值的3個(gè)分量red、blue、green的信息,如下:并運(yùn)用到了int diff(int a, int b)函數(shù),用來比較圖片間的亮度和RGB,a: 用來表示平均值信息,如avg_brightness、avg_red、avg_blue等

48、;b: 用來表示當(dāng)前信息,如brightness、red、blue等;返回值為 a與b差異的絕對(duì)值。 其中MOTION_DETECTION_BRIGHTNESS,MOTION_DETECTION_RED等表示各信息分量的預(yù)定值。當(dāng)差異大于相應(yīng)的預(yù)定值時(shí),便返回1并存儲(chǔ)檢測到移動(dòng)時(shí)當(dāng)前images數(shù)組中的圖片。調(diào)用函數(shù)viod compress_jpeg()將imags數(shù)組中的RGB圖像轉(zhuǎn)換成JPG格式存儲(chǔ)在相應(yīng)的文件里。同時(shí),執(zhí)行函數(shù)insertMotionNode()將存儲(chǔ)的圖片名加到全局鏈表中。最后當(dāng)線程結(jié)束時(shí),釋放所有的緩存空間。流程如圖3.2.6.1所示:圖3.2.6.1 移動(dòng)檢測的流

49、程 圖像顯示線程在檢測到移動(dòng)后,為便于終端用戶觀看到實(shí)時(shí)監(jiān)測到的移動(dòng),在啟動(dòng)移動(dòng)檢測模塊時(shí)我們創(chuàng)建了一個(gè)image_motionShowThread顯示線程來實(shí)時(shí)反饋檢測到的移動(dòng),實(shí)際上就是將檢測到的移動(dòng)場景按照幻燈片的方式依次放映給終端用戶觀看。image_motionShowThread線程的運(yùn)行過程如圖3.2.7.1所示:圖3.2.7.1 image_motionShowThread線程流程圖 線程同步同步示意圖如圖3.2.8.1所示:圖3.2.8.1 移動(dòng)檢測線程同步示意圖motion_start線程在調(diào)用compress_jpeg()函數(shù)保存圖片后,將圖片的文件名插入到該鏈表中,更新

50、pMotionInsertTail;如此同時(shí),image_motionShowThread線程不斷檢測pMotionShowTail下面是否有新的結(jié)點(diǎn),若有則調(diào)用displayImage()函數(shù)在移動(dòng)檢測界面的顯示框里顯示下一幅圖片,同時(shí),更新pMotionShowTail指針;若沒有新圖片加入,則繼續(xù)檢測。3.3 視頻直播/點(diǎn)播與環(huán)形緩沖區(qū) 概述視頻點(diǎn)播、視頻直播都涉及到網(wǎng)絡(luò)相關(guān)的操作,2.4小節(jié)只說明了使用DirectFB實(shí)現(xiàn)具體播放的原理,而從網(wǎng)絡(luò)上接收數(shù)據(jù),緩存,流同步等操作都與緩沖區(qū)有關(guān),本小節(jié)闡明了如何利用環(huán)形緩沖區(qū)實(shí)現(xiàn)網(wǎng)絡(luò)流數(shù)據(jù)的接收,以及寫緩存線程、讀緩存線程的同步操作。終端接

51、收來自網(wǎng)絡(luò)的數(shù)據(jù),不可能直接送入DSP解碼芯片用于解碼顯示,必須首先存入緩沖區(qū)當(dāng)中,當(dāng)積累到一定的量時(shí)再將數(shù)據(jù)讀入DSP中。緩沖區(qū)一般為在RAM中開辟的一段空間。而RAM是一種隨機(jī)存儲(chǔ)設(shè)備,不具有數(shù)據(jù)讀寫循環(huán)的特性,故我們需要人工制定一種讀寫規(guī)范,使得數(shù)據(jù)的讀寫好像是使用一段環(huán)形存儲(chǔ)器,可以不斷循環(huán)讀寫以實(shí)現(xiàn)數(shù)據(jù)的正確緩沖。我們將這種技術(shù)稱之為環(huán)形緩沖區(qū)技術(shù)。由于視頻點(diǎn)播的原理與視頻直播一樣,區(qū)別僅僅在于EPG信息不一樣(點(diǎn)播較直播簡單)。故3.3小節(jié)僅闡述視頻直播。 視頻直播啟動(dòng)播放:直播首先通過函數(shù)ip_startVideo來初始化指定播放節(jié)目的解碼參數(shù)以及網(wǎng)絡(luò)參數(shù)(如IP地址和端口號(hào)),

52、然后通過函數(shù)ip_startIP來初始化DSP設(shè)備文件,并為設(shè)備文件設(shè)置適當(dāng)?shù)膮?shù)準(zhǔn)備接收數(shù)據(jù)流。最后創(chuàng)建一個(gè)從網(wǎng)絡(luò)上讀取數(shù)據(jù)的線程(即上圖中的線程1),線程函數(shù)為ip_main。整個(gè)播放啟動(dòng)過程完畢。如圖.1所示:圖.1 直播播放啟動(dòng)流程網(wǎng)絡(luò)實(shí)例:ip_instance。播放實(shí)例是一個(gè)全局的數(shù)據(jù)結(jié)構(gòu)。終端共有兩個(gè)播放實(shí)例,一個(gè)用于直播,一個(gè)用于點(diǎn)播。結(jié)構(gòu)如表3.3.2.2所示:成員名稱說明int fdaDSP設(shè)備文件描述符int fdvDSP設(shè)備文件描述符int fdpDSP設(shè)備文件描述符int selected是否選中struct dmx_pes_filter_params pesfilt

53、ervDSP視頻解碼參數(shù)選項(xiàng)struct dmx_pes_filter_params pesfilteraDSP音頻解碼參數(shù)選項(xiàng)struct dmx_pes_filter_params pesfilterpDSP pcr解碼參數(shù)選項(xiàng)int streamnumber節(jié)目流編號(hào)ip_stream_info stream_info節(jié)目流信息結(jié)構(gòu)pthread_t thread讀取網(wǎng)絡(luò)數(shù)據(jù)流ip_main線程的線程IDpthread_attr_t tattrip_main線程的線程屬性表.2 ip_instance結(jié)構(gòu)其中ip_stream_info是一個(gè)記錄單個(gè)節(jié)目(直播/點(diǎn)播)信息的結(jié)構(gòu),如表.3

54、所示:成員名稱說明char streamname256節(jié)目流名稱int pidaTS流視頻解碼參數(shù)int pidvTS流音頻解碼參數(shù)int pidpTS流PCR解碼參數(shù)int vformat視頻格式參數(shù)int aformat音頻格式參數(shù)int device設(shè)備編號(hào)char videoProviderName256DSP中demux設(shè)備文件名稱char inputDeviceName256DSP中dvr設(shè)備文件名稱unsigned int port節(jié)目的端口號(hào)char ip256節(jié)目流的ip地址表.3 ip_stream_info結(jié)構(gòu)函數(shù)ip_startVideo和ip_startIP的初始化工

55、作主要就是將上述兩個(gè)結(jié)構(gòu)的各個(gè)成員初始化。其中ip_stream_info中關(guān)于節(jié)目解碼的參數(shù)streamname、pida、pidv、pidp、vformat、aformat、port、ip都來自于從網(wǎng)絡(luò)上獲取的EPG節(jié)目單。直播EPG格式見圖.4。停止播放:通過函數(shù)ip_stopVideo實(shí)現(xiàn),流程如圖.4所示:圖.4 直播停止流程 環(huán)形緩沖區(qū)啟動(dòng)視頻直播時(shí)我們創(chuàng)建了ip_main線程用于接收網(wǎng)絡(luò)流數(shù)據(jù),ip_main線程接收的流數(shù)據(jù)實(shí)際上全部送入環(huán)形緩沖區(qū)。同時(shí)ip_main線程創(chuàng)建了讀取環(huán)形緩沖區(qū)的線程ip_feed。線程ip_feed讀取緩沖區(qū)中的數(shù)據(jù)并寫入DSP設(shè)備文件。線程ip_main與ip_feed通過POSIX線程標(biāo)準(zhǔn)進(jìn)行同步。環(huán)形緩沖區(qū)的示意圖如圖.1所示:圖.1 環(huán)形緩沖區(qū)示意圖RINGBUFFER_SIZE:環(huán)形緩沖區(qū)長度。dataBuffer:環(huán)形緩沖區(qū)的首指針。writePtr:ip_main線程進(jìn)行寫操作的指針。readPtr:ip_feed線程進(jìn)行讀操作的指針。dataLeft:緩沖區(qū)中writePtr指針與(dataBuffer+RINGBUFFER_SIZE)指針的距離差值。ip_main線程的寫操作由函數(shù)afterReading完成。afterRead

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論