文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2011)12-0140-04
自由立體顯示技術(shù)是指不需佩戴諸如立體眼鏡等附屬設(shè)備的三維立體顯示技術(shù)[1],,又稱“裸眼式3D技術(shù)”,觀察者無(wú)需借助立體眼鏡即可裸眼體驗(yàn)立體感覺(jué),。自由立體視頻技術(shù)的諸多優(yōu)點(diǎn)決定其必然成為今后立體顯示的發(fā)展趨勢(shì),。目前國(guó)內(nèi)外尚無(wú)商用、成熟,、專用于自由立體顯示技術(shù)的播放器軟件,,所以開(kāi)發(fā)專用于自由立體視頻播放顯示的技術(shù)方案顯得尤為重要。根據(jù)多視點(diǎn)自由立體顯示技術(shù)的特點(diǎn),,本文提出了一種基于光柵顯示技術(shù)的自由立體視頻播放方案,。
該方案基于MFC框架,播放器功能完全采用底層的WIN32API實(shí)現(xiàn),,具有結(jié)構(gòu)清晰,、設(shè)計(jì)簡(jiǎn)潔、可擴(kuò)展性強(qiáng)的特點(diǎn),。與普通視頻相比,,立體視頻具有多個(gè)視頻通道,數(shù)據(jù)量較大,。本文所涉及的自由立體視頻源,,其每一幀的立體圖像都由8幅存在一定視差的平面圖像合成而來(lái)。需要播放立體視頻時(shí),,通過(guò)與狹縫光柵相匹配的立體合成算法[2],,將8幅分辨率為720×360的圖像合成分辨率為1 920×1 080的立體圖像進(jìn)行顯示。所以,,播放器除了具有普通視頻播放器的基本功能之外,,還具備視頻格式自動(dòng)匹配,、幀率控制及平面/立體模式自由切換等功能。同時(shí),,為了達(dá)到明顯的立體效果,,幀率至少要達(dá)到20 f/s以上。
1 自由立體視頻播放器實(shí)現(xiàn)原理
播放器基于MFC框架,按鈕控件實(shí)現(xiàn)對(duì)播放器各項(xiàng)功能的控制,進(jìn)度條控件顯示視頻解碼線程的進(jìn)度,,滾動(dòng)條控件顯示視頻播放的進(jìn)度,,并具備拖動(dòng)滾動(dòng)條以控制視頻進(jìn)度的功能。靜態(tài)文本控件內(nèi)顯示視頻幀數(shù),,累計(jì)時(shí)長(zhǎng),、平均幀率等實(shí)時(shí)信息。播放器原理如圖1所示,。
立體播放器處理視頻文件的流程是,,從數(shù)據(jù)文件讀取YUV420數(shù)據(jù),根據(jù)圖像的大小,,以幀為單位轉(zhuǎn)換為內(nèi)存無(wú)關(guān)位圖DIB(即RGB格式)[3],,并利用與狹縫光柵相匹配的合成算法將RGB像素?cái)?shù)據(jù)重新組合排列,最終將內(nèi)存中已經(jīng)排列好的RGB數(shù)據(jù)顯示在播放器的視頻區(qū)域,。
視頻播放器的顯示原理與動(dòng)畫(huà)片的原理類似,,利用人眼的視覺(jué)暫留特性,快速地把一張張圖像貼到播放器的視頻區(qū)域,。人眼無(wú)法分辨這些靜止圖像,,感覺(jué)如同播放動(dòng)畫(huà)一樣。
通過(guò)貼有特定光柵的顯示器來(lái)顯示,、播放立體圖像,,由于觀察者雙眼相對(duì)于光柵屏幕的空間位置不同,,會(huì)產(chǎn)生雙眼視差[4],,從而令觀察者無(wú)需借助立體眼鏡即可裸眼體驗(yàn)立體感覺(jué)。
2 播放器性能
為了精確測(cè)量播放程序中各個(gè)功能模塊的耗時(shí)情況,,程序中加入了測(cè)量時(shí)間的功能,。
實(shí)現(xiàn)方式:在程序運(yùn)行時(shí),首先調(diào)用QueryPerformanceFrequency()函數(shù),得到CPU的時(shí)鐘頻率m_freq,。在需要測(cè)量時(shí)間的操作 之前和之后調(diào)用QueryPerformanceCounter()函數(shù),,分別得到2個(gè)時(shí)鐘計(jì)數(shù)值 m_count
_start和m_count_stop,則利用公式:
dT=1 000(m_count_stop-m_count_star)/m_freq
即可得到執(zhí)行操作所消耗的時(shí)間,。
利用此種方法,,測(cè)得播放器播放視頻過(guò)程中各個(gè)環(huán)節(jié)的耗時(shí)情況,如圖2所示,。
初步實(shí)現(xiàn)播放功能時(shí),,播放視頻的幀率很低,,只有9 f/s~11 f/s,所以需要針對(duì)視頻播放過(guò)程中各個(gè)環(huán)節(jié)的原理和特點(diǎn)采取不同的方式提高播放器的運(yùn)行效率,。
3 關(guān)鍵技術(shù)研究與性能改進(jìn)方法
3.1 內(nèi)存中圖像數(shù)據(jù)的顯示
將內(nèi)存中的RGB數(shù)據(jù)顯示到視頻區(qū)域,,需要在具備圖像顯示功能的函數(shù)體中,提供表示圖像顏色位數(shù),、尺寸等格式信息的結(jié)構(gòu)體BITMAPINFO,,以及圖像數(shù)據(jù)起始地址的指針BMPbuffer[5]。對(duì)具備顯示圖像功能的函數(shù)進(jìn)行測(cè)試,,結(jié)果如下:
(1) StretchDIBits,。可以用拉伸模式完成全屏顯示功能,,但是在拉伸模式下,,圖像會(huì)出現(xiàn)明顯的色彩錯(cuò)誤。
(2) SetDIBitsToDevice,。只能原比例顯示圖像,,如果顯示器的分辨率設(shè)置小于1 920×1 080,則圖像無(wú)法完整顯示。
(3) DrawDib函數(shù)組,。DrawDib是不依賴于圖形設(shè)備接口(GDI)而直接操作顯存的函數(shù)組,。能夠?qū)崿F(xiàn)圖像的顯示功能,并且能以任意寬高比進(jìn)行拉伸顯示,,拉伸后的圖像無(wú)色彩錯(cuò)誤,。所以,此處采用DrawDib函數(shù)組來(lái)實(shí)現(xiàn)內(nèi)存位圖的顯示功能。
顯示功能的核心偽代碼為:
DrawDibOpen();
DrawDibBegin();
DrawDibDraw(m_hDIB,hdc,rect.left,rect.top,rect.right,rect.bottom,&m_lpBmpInfo_->bmiHeader,BMPbuffer_,0,0,Width_,Height_,DDF_SAME_DRAW);
DrawDibEnd();
DrawDibClose(),。
核心函數(shù)是DrawDibDraw(),,參數(shù)中需要提供視頻顯示控件上表示繪圖區(qū)域的參數(shù)rect、LPBITMAPINFO類型的結(jié)構(gòu)體指針m_lpBmpInfo及DIB數(shù)據(jù)的起始地址BMPbuffer,。
經(jīng)測(cè)試,,DrawDib函數(shù)組能夠很好地完成DIB圖像的顯示,貼圖速度快,,沒(méi)有明顯的延遲現(xiàn)象,,并且在全屏模式播放時(shí)沒(méi)有出現(xiàn)類似使用StretchDIBits()函數(shù)時(shí)出現(xiàn)的色彩失真,達(dá)到了良好的顯示效果,。
3.2 內(nèi)存映射文件處理大文件操作
分辨率為1 920×1 080的600幀的視頻,采用YUV420存儲(chǔ)格式時(shí),,體積高達(dá)1.78 GB。目前,,對(duì)于這種大文件的操作通常是以內(nèi)存映射文件的方式來(lái)加以處理的[6],。
根據(jù)播放器功能模塊的耗時(shí)統(tǒng)計(jì)結(jié)果,未使用內(nèi)存映射文件方式,而直接從硬盤(pán)讀取分辨率為720×360×8的YUV420數(shù)據(jù),,平均每幀耗時(shí)35 ms,,是整個(gè)播放流程中耗時(shí)最大的環(huán)節(jié)。所以,,采用內(nèi)存映射文件的方式改進(jìn)文件讀取模塊可以提高播放器的效率,。內(nèi)存文件映射是Windows的一種內(nèi)存管理方法,通過(guò)文件映射使磁盤(pán)文件的全部或部分內(nèi)容與進(jìn)程虛擬地址空間的某個(gè)區(qū)域建立映射關(guān)聯(lián),,可以直接對(duì)被映射的文件進(jìn)行訪問(wèn),,不必執(zhí)行文件I/O操作也無(wú)需對(duì)文件內(nèi)容進(jìn)行緩沖處理,這種特性在進(jìn)行大文件的磁盤(pán)事務(wù)操作時(shí)將獲得很高的效益,。內(nèi)存映射文件的一般編程流程如圖3所示,。
經(jīng)過(guò)實(shí)際對(duì)比測(cè)試,直接從硬盤(pán)讀取分辨率為720×360×8的YUV420數(shù)據(jù)平均毎幀耗時(shí)35 ms,。而通過(guò)內(nèi)存映射文件的方式讀取每幀數(shù)據(jù)的耗時(shí)可減少到15 ms左右,。可見(jiàn)內(nèi)存映射文件在處理大數(shù)據(jù)量文件時(shí)表現(xiàn)出了良好的性能,,比通常使用的CFile類和 ReadFile()等函數(shù)的文件處理方式更加快速有效,。
3.3 緩沖解碼
播放器已經(jīng)實(shí)現(xiàn)了YUV視頻格式的播放功能,在此基礎(chǔ)上加入H.264解碼模塊以實(shí)現(xiàn)播放器對(duì)H.264格式的支持,。
采用開(kāi)放源碼的JMVC來(lái)處理H.264視頻視頻的解碼,。經(jīng)測(cè)試,對(duì)于1 920×1 080的H.264視頻,,JMVC解碼速度在12 f/s左右,,如果采用實(shí)時(shí)解碼播放的方式,播放的幀率較低,,達(dá)不到流暢播放的要求,,因此采用緩沖解碼的方式來(lái)實(shí)現(xiàn)。環(huán)形緩沖區(qū)的工作原理如圖4所示,。
為了接收J(rèn)MVC解碼H.264產(chǎn)生的YUV數(shù)據(jù),,首先在內(nèi)存中開(kāi)辟出能夠存儲(chǔ)100幀YUV數(shù)據(jù)的環(huán)形緩沖區(qū)YUV Buffer。所謂“環(huán)形”,,是指當(dāng)需要接收的YUV圖像幀數(shù)多于緩沖區(qū)的承載量時(shí),,數(shù)據(jù)指針從緩沖區(qū)結(jié)尾處重新跳轉(zhuǎn)至緩沖區(qū)起始處,即重新返回到緩沖區(qū)起始處開(kāi)始存儲(chǔ),,將先前的YUV數(shù)據(jù)覆蓋掉。播放線程將緩沖區(qū)內(nèi)的YUV數(shù)據(jù)處理并顯示出來(lái)后,,數(shù)據(jù)指針同樣從緩沖區(qū)結(jié)尾處重新跳轉(zhuǎn)至緩沖區(qū)起始處,即重新返回緩沖區(qū)起始處,繼續(xù)處理播放YUV數(shù)據(jù),。
3.4 多線程的應(yīng)用
根據(jù)播放器功能模塊的耗時(shí)統(tǒng)計(jì)結(jié)果,使用單線程方式處理YUV數(shù)據(jù)的轉(zhuǎn)換和RGB數(shù)據(jù)的合成平均耗時(shí)為18 ms和20 ms。
為了提高多核CPU的利用效率,,采用多線程方式改進(jìn)程序的功能模塊,。由于圖像以幀為單位,每幀YUV圖像數(shù)據(jù)排列結(jié)構(gòu)相同且無(wú)相關(guān)性,,所以在處理時(shí)將每幀圖像由上至下分成4快,,每塊圖像數(shù)據(jù)開(kāi)啟一個(gè)線程,同時(shí)采用四線程來(lái)處理轉(zhuǎn)換過(guò)程,。轉(zhuǎn)換得到RGB圖像,,其像素?cái)?shù)據(jù)的排列順序也是從左至右、從下至上,,所以RGB的合成工作也可采用四線程實(shí)現(xiàn),。
經(jīng)過(guò)實(shí)際對(duì)比測(cè)試,采用4線程處理YUV數(shù)據(jù)的轉(zhuǎn)換和RGB數(shù)據(jù)的合成,,平均耗時(shí)降至5 ms和7 ms,大大提高了圖像數(shù)據(jù)的轉(zhuǎn)換與合成效率,。
3.5 多線程同步、線程間通信
在播放H.264視頻格式的模式下,,播放器首先啟動(dòng)解碼線程,,向緩沖區(qū)內(nèi)寫(xiě)入YUV數(shù)據(jù)。當(dāng)緩沖區(qū)內(nèi)開(kāi)辟的100幀控件被裝滿后,,需要利用線程通信機(jī)制向播放線程發(fā)送消息,。播放線程開(kāi)始處于等待狀態(tài),從消息隊(duì)列中取得相應(yīng)消息并驗(yàn)證,,當(dāng)識(shí)別出解碼線程發(fā)送的特定消息后開(kāi)啟播放功能,。采用此種方式,可以在保證視頻不間斷播放的基礎(chǔ)上提高視頻播放的幀率,。但是由于采用多線程實(shí)現(xiàn),線程間的同步成為不可忽視的問(wèn)題,。
解碼和播放兩個(gè)線程是同時(shí)執(zhí)行的,解碼線程提供YUV圖像數(shù)據(jù),,播放線程將緩沖區(qū)內(nèi)的YUV數(shù)據(jù)處理成RGB位圖數(shù)據(jù)并顯示出來(lái),。不允許在某一時(shí)刻,在任何一段內(nèi)存區(qū)域上同時(shí)發(fā)生讀取和寫(xiě)入操作,,所以,,必須采取有效的線程同步措施。常用的線程同步方式有:互斥對(duì)象,、事件對(duì)象,、臨界區(qū)等。播放器中需要同步的只有解碼和播放兩個(gè)線程,,所以此處采用互斥對(duì)象來(lái)實(shí)現(xiàn)線程的同步,。線程之間的同步規(guī)則是:
(1) 解碼線程可以超前播放線程,但是超前的幀數(shù)不能大于緩沖區(qū)的長(zhǎng)度。
(2) 播放線程不可以超前解碼線程,。
根據(jù)緩沖區(qū)的長(zhǎng)度構(gòu)造一個(gè)互斥對(duì)象數(shù)組,,數(shù)組的每個(gè)元素與緩沖區(qū)中一幀的YUV數(shù)據(jù)相對(duì)應(yīng)。解碼線程向緩沖區(qū)的某個(gè)區(qū)域?qū)懭霐?shù)據(jù)之前,,首先要請(qǐng)求與該位置相對(duì)應(yīng)的互斥對(duì)象的擁有權(quán),,完成寫(xiě)入操作后,應(yīng)立即放棄該互斥對(duì)象的所有權(quán),;播放線程從緩沖區(qū)內(nèi)讀取數(shù)據(jù)之前,,也要首先請(qǐng)求與該位置相對(duì)應(yīng)的互斥對(duì)象,完成讀取操作后立即釋放該互斥對(duì)象,。
由于互斥對(duì)象只能被一個(gè)線程所擁有,,在執(zhí)行相關(guān)操作前,如果得不到相應(yīng)的互斥對(duì)象,,線程函數(shù)就會(huì)暫停執(zhí)行,,等待另一個(gè)線程釋放互斥對(duì)象,有效地避免了同一段內(nèi)存同時(shí)被兩個(gè)線程讀取和寫(xiě)入情況的,。
經(jīng)過(guò)測(cè)試,,這種方案成功地實(shí)現(xiàn)了解碼線程和播放線程的同步協(xié)調(diào),有效地避免了播放視頻過(guò)程中出現(xiàn)進(jìn)度差錯(cuò)的問(wèn)題,。
3.6 視頻播放速率的控制
播放線程中包含的操作有:(1) YUV到RGB轉(zhuǎn)換,;(2) RGB圖像數(shù)據(jù)的重新合成;(3) RGB圖像的顯示,。這三項(xiàng)操作整合到一個(gè)線程中,,因?yàn)槠鋾r(shí)間損耗之和明顯小于H.264解碼,所以通過(guò)控制播放線程的速率來(lái)實(shí)現(xiàn)控制整體播放幀率的功能,。
播放線程中,,設(shè)置一個(gè)定時(shí)器,每隔一定時(shí)間,,執(zhí)行一幀的播放操作,。播放線程每處理一幀圖像耗時(shí)約15 ms,每秒能顯示圖像的幀數(shù)約為66幀(1 000/15=66.6),,所以用定時(shí)器控制播放線程的執(zhí)行時(shí),,只要將定時(shí)器的時(shí)隙設(shè)置成大于15 ms的任意值,就能實(shí)現(xiàn)以指定的幀率來(lái)播放視頻,。例如,,想要以25 f/s的幀率播放,只需將控制播放線程的定時(shí)器時(shí)隙設(shè)置成40 ms即可,。
經(jīng)過(guò)優(yōu)化后的各個(gè)環(huán)節(jié)耗時(shí)情況如圖5所示,。
3.7 平面2D/立體3D模式任意切換功能
平面與立體圖像的區(qū)別只是RGB像素排列的不同,,所以要播放普通的平面2D圖像,,只需要在合成立體圖像的環(huán)節(jié)中,,將8個(gè)不同視點(diǎn)的數(shù)據(jù)來(lái)源設(shè)置成相同的8個(gè)視點(diǎn)圖像中的任意一個(gè),合成后的圖像則是普通的2D平面圖像,,通過(guò)光柵屏幕的觀看效果和在普通屏幕上觀看平面圖像的效果是相同的,。
4 播放器外觀及顯示效果
最終實(shí)現(xiàn)的播放器具備打開(kāi)、列表,、緩沖,、播放、暫停,、停止,、進(jìn)度控制、全屏播放及2D/3D模式切換等功能,。如圖6所示,,上圖為普通模式播放效果,下圖為立體模式播放效果(立體模式需要在貼有光柵的專門(mén)顯示設(shè)備上觀看,,在普通顯示器上觀察到的是模糊的圖像),。
本文提出的立體視頻播放器的實(shí)現(xiàn)方案運(yùn)用WIN32API實(shí)現(xiàn)播放功能,播放器不依賴于任何其他外部組件,,軟件結(jié)構(gòu)清晰,、設(shè)計(jì)原理簡(jiǎn)潔、具有很強(qiáng)的可擴(kuò)展性,。目前播放器已經(jīng)實(shí)現(xiàn)了對(duì)YUV和H.264兩種視頻格式的支持,,以后還可以根據(jù)需要擴(kuò)展其功能。立體播放器以貼有光柵的42英寸大屏幕顯示器作為顯示輸出設(shè)備,,播放視頻清晰流暢,,立體視覺(jué)效果明顯,幀率符合設(shè)計(jì)要求,,達(dá)到了預(yù)期的設(shè)計(jì)目標(biāo)和性能要求,。
參考文獻(xiàn)
[1] 秦開(kāi)懷,羅建利.自由立體顯示技術(shù)及其發(fā)展[J].中國(guó)圖像圖形學(xué)報(bào),2009,14(10):1934-1940.
[2] 宋曉煒,楊蕾.一種光柵普適的LCD多視點(diǎn)立體圖像合成方法[J].計(jì)算機(jī)應(yīng)用,,2008,1(28):195-198.
[3] 邵丹,韓家偉.YUV與RGB之間的轉(zhuǎn)換[J]. 長(zhǎng)春大學(xué)學(xué)報(bào),2004(4):51-53.
[4] 楊嘉琛,侯春萍,雷建軍.基于人眼視覺(jué)特征的立體圖像質(zhì)量客觀評(píng)價(jià)方法[J].天津大學(xué)學(xué)報(bào),2009,42(7):622-627.
[5] 王伯尊,張鳳茹.在Windows下實(shí)現(xiàn)多幅大尺寸位圖的顯示與瀏覽[J].應(yīng)用科技,2002,29(4):42-44.
[6] 賈琴勇,郭慶平.內(nèi)存映射文件在大型數(shù)據(jù)文件中的實(shí)現(xiàn)及其優(yōu)越性[J].電腦知識(shí)與技術(shù),2007(17):1352-1353.