版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、IPTV機頂盒終端技術(shù)說明1 引言機頂盒終端可以實現(xiàn)“網(wǎng)絡(luò)電視”的功能,具有良好的人機交互界面,方便用戶操作。具體為:終端接收來自IPTV平臺服務(wù)器的音頻視頻流,將音視頻流解碼并將碼流輸出到電視上顯示。用戶采用遙控器來實現(xiàn)所有的操作功能。終端功能如下:Ø 實現(xiàn)網(wǎng)絡(luò)電視功能,即通過建立多個頻道接收不同類型節(jié)目的音頻/視頻流,支持的媒體解碼格式包括:MP3、WMA/WMV、MPEG-2、MPEG-4、AVI。Ø 實現(xiàn)VOD(視頻點播),用戶可以根據(jù)喜好自行點播喜愛的電影。支持的媒體解碼格式同上。Ø 實現(xiàn)硬盤數(shù)字播放器功能,通過外接SATA硬盤,終端可以直接讀取硬盤媒體
2、內(nèi)容并播放。支持的媒體解碼格式同上。Ø 實現(xiàn)圖片瀏覽功能,用戶可隨意瀏覽移動存儲介質(zhì)中的圖片,支持的圖片格式包括:PNG,JPG,GIF,BMP。Ø 實現(xiàn)家庭視頻監(jiān)控功能,通過外接攝像頭可以記錄被監(jiān)控區(qū)域的圖像變化并保存在外接存儲設(shè)備上。Ø 實現(xiàn)用戶對系統(tǒng)參數(shù)的自由調(diào)節(jié)。Ø 實現(xiàn)業(yè)務(wù)分級的節(jié)目管理控制。2 終端系統(tǒng)終端由流媒體編解碼芯片(DSP)、流媒體接入模塊與流媒體接入軟件平臺構(gòu)成。研發(fā)工作分為兩部分:研制支持多種編解碼格式的流媒體編解碼芯片;編寫支持硬件平臺運行,可實現(xiàn)良好人機交互的流媒體接入軟件平臺。2.1 終端的層次結(jié)構(gòu)圖2.2.1.1 終端系
3、統(tǒng)的層次結(jié)構(gòu)整個終端的層次結(jié)構(gòu)如圖2.2.1.1所示,分為三個層次:內(nèi)核層:主要包括流媒體接入模塊的硬件與流媒體解碼芯片(機頂盒硬件),以及一個控制硬件的基本Linux內(nèi)核(版本2.6.xx)。中間層:包括一個用于音視頻直播/點播使用的視頻傳輸協(xié)議棧;用于驅(qū)動流媒體解碼芯片的驅(qū)動程序和外接存儲設(shè)備以及攝像頭的驅(qū)動程序;用于繪制界面、將解碼后的數(shù)據(jù)顯示并輸出到電視上的DirectFB庫。應(yīng)用層:包括基于中間層開發(fā)的一個核心主程序以及模塊化的各個模塊。2.2 流媒體接入軟件的系統(tǒng)結(jié)構(gòu)圖2.2.2.1 終端的系統(tǒng)結(jié)構(gòu)由于嵌入式平臺下面沒有集成類似MFC的基礎(chǔ)類庫和完善的消息響應(yīng)機制,故我們借助于Di
4、rectFB實現(xiàn)了一套自己的事件響應(yīng)、處理機制。下面詳細述之。用戶事件緩沖區(qū):基于DirectFB庫的一個事件緩沖區(qū),內(nèi)建了遙控器、鍵盤、鼠標等事件的二進制碼,在程序中會根據(jù)事先定義好的命令碼將用戶事件的二進制碼轉(zhuǎn)化為預(yù)定義的命令碼,機頂盒終端只解析這些命令碼,具體碼表2.2.2.2如下:命令碼功能命令碼功能commandMenu,顯示菜單commandDigit0數(shù)字 0 commandUp向上方向鍵commandDigit1數(shù)字 1commandDown向下方向鍵commandDigit2數(shù)字 2commandLeft向左方向鍵commandDigit3數(shù)字 3commandRight向右
5、方向鍵commandDigit4數(shù)字 4commandPrevious選擇前一級菜單commandDigit5數(shù)字 5commandChannelUp選擇上一頻道commandDigit6數(shù)字 6commandChannelDown選擇下一頻道commandDigit7數(shù)字 7commandVolume顯示音量進度條commandDigit8數(shù)字 8commandVolumeUp增大音量commandDigit9數(shù)字 9commandVolumeDown減小音量commandShutdown關(guān)機commandMute靜音commandPause播放中暫停commandOK確定commandFu
6、llscreen全屏commandInfo顯示所選節(jié)目/頻道的信息commandNone空命令表2.2.2.2 機頂盒接收的命令碼表應(yīng)用程序全局環(huán)境配置表:將一些全局需要的環(huán)境變量集中起來管理,在程序中具體為一個名為appControlInfo的數(shù)據(jù)結(jié)構(gòu)。其包含的各個數(shù)據(jù)成員(全局環(huán)境變量參數(shù))如表2.2.2.3:環(huán)境變量說明audioStatus描述音量狀態(tài)(是否為靜音)ipInfoscreenOutputs包含2個成員的數(shù)組,分別描述直播/點播播放的狀態(tài)及網(wǎng)絡(luò)信息soundInfo描述音量與音頻解碼選項的信息mediaInfo描述本地媒體文件的信息digitInfo描述使用遙控器時數(shù)字按鍵
7、狀態(tài)的信息timeInfo描述時間信息pictureInfo描述設(shè)置圖像的信息outputInfo描述輸出圖像選項的信息imageInfo描述本體圖片文件的信息scanActive目前未使用timeout描述流媒體解碼芯片內(nèi)部連接超時的標志displayCount描述顯示圖層的個數(shù)enableWatchdog是否啟用watchdog線程表2.2.2.3 全局環(huán)境變量表應(yīng)用程序管理器:負責整個程序的總體管理,如各個模塊的初始化以及退出的銷毀工作,其核心為一個消息命令循環(huán)。通過判斷一個消息命令開關(guān)是否為真來決定是否繼續(xù)執(zhí)行消息命令的循環(huán)。其消息循環(huán)機制如圖2.2.2.4所示:圖2.2.2.4 應(yīng)用
8、程序管理器的消息循環(huán)機制菜單結(jié)構(gòu)與控制模塊:構(gòu)建菜單(如菜單的大小,顏色,邊框等參數(shù)),菜單的跳轉(zhuǎn)控制等操作。機頂盒的流媒體接入軟件平臺的菜單結(jié)構(gòu)是一個狀態(tài)機,如圖2.2.2.5所示:圖2.2.2.5 菜單結(jié)構(gòu)狀態(tài)轉(zhuǎn)移圖每一個菜單界面是一個結(jié)構(gòu)體menuContainer,記錄了菜單的一些基本參數(shù)。其成員如下表2.2.2.6所示:成員名稱說明_menuContainer *prev一個指向自己前一個菜單的指針,通過記錄自己的前一個菜單來實現(xiàn)菜單的跳轉(zhuǎn)int width定義了菜單的寬度int height定義了菜單的高度int posX定義菜單左上角的x坐標int posY定義菜單左上角的y坐標
9、int highlight菜單目前是否高亮int selected菜單目前是否被選中int numEntries菜單包含幾個菜單項int firstShownIndex菜單中的第一個顯示的菜單項索引int lastShownIndex菜單中的最后一個顯示的菜單項索引menuEntry menuEntryNUM_MENU_ENTRIES菜單中菜單項構(gòu)成的數(shù)組menuHighlightFunction *pHighlight高亮菜單項的執(zhí)行動作函數(shù)menuDrawFunction *pDraw菜單的自繪制函數(shù)表2.2.2.6 menuContainer結(jié)構(gòu)的成員描述表其中menuEntry表示一個
10、菜單項,同樣它記錄了一個菜單項所擁有的一些基本參數(shù)。其成員如下表2.2.2.7所示:成員名稱說明char infoMENU_ENTRY_INFO_LENGTH菜單項的描述信息char iconMENU_ENTRY_ICONNAME_LENGTH菜單項的圖標的描述信息menuActionFunction *pAction菜單項的執(zhí)行動作函數(shù)void *pArg傳遞給執(zhí)行動作函數(shù)的參數(shù)表2.2.2.7 menuEntry結(jié)構(gòu)的成員描述表網(wǎng)絡(luò)傳輸模塊:接收并處理來自網(wǎng)絡(luò)的數(shù)據(jù)流。媒體播放模塊:包含了直播/點播/本地播放的解碼播放處理與控制。移動檢測模塊:包含了啟動監(jiān)控設(shè)備、監(jiān)控區(qū)域的圖像采集、圖像碼
11、流轉(zhuǎn)碼、圖片比較分析、圖片顯示、整個模塊的控制等功能。詳細技術(shù)說明見3.2。圖片瀏覽模塊:分幻燈片與縮略圖兩種模式瀏覽圖片。系統(tǒng)設(shè)置模塊:分別實現(xiàn)對系統(tǒng)視頻的亮度、對比度、飽和度、音量的設(shè)置。圖形圖像顯示模塊:使用封裝好的DirectFB API接口直接將圖形圖像數(shù)據(jù)解碼并顯示。2.3 終端初始化2.3.1 應(yīng)用程序管理器應(yīng)用程序管理器為整個終端軟件平臺的核心,負責終端軟件應(yīng)用平臺與操作系統(tǒng)的交互;接收用戶的響應(yīng)并分發(fā)命令給相應(yīng)的模塊執(zhí)行;初始化并銷毀各個模塊。其初始化過程和銷毀流程并非一一對應(yīng),原因主要是很多在堆棧中分配的空間會隨著程序退出自動銷毀,只有在堆上分配的空間才需要手工銷毀。如涉及
12、DirectFB的各個菜單與模塊,隨著DirectFB的銷毀會自動銷毀。其處理流程為圖2.3.1.1所示:圖2.3.1.1 應(yīng)用程序管理器流程以下幾個小結(jié)分別就重要的操作進行詳細敘述。2.3.2 遠程登錄與EPG光纖到戶流媒體接入系統(tǒng)支持用戶認證與業(yè)務(wù)分級管理機制。通過在機頂盒終端內(nèi)嵌用戶名與授權(quán)密碼,可以對用戶進行身份授權(quán)認證,通過查詢用戶在服務(wù)器端的用戶等級,可以實現(xiàn)不同用戶有不同業(yè)務(wù)級別的分級管理機制,即不同級別的用戶獲取的EPG節(jié)目信息并不相同,可以收看的節(jié)目、使用的功能也不相同,從而實現(xiàn)了業(yè)務(wù)分級管理。終端機頂盒首先登錄服務(wù)器端系統(tǒng)獲取EPG節(jié)目信息數(shù)據(jù)(點播節(jié)目信息與直播節(jié)目信息)
13、,然后通過人機界面交互模塊將節(jié)目信息顯示到界面供用戶選擇。終端遠程登錄服務(wù)器端并獲取EPG的流程如圖2.3.2.1所示:圖2.3.2.1 終端遠程登錄服務(wù)器并獲取EPG流程(0.1&1)客戶端網(wǎng)絡(luò)連接初始化&客戶端登錄驗證:由于傳送的EPG節(jié)目信息為文本信息,故客戶端與服務(wù)器端的連接采用可靠的TCP傳送,服務(wù)器端通過固化的驗證字符串對客戶端進行驗證。目前暫定的格式為:LOG#usernamepassword。如:LOG#whu12345。其初始化流程主要如圖2.3.2.2所示:圖2.3.2.2 客戶端網(wǎng)絡(luò)連接初始化流程(2)驗證用戶信息: 驗證過程主要由服務(wù)器端通過數(shù)據(jù)庫的查詢
14、來對客戶端進行驗證。其驗證過程如圖2.3.2.3所示:圖2.3.2.3 服務(wù)器端對客戶端的驗證過程(5)客戶端存儲EPG數(shù)據(jù)到本地:EPG文件格式存儲為文本格式,一共有2個,LIVE.TXT存儲直播節(jié)目信息。VOD.TXT存儲點播節(jié)目信息。其格式分別如圖2.3.2.4和2.3.2.5格式:ChannelEntrychannelnameurlpidvpidapidpvformataformatchannel_descriptionprograms_contains_by_channelprogramname1programname2示例:ChannelEntryTiYuurl=rtsp:/192
15、.168.101.188:554/musicpidv=1000pida=1002pidp=0fffvformat=0003aformat=0001entertainment channelprogNum=3dangerous_gameFor_My_Dearzc2圖2.3.2.4 直播節(jié)目信息格式格式:VoDEntryprogramnameurlpidvpidapidpvformataformatprogram,_description示例:VoDEntryMr.Smith.by.20th.FOXurl=rtsp:/192.168.101.188:8554/0122pidv=0044pida=0
16、045pidp=0044vformat=0003aformat=0002Mr.Smith is a movie which describes a killer couple.圖2.3.2.4 點播節(jié)目信息格式對于任何一個直播節(jié)目和點播節(jié)目,都是采用ts流格式對原有的音視頻流進行封裝,而對ts碼流進行解碼,需要提供5個參數(shù)。它們分別是video_pid, audio_pid, pcr_pid, video_type, audio_type。分別對應(yīng)上述的pidv,pida,pidp,vformat,aformat。(6)客戶端解析EPG數(shù)據(jù):將EPG文件解析為系統(tǒng)所要求的數(shù)據(jù)結(jié)構(gòu)。 2.3.3
17、 初始化DirectFBDirectFB是流媒體接入軟件中圖像顯示的核心技術(shù),同時為上層應(yīng)用提供了音視頻解碼的接口調(diào)用,使得音視頻編解碼器的開發(fā)和上層應(yīng)用開發(fā)完全隔離開來,方便了系統(tǒng)的擴展并縮短了應(yīng)用開發(fā)的周期。下面就DirectFB的初始化工作做一個詳細的介紹。其初始化流程如圖2.3.3.1所示:圖2.3.3.1 DirectFB的初始化流程Ø 創(chuàng)建IDirectFB對象:任何一個使用DirectFB進行顯示操作的應(yīng)用都需要首先創(chuàng)建一個IDirectFB對象,它為整個DirectFB操作提供接口。Ø 設(shè)置DirectFB的操作級別:將操作級別設(shè)置為全屏,因為在電視上顯示的
18、圖像為全屏顯示。Ø 創(chuàng)建IDirectFBSurface對象:surface對象的接口,為渲染,狀態(tài)控制,緩沖操作和調(diào)色板等提供操作接口。Ø 創(chuàng)建字體對象:創(chuàng)建字體并設(shè)置字體的大小、內(nèi)容和編碼格式。Ø 獲取IDirectScreen對象:IDirectScreen是不同顯示輸出、編碼器等的操作接口。Ø 獲取顯示層的個數(shù):終端的DirectFB共有5層。編號為04,其中:0層為主層(fb_layer),2層為圖像層(image_layer),3層為畫中畫層(pip_layer),4層為視頻顯示主層(main_layer)。(詳細解釋見3.1)Ø
19、1層暫時未用。上述4層按照0層在最上層,4層在最下層的順序疊加。故當設(shè)置上面一層為透明時可以看到它下面一層的內(nèi)容。Ø 獲取輸出配置的參數(shù):將獲取的輸出配置參數(shù)直接寫入應(yīng)用程序全局環(huán)境配置表。Ø 清屏準備顯示:實際上是在主層上繪制一個標準的全屏黑屏直接將其他層內(nèi)容全部覆蓋。Ø 執(zhí)行雙緩沖互換操作并顯示:DirectFB顯示操作的一個特點支持雙緩沖(甚至三緩沖)直接操作硬件的特點,將準備好的緩沖區(qū)內(nèi)容通過IDirectFBSurface接口直接輸出顯示。2.3.4 建立信號處理器終端中直接調(diào)用Linux內(nèi)核的signal函數(shù)將3個信號綁定到同一個信號處理器上,這個信號
20、處理器用于終止主程序的命令循環(huán),實際上就是退出程序。signal函數(shù)原型如下:sighandler_t signal (int signum, sighandler_t action)signum為綁定的信號,action為被綁定的信號處理器。sighandler_t為信號處理器函數(shù)的類型。綁定的3個信號分別為:SIGINT:用戶按下Ctrl-c產(chǎn)生的中斷信號SIGTERM:引起程序中斷的通用中斷信號SIGSEGV:內(nèi)存非法讀寫產(chǎn)生的信號當系統(tǒng)捕獲到上述三種信號時,通過信號處理器signal_handler將keepCommandLoopAlive標識置為0來退出程序的循環(huán)。2.3.5 初始化
21、圖片瀏覽圖片瀏覽模塊有一個屬于自身的一個控制環(huán)境配置表,如表2.3.5.1所示:成員名稱說明int state圖片瀏覽狀態(tài)int keepAlive是否持續(xù)瀏覽pthread_t thread瀏覽圖片的線程標識displayWidth瀏覽圖片的顯示區(qū)域?qū)挾萪isplayHight瀏覽圖片的顯示區(qū)域高度char directory1024圖片所處目錄int imageFile當前圖片的文件句柄int filter過濾選項int thumb方陣的個數(shù)int immediate立即切換圖片選項int userFlickerFiltering是否防止顯示圖片抖動IDirectFBSurface* pI
22、mageBuffer動態(tài)創(chuàng)建的存儲圖片數(shù)據(jù)surface對象指針I(yè)DirectFBSurface* pFrameBuffer硬件圖片緩沖區(qū)的surface對象指針表2.3.5.1 圖片瀏覽模塊的控制環(huán)境配置表在初始化圖片瀏覽模塊的過程中,首先對上述的控制環(huán)境配置表中的參數(shù)進行初始化;然后獲取圖像層的層ID;然后將圖像層的透明度設(shè)置為255(即完全不透明);進而獲取圖像層的配置信息并設(shè)置顯示區(qū)域矩形大?。蝗缓笸ㄟ^圖像層的surface對象獲取圖像層的緩沖區(qū)大小,設(shè)置緩沖區(qū)的背景色,填充緩沖區(qū);最后創(chuàng)建一個單獨用于對圖片進行解碼的線程。整個流程如圖2.3.5.2所示:圖2.3.5.2 圖片瀏覽初始
23、化模塊2.3.6 初始化所有菜單菜單的初始化和菜單的繪制是兩個不同的概念,菜單的初始化是指構(gòu)建menuContainer和menuEntry中的各項參數(shù)內(nèi)容,而繪制則是通過使用DirectFB技術(shù)將構(gòu)建好的各個菜單顯示出來。菜單初始化按照從上而下的順序進行初始化(構(gòu)建)。首先構(gòu)建頂級菜單,然后構(gòu)建各級菜單。各個菜單的構(gòu)建過程大同小異,基本上都有以下步驟,如圖2.3.6.1所示:Ø 菜單menuContainer中的參數(shù)初始化:主要是指定菜單中的菜單項個數(shù);指定本菜單的上一級菜單是哪一個(用于菜單回退跳轉(zhuǎn));指定菜單的起始菜單項索引和結(jié)束菜單項索引。Ø 設(shè)置菜單位置:設(shè)置菜單
24、的左上角坐標。Ø 設(shè)置菜單的繪制函數(shù):指定菜單進行繪制、重新繪制的函數(shù)。格式一般為XXX_drawXXX。Ø 設(shè)置高亮選項:高亮選項指當前光標停留的菜單項,初始值為0。Ø 設(shè)置被選中選項:被選中選項有別于高亮選項,指通過OK鍵(enter鍵)選中的菜單項。Ø 顯示菜單:將初始化的菜單結(jié)構(gòu)顯示出來,一般顯示菜單的函數(shù)名稱的格式為XXX_displayXXX(具體的關(guān)于終端菜單繪制、顯示的細節(jié)見3.1)。圖2.3.6.1 菜單初始化流程2.4 命令循環(huán)設(shè)置一個循環(huán)標識keepCommandLoopAlive。初始化為1。然后使用一個while循環(huán)控制整個循環(huán)
25、。while ( keepCommandLoopAlive )/循環(huán)體整個循環(huán)流程如圖2.4.1所示:整個循環(huán)其中很重要的一個if判斷在于判斷是否存在滑動條(pCurrentSilder是否為真),因為滑動條本身是一個菜單(menuContainer),它作為音量、視頻文件播放進度的控制單元和其他菜單一樣位于主層之上。不過它一般浮現(xiàn)于各級菜單之上。因此當有滑動條存在時,它會臨時的建立與主層菜單之間的關(guān)系,所有存在與不存在滑動條,對于某些命令而言其執(zhí)行的操作是不同的。另一個特殊情況就是數(shù)字命令的執(zhí)行操作。當使用遙控器直接按下數(shù)字鍵操作系統(tǒng)時,可能存在連續(xù)按下2個鍵的情況(比如將音量調(diào)為78需要連
26、續(xù)按下7和8,這時不是把音量調(diào)為7后再調(diào)為8)。在應(yīng)用程序配置環(huán)境表中有digitInfo這個參數(shù)結(jié)構(gòu)專門負責管理,這樣當數(shù)字鍵狀態(tài)(digitInfo.active)為真時,需要采取額外的操作。圖2.4.1 命令循環(huán)流程圖2.5 媒體播放媒體播放實際上涵蓋了本地影片播放、視頻直播、視頻點播三個模塊中關(guān)于媒體播放功能的總和。其主要是調(diào)用DirectFB中的VideoProvider接口類來完成播放功能。本小節(jié)主要描述終端中的媒體播放模塊如何將緩存中的媒體數(shù)據(jù)渲染到指定圖層上顯示出來(播放操作)。凡直播和點播模塊中涉及網(wǎng)絡(luò)相關(guān)的操作(見3.3)一概略去不述。啟動播放過程的核心為gfx_start
27、VideoProvider函數(shù),其函數(shù)原型為:void gfx_startVideoProvider(char* videoSource, int videoLayer, int force, char* options): 該函數(shù)實現(xiàn)播放功能參數(shù)名:videoSource 視頻源的名稱 videoLayer 播放視頻所在圖層 force 是否強制從頭播放 options 附加選項返回值:無該函數(shù)主要調(diào)用更底層的DirectFB庫接口實現(xiàn)DSP解碼并反饋數(shù)據(jù)到幀緩沖中實現(xiàn)顯示。具體的啟動播放的流程如圖2.5.1所示:圖2.5.1 啟動播放模塊的流程圖Ø 判斷文件或者URL的合法性:判
28、斷播放的文件與流媒體播放中URL是否為正確的參數(shù),這樣可以防止系統(tǒng)播放非法的文件或其他錯誤的URL,防止系統(tǒng)崩潰。Ø 關(guān)閉其他播放線程:由于可能存在多個播放線程,考慮實際應(yīng)用場景(用戶不可能同時觀看兩個節(jié)目),為保證系統(tǒng)穩(wěn)定性預(yù)先設(shè)計各線程同步的互斥量,這樣保證了系統(tǒng)中只能存在一個播放線程。所以播放啟動前,事先強行關(guān)閉其他所有播放線程。Ø 獲取圖層ID:視頻播放有兩個層,4層和5層。視頻點播在4層;而本地播放和視頻直播在5層。Ø 設(shè)置播放區(qū)域大小:由于播放存在全屏和預(yù)覽兩種模式,故在播放之前需要預(yù)先設(shè)定播放區(qū)域大小,預(yù)覽模式的目標播放區(qū)域為一個指定大小的非全屏矩形
29、;而全屏模式的目標播放區(qū)域為全屏矩形。Ø 設(shè)置應(yīng)用程序全局環(huán)境配置表:主要設(shè)置appInfo結(jié)構(gòu)中的ipInfo和mediaInfo兩個成員的某些參數(shù),如狀態(tài)信息。Ø 開始播放:調(diào)用底層的接口播放緩存中的數(shù)據(jù)。啟動和停止播放都是通過OK鍵來操作,通過判斷mediaInfo或ipInfo中的active參數(shù)來判斷是否處于正在播放的過程之中,從而判斷是啟動還是停止播放線程。2.6 圖片瀏覽圖片瀏覽是將存儲介質(zhì)上的圖片通過各種顯示模式顯示出來。顯示模式支持類似幻燈片式的上開、下開、左開、右開等多種。核心操作控制函數(shù)為一個線程函數(shù)slideShow_Thread,通過預(yù)先設(shè)定的宏定
30、義模式,其流程如圖2.6.1所示。圖2.6.1 圖片瀏覽線程slideShow_Thread流程圖keepAlive為是否持續(xù)slideShow_Thread線程的標識。線程內(nèi)部共定義了幾種狀態(tài)標識,分別為IAMGE_STOP、IMAGE_START、IMAGE_DECODED、IMAGE_DISPLAY、IMAGE_EXIT。通過switch開關(guān)語句來依次實現(xiàn)狀態(tài)跳轉(zhuǎn)。對圖片實現(xiàn)解碼渲染的核心函數(shù)為decodeImage。函數(shù)內(nèi)通過DirectFB提供的關(guān)于圖片解碼的接口IDirectFBImageProvider來實現(xiàn)圖片的解碼、渲染。最終將解碼后的圖片數(shù)據(jù)顯示出來是通過displayIm
31、age函數(shù)實現(xiàn)。displayImage實現(xiàn)了前述的多種圖片的瀏覽方式,如上開,下開,左開,右開等。流程如圖2.6.2。圖2.6.2 displayImage函數(shù)流程下面簡單說明左開方式的實現(xiàn)。在slideShowInfo控制結(jié)構(gòu)中有兩個參數(shù)pFrameBuffer和pImageBuffer。pImageBuffer存儲了解碼后的圖片數(shù)據(jù)。而pFrameBuffer則是系統(tǒng)設(shè)備上圖片層的surface對象指針。進入不接循環(huán)緩沖處理中,逐步按照x方向坐標拷貝pImageBuffer中的數(shù)據(jù)至pFrameBuffer之中,如圖2.5.3所示,每次拷貝一個豎形條狀矩形塊,順序為先拷貝深色,后拷貝淺色
32、,這樣,配以適當?shù)难訒r就形成了向左開的效果。最終pImageBuffer中的數(shù)據(jù)會全部拷貝到pFrameBuffer之中。實現(xiàn)了整幅圖片的顯示。其它模式的顯示原理與此類似。圖2.6.3 左開模式實現(xiàn)示意圖3 終端系統(tǒng)關(guān)鍵技術(shù)說明IPTV機頂盒終端是一個智能多媒體處理平臺,這個平臺可以看作是一臺專門針對流媒體應(yīng)用的計算機。但是它明顯有別于普通的一般PC。主要區(qū)別在于它采用嵌入式芯片,針對特定的流媒體應(yīng)用。它包括以下三項關(guān)鍵技術(shù):嵌入式平臺的圖像顯示技術(shù);移動檢測技術(shù);環(huán)形視頻緩沖區(qū)技術(shù)。3.1 嵌入式平臺的圖像顯示技術(shù)3.1.1 概述嵌入式環(huán)境下的圖像顯示技術(shù)不同于普通PC,普通PC有專門的顯卡
33、來承擔相關(guān)的計算工作,但是嵌入式平臺限于體積、成本等特點不能配備獨立的顯卡。故我們采用DirectFB(Direct FrameBuffer)技術(shù),即直接操作顯示幀緩沖。DirectFB作為一項開源的技術(shù),專門應(yīng)用于Linux上具有FrameBuffer的設(shè)備之上。它是一個等同于QT、GTK+等開源技術(shù)的重量級庫,具有硬件圖形加速、輸入設(shè)備管理、多層顯示等功能。本平臺使用了DirectFB的架構(gòu),如圖3.1.1所示:圖3.1.1 DirectFB的架構(gòu)DirectFB使用的分層雙緩沖技術(shù)。即同時使用兩個幀緩沖區(qū)來加快顯示過程,一個用于準備顯示,另一個置入下一幀將要顯示的內(nèi)容。當需要顯示下一幀時
34、,直接將緩沖指針切換到另一個幀緩沖。好像兩個緩沖不斷的交替裝載數(shù)據(jù)來實現(xiàn)顯示。另一方面,DirectFB具有多層顯示的功能,一般最多支持5層。DirectFB實現(xiàn)終端上的顯示功能通過兩種方式,一種是直接的繪制方式,這種一般直接通過IDirectFBSurface接口提供的各種接口操作函數(shù)如FillRectangle來實現(xiàn),主層(即0層)上可以實現(xiàn)任意圖像的繪制;另外的方式為渲染方式,是將視頻、圖片內(nèi)容渲染到圖層上顯示,其余幾層都為這種方式,使用的接口為DirectFB中的ImageProvider、VideoProvider等。渲染方式不允許在渲染的區(qū)域上直接繪制圖形。但是不論采用直接繪制方式
35、還是渲染方式,都可以設(shè)定目標顯示區(qū)域,即是否全屏或者非全屏。顯示的時候各層有一個疊加順序,0層在最上,4層在最下。如果想顯示下層的內(nèi)容,必須將上一層的alpha通道置為0。這樣下層的內(nèi)容自然浮現(xiàn)上來。下面著重闡述幾個關(guān)鍵的部分。3.1.2 預(yù)覽窗口在直播、點播、本地影片都需要都視頻預(yù)覽,如果內(nèi)容滿足用戶需要才有必要全屏瀏覽。首先在主層上繪制頂級菜單后繪制一個小矩形用于作為預(yù)覽窗口,然后將矩形的透明度設(shè)為0,這樣視頻層的內(nèi)容就可以浮現(xiàn)上來,實現(xiàn)預(yù)覽效果,但是必須將預(yù)覽時的視頻目標顯示區(qū)域設(shè)為上述的小矩形那般大小。3.1.3 全屏播放全屏播放需要將視頻層整個屏幕大小的內(nèi)容全部浮現(xiàn)上來,這時先要在主
36、層上繪制一個全屏大小的透明菜單,并將這個菜單的前驅(qū)菜單設(shè)為當前菜單。以便可以從全屏播放退回到預(yù)覽狀態(tài)。當從預(yù)覽窗口切換到全屏播放時,需要重新設(shè)置視頻播放層的目標顯示區(qū)域大小從預(yù)覽窗口大小到全屏大小。3.1.4 界面顯示過程每一個菜單界面都不相同,但是顯示過程的原理大同小異,繪制的差別在于每個menuContainer中的pDraw成員,這是一個專門繪制菜單自身的函數(shù),一般格式為XXX_drawXXX。當所有菜單全部構(gòu)建完畢后(即完成所有的XXX_buildXXX函數(shù)之后)。調(diào)用menuApp_displayMain函數(shù),這個函數(shù)繼而調(diào)用menuInfra_display函數(shù),傳給這個函數(shù)的參數(shù)
37、的參數(shù)就是指向topLevelMenu(頂級菜單)的指針。而menuInfra_display函數(shù)則直接調(diào)用topLevelMenu自身的draw函數(shù)topLevel_drawMenu函數(shù)繪制自身。每次當主界面發(fā)生改變時,都會引起調(diào)用topLevel_drawMenu函數(shù)來重新繪制主界面。其他界面的繪制過程都以此類推。其關(guān)系如圖3.1.2所示:圖3.1.2 顯示函數(shù)的關(guān)系3.1.5 菜單的切換菜單的切換通過定義每個menuContainer的prev成員變量實現(xiàn)。每當切換到另一個菜單時,首先在主層上繪制將要顯示的菜單,同時通過prev成員記錄下上一級菜單的指針,這樣就可以回退到上一級菜單了。而
38、prev的賦值一般在進入某個菜單項的時候賦值。比如從頂級菜單進入直播菜單。首先要對直播菜單項的pAction成員變量賦值。pAction就是選中菜單項時執(zhí)行的動作。這里執(zhí)行的動作就是執(zhí)行menuInfra_display(void*(&IpMenu)。3.2 移動檢測技術(shù)3.2.1 概述移動檢測主要是用來監(jiān)控并記錄被監(jiān)控區(qū)域發(fā)生的場景變化,當被監(jiān)控場景中發(fā)生了場景變化,終端可以發(fā)出報警信息并記錄場景變化中的關(guān)鍵場景快照圖片。終端的這項功能可用于簡單的家庭視頻監(jiān)控,當開啟終端切換到移動檢測菜單,通過USB攝像頭來掃描室內(nèi)的情況,將讀取的圖像轉(zhuǎn)換成RGB格式的圖像信息,同時不斷運用移動檢測
39、技術(shù)來比較相鄰時間間隔中攝入圖像的亮度和色彩,如有明顯差別,則就表示有人或物體進入或移動,便記錄這些存在差異的圖片到終端存儲設(shè)備上,同步顯示給終端用戶觀看。同時根據(jù)需要在檢測到場景變化的時候可以發(fā)出警報。3.2.2 整體過程首先在系統(tǒng)的啟動腳本中我們直接啟用了攝像頭的驅(qū)動程序驅(qū)動攝像頭工作,這實際上是初始化移動檢測設(shè)備。然后用戶通過主界面進入移動檢測界面。整個移動檢測模塊的核心是一個移動檢測線程motion_start線程函數(shù),先給出其整個運行流程圖3.2.2.1:圖3.2.2.1 motion_start移動檢測線程流程圖3.2.3 設(shè)備初始化驅(qū)動攝像頭通過一個類quickCam實現(xiàn)。qui
40、ckCam類包含以下成員變量和成員函數(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)獲得所采集圖
41、片的寬和高unsigned char * 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)信息:正常,出錯,警告等enum ERRCODE error返回 _error_codevoid _set_error設(shè)置_error_sring和_error_codevoid _unset_
42、error(void)清除錯誤狀態(tài)信息string _error_string錯誤描述enum ERRCODE _error_code錯誤碼unsigned char * _buffer用以存儲原生圖片unsigned char * _rgb_buffer用以存儲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
43、 (void)啟動攝像頭void _usleep (unsigned long usecs)休眠usecs微秒int _devfd攝像頭設(shè)備描述符表3.2.3.1 quickCam類攝像頭的具體初始化過程如圖3.2.3.2所示:圖3.2.3.2 攝像頭的初始化過程3.2.4 圖像采集移動檢測模塊采用的是快照式的檢測方式,故圖像采集就是攝像頭每隔一定的時間間隔便對被監(jiān)測場景取景一次,記錄在緩存中。其具體流程如圖3.2.4.1所示:圖3.2.4.1 圖像采集流程圖攝像頭連接成功后,調(diào)用函數(shù)take_photo ()和yuv2rgb()分別來實現(xiàn)對場景的快照圖像采集和圖像格式的轉(zhuǎn)換。take_pho
44、to ():完成對圖片的采集,具體過程為首先調(diào)用mmap()將磁盤文件映像到內(nèi)存中;通過訪問被映射的內(nèi)存結(jié)構(gòu)體vmap就可以讀出攝像頭采集的圖片的寬、高和類型;在未出現(xiàn)任何異常的情況下,將采集到的圖片存儲到緩存_buffer中。最后,調(diào)用munmap解除內(nèi)存映像并把內(nèi)存釋放返回給操作系統(tǒng)。yuv2rgb():將原生圖像轉(zhuǎn)換成RGB格式的圖像信息,并將轉(zhuǎn)換后的圖片存儲到緩存_rgb_buffer中。繼而,按照預(yù)定的象素值和圖片格式來存儲圖像。其過程實際是一個拷貝過程。將緩沖區(qū)中的圖片信息拷貝到應(yīng)用程序中,然后再控制和處理圖片數(shù)據(jù)。該過程就是通過拷貝函數(shù)memcpy(imagesbuffer_po
45、s, cam.get_rgbbuffer(), IMAGE_BUFFER)來完成的。將轉(zhuǎn)換后的RGB圖像存儲在*images指針數(shù)組中,方便后期的圖像比較。當*image中存滿五幅圖片時,轉(zhuǎn)入detect_motion()函數(shù),比較五幅圖片的差異。3.2.5 啟動和停止移動檢測移動檢測菜單為motionMenu,啟動移動檢測菜單項的動作函數(shù)為motion_threadstart,停止移動檢測菜單項的動作函數(shù)為motion_threadstop。移動檢測模塊的啟動/結(jié)束調(diào)用過程如圖3.2.5.1所示:圖3.2.5.1 移動檢測的啟動/結(jié)束調(diào)用過程啟動移動檢測的動作函數(shù)motion_threads
46、tart的具體過程如圖3.2.5.2所示:圖3.2.5.2 啟動移動檢測的具體過程其中值得注意的是在創(chuàng)建移動檢測線程之前一般關(guān)閉其他所有的視頻播放線程,這樣既防止了資源競爭,也保證了系統(tǒng)的穩(wěn)定性。這里主要主要創(chuàng)建了兩個線程:motion_start和motionShow_start。下屬小節(jié)有詳細敘述。停止移動檢測模塊由motion_threadstart函數(shù)完成。其具體流程如圖3.2.5.3所示:圖3.2.5.3 停止移動檢測的具體過程3.2.6 移動檢測通過比較當前幀與平均幀的亮度和RGB來判斷是否有移動發(fā)生,當其變化超過一定值時,我們便認為移動發(fā)生,返回相應(yīng)值。平均幀的定義是將所有比較過
47、的變化不大的幀信息總和取均值。幾個重要函數(shù)如下:int detect_motion(const int width, const int height, const int no_images, const int current_image_pos, unsigned char *images): 該函數(shù)實現(xiàn)移動檢測功能參數(shù)說明:width, height 待比較的圖片的寬和高 no_images 緩存中圖片的數(shù)目 current_image_pos 當前指針 *images 用于存儲圖片的指針數(shù)組返回值 0:表示未檢測到移動; 1:表示檢測到了移動;intmotion_index(stru
48、ct PixelpixelblockMOTION_DETECTION_BLOCKMOTION_DETECTION_BLOCK, unsigned short int mode)mode:用來表示獲取信息的類型,如:MOTION_DETECTION_INDEX_BRIGHTNESS、MOTION_DETECTION_INDEX_RED、MOTION_DETECTION_INDEX_BLUE等;返回值為 avg;通過調(diào)用int motion_index()來獲取當前象素塊的亮度(brightness)和RGB顏色值的3個分量red、blue、green的信息,如下:并運用到了int diff(in
49、t a, int b)函數(shù),用來比較圖片間的亮度和RGB,a: 用來表示平均值信息,如avg_brightness、avg_red、avg_blue等;b: 用來表示當前信息,如brightness、red、blue等;返回值為 a與b差異的絕對值。 其中MOTION_DETECTION_BRIGHTNESS,MOTION_DETECTION_RED等表示各信息分量的預(yù)定值。當差異大于相應(yīng)的預(yù)定值時,便返回1并存儲檢測到移動時當前images數(shù)組中的圖片。調(diào)用函數(shù)viod compress_jpeg()將imags數(shù)組中的RGB圖像轉(zhuǎn)換成JPG格式存儲在相應(yīng)的文件里。同時,執(zhí)行函數(shù)insert
50、MotionNode()將存儲的圖片名加到全局鏈表中。最后當線程結(jié)束時,釋放所有的緩存空間。流程如圖3.2.6.1所示:圖3.2.6.1 移動檢測的流程3.2.7 圖像顯示線程在檢測到移動后,為便于終端用戶觀看到實時監(jiān)測到的移動,在啟動移動檢測模塊時我們創(chuàng)建了一個image_motionShowThread顯示線程來實時反饋檢測到的移動,實際上就是將檢測到的移動場景按照幻燈片的方式依次放映給終端用戶觀看。image_motionShowThread線程的運行過程如圖3.2.7.1所示:圖3.2.7.1 image_motionShowThread線程流程圖3.2.8 線程同步同步示意圖如圖3.
51、2.8.1所示:圖3.2.8.1 移動檢測線程同步示意圖motion_start線程在調(diào)用compress_jpeg()函數(shù)保存圖片后,將圖片的文件名插入到該鏈表中,更新pMotionInsertTail;如此同時,image_motionShowThread線程不斷檢測pMotionShowTail下面是否有新的結(jié)點,若有則調(diào)用displayImage()函數(shù)在移動檢測界面的顯示框里顯示下一幅圖片,同時,更新pMotionShowTail指針;若沒有新圖片加入,則繼續(xù)檢測。3.3 視頻直播/點播與環(huán)形緩沖區(qū)3.3.1 概述視頻點播、視頻直播都涉及到網(wǎng)絡(luò)相關(guān)的操作,2.4小節(jié)只說明了使用Dir
52、ectFB實現(xiàn)具體播放的原理,而從網(wǎng)絡(luò)上接收數(shù)據(jù),緩存,流同步等操作都與緩沖區(qū)有關(guān),本小節(jié)闡明了如何利用環(huán)形緩沖區(qū)實現(xiàn)網(wǎng)絡(luò)流數(shù)據(jù)的接收,以及寫緩存線程、讀緩存線程的同步操作。終端接收來自網(wǎng)絡(luò)的數(shù)據(jù),不可能直接送入DSP解碼芯片用于解碼顯示,必須首先存入緩沖區(qū)當中,當積累到一定的量時再將數(shù)據(jù)讀入DSP中。緩沖區(qū)一般為在RAM中開辟的一段空間。而RAM是一種隨機存儲設(shè)備,不具有數(shù)據(jù)讀寫循環(huán)的特性,故我們需要人工制定一種讀寫規(guī)范,使得數(shù)據(jù)的讀寫好像是使用一段環(huán)形存儲器,可以不斷循環(huán)讀寫以實現(xiàn)數(shù)據(jù)的正確緩沖。我們將這種技術(shù)稱之為環(huán)形緩沖區(qū)技術(shù)。由于視頻點播的原理與視頻直播一樣,區(qū)別僅僅在于EPG信息不
53、一樣(點播較直播簡單)。故3.3小節(jié)僅闡述視頻直播。3.3.2 視頻直播啟動播放:直播首先通過函數(shù)ip_startVideo來初始化指定播放節(jié)目的解碼參數(shù)以及網(wǎng)絡(luò)參數(shù)(如IP地址和端口號),然后通過函數(shù)ip_startIP來初始化DSP設(shè)備文件,并為設(shè)備文件設(shè)置適當?shù)膮?shù)準備接收數(shù)據(jù)流。最后創(chuàng)建一個從網(wǎng)絡(luò)上讀取數(shù)據(jù)的線程(即上圖中的線程1),線程函數(shù)為ip_main。整個播放啟動過程完畢。如圖3.3.2.1所示:圖3.3.2.1 直播播放啟動流程網(wǎng)絡(luò)實例:ip_instance。播放實例是一個全局的數(shù)據(jù)結(jié)構(gòu)。終端共有兩個播放實例,一個用于直播,一個用于點播。結(jié)構(gòu)如表3.3.2.2所示:成員名稱
54、說明int fdaDSP設(shè)備文件描述符int fdvDSP設(shè)備文件描述符int fdpDSP設(shè)備文件描述符int selected是否選中struct dmx_pes_filter_params pesfiltervDSP視頻解碼參數(shù)選項struct dmx_pes_filter_params pesfilteraDSP音頻解碼參數(shù)選項struct dmx_pes_filter_params pesfilterpDSP pcr解碼參數(shù)選項int streamnumber節(jié)目流編號ip_stream_info stream_info節(jié)目流信息結(jié)構(gòu)pthread_t thread讀取網(wǎng)絡(luò)數(shù)據(jù)流ip
55、_main線程的線程IDpthread_attr_t tattrip_main線程的線程屬性表3.3.2.2 ip_instance結(jié)構(gòu)其中ip_stream_info是一個記錄單個節(jié)目(直播/點播)信息的結(jié)構(gòu),如表3.3.2.3所示:成員名稱說明char streamname256節(jié)目流名稱int pidaTS流視頻解碼參數(shù)int pidvTS流音頻解碼參數(shù)int pidpTS流PCR解碼參數(shù)int vformat視頻格式參數(shù)int aformat音頻格式參數(shù)int device設(shè)備編號char videoProviderName256DSP中demux設(shè)備文件名稱char inputDeviceName256DSP中dvr設(shè)備文件名稱unsigned int port節(jié)目的端口號char ip256節(jié)目流的ip地址表3.3.2.3 ip_stream_info結(jié)構(gòu)函數(shù)ip_startVideo和ip_startIP的初始化工作主要就是將上述兩個結(jié)構(gòu)的各個成員初始化。其中ip_stream_info中關(guān)于節(jié)目解碼的參數(shù)streamname、pida、pidv、pidp、vformat、aformat、port、ip都來自于從網(wǎng)絡(luò)上獲取的EPG節(jié)目單。直播EPG格式見圖2.3.2.4。停止播放:通過函數(shù)ip_stopVideo實現(xiàn),流程如圖3.3.2.4所示:圖3.3.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度綠色倉儲倉房買賣合同范本環(huán)保解讀3篇
- 2025年度旅游單項服務(wù)保障合同4篇
- 2024-2025學年高中英語Unit4Breakingboundaries突破語法大沖關(guān)教師用書外研版選擇性必修第二冊
- 2024-2025學年新教材高中歷史第八單元20世紀下半葉世界的新變化第18課冷戰(zhàn)與國際格局的演變課時作業(yè)含解析新人教版必修中外歷史綱要下
- 二零二五版工程招投標與合同管理法律法規(guī)匯編及解讀3篇
- 2024版汽車維修工具套件租賃合同
- 2024版廣西事業(yè)單位聘用合同樣板
- 2025年屋頂雨水排水管及配套設(shè)施銷售與安裝服務(wù)合同2篇
- 二零二五年度教育合作辦班合同范本3篇
- 2024版汽車修理廠土地租賃合同
- 2023年上海英語高考卷及答案完整版
- 西北農(nóng)林科技大學高等數(shù)學期末考試試卷(含答案)
- 金紅葉紙業(yè)簡介-2 -紙品及產(chǎn)品知識
- 《連鎖經(jīng)營管理》課程教學大綱
- 《畢淑敏文集》電子書
- 頸椎JOA評分 表格
- 員工崗位能力評價標準
- 定量分析方法-課件
- 朱曦編著設(shè)計形態(tài)知識點
- 110kV變電站工程預(yù)算1
- 某系統(tǒng)安全安全保護設(shè)施設(shè)計實施方案
評論
0/150
提交評論