《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 一種多視點自由立體高清視頻播放器的設(shè)計與實現(xiàn)
一種多視點自由立體高清視頻播放器的設(shè)計與實現(xiàn)
來源:電子技術(shù)應(yīng)用2011年第12期
高得鑫1,侯永宏1,王寶亮1,韓晶晶1, 鄒箭男2
1. 天津大學(xué) 電子信息工程學(xué)院,天津 300072; 2. 江西司法警官職業(yè)學(xué)院, 江西 奉新330013
摘要: 根據(jù)多視點自由立體視頻的壓縮編碼特征與數(shù)據(jù)存儲結(jié)構(gòu),提出一種基于光柵顯示技術(shù)的軟件解決方案,采用底層Windows API 編寫實現(xiàn)播放器的全部功能。設(shè)計實現(xiàn)了針對YUV視頻格式的播放器,并以此為基礎(chǔ)加入H.264解碼功能模塊,最終實現(xiàn)多線程工作模式的視頻播放器,支持YUV與H.264兩種視頻格式,具備平面/立體播放模式自由切換功能。播放立體視頻時圖像清晰、流暢、立體感明顯。
關(guān)鍵詞: 自由立體 高清 播放器 YUV H.264
中圖分類號: TP37
文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2011)12-0140-04
The design and implementation of a high definition multi-view stereoscopic video player
Gao Dexin1, Hou Yonghong1, Wang Baoliang1, Han Jingjing1, Zou Jiannan2
1. Department of Electronic and Information Engineering, Tianjin University, Tianjin 300072, China; 2. Jiangxi College of Judicature and Police Officer, Fengxin 330013, China
Abstract: According to the compression characteristics and the data storage structure of high definition multi-view stereoscopic video, a software solution based on raster display technology is proposed, using the underlying Windows API to achieve the full functionality of the video player. Firstly, a video player for the format of YUV is designed, then a H.264 decoding module is added, and eventually a video player working in multi-thread mode is implemented. The player with a function of flat / three-dimensional mode switching supports both YUV and H.264 video format. With the help of this player, stereoscopic video could be seen clearly and smoothly, and obvious three-dimensional feeling can be obtained.
Key words : stereoscopic; high definition; video player; YUV; H.264


    自由立體顯示技術(shù)是指不需佩戴諸如立體眼鏡等附屬設(shè)備的三維立體顯示技術(shù)[1],又稱“裸眼式3D技術(shù)”,觀察者無需借助立體眼鏡即可裸眼體驗立體感覺。自由立體視頻技術(shù)的諸多優(yōu)點決定其必然成為今后立體顯示的發(fā)展趨勢。目前國內(nèi)外尚無商用、成熟、專用于自由立體顯示技術(shù)的播放器軟件,所以開發(fā)專用于自由立體視頻播放顯示的技術(shù)方案顯得尤為重要。根據(jù)多視點自由立體顯示技術(shù)的特點,本文提出了一種基于光柵顯示技術(shù)的自由立體視頻播放方案。
    該方案基于MFC框架,播放器功能完全采用底層的WIN32API實現(xiàn),具有結(jié)構(gòu)清晰、設(shè)計簡潔、可擴(kuò)展性強(qiáng)的特點。與普通視頻相比,立體視頻具有多個視頻通道,數(shù)據(jù)量較大。本文所涉及的自由立體視頻源,其每一幀的立體圖像都由8幅存在一定視差的平面圖像合成而來。需要播放立體視頻時,通過與狹縫光柵相匹配的立體合成算法[2],將8幅分辨率為720×360的圖像合成分辨率為1 920×1 080的立體圖像進(jìn)行顯示。所以,播放器除了具有普通視頻播放器的基本功能之外,還具備視頻格式自動匹配、幀率控制及平面/立體模式自由切換等功能。同時,為了達(dá)到明顯的立體效果,幀率至少要達(dá)到20 f/s以上。
1 自由立體視頻播放器實現(xiàn)原理
  播放器基于MFC框架,按鈕控件實現(xiàn)對播放器各項功能的控制,進(jìn)度條控件顯示視頻解碼線程的進(jìn)度,滾動條控件顯示視頻播放的進(jìn)度,并具備拖動滾動條以控制視頻進(jìn)度的功能。靜態(tài)文本控件內(nèi)顯示視頻幀數(shù),累計時長、平均幀率等實時信息。播放器原理如圖1所示。

    立體播放器處理視頻文件的流程是,從數(shù)據(jù)文件讀取YUV420數(shù)據(jù),根據(jù)圖像的大小,以幀為單位轉(zhuǎn)換為內(nèi)存無關(guān)位圖DIB(即RGB格式)[3],并利用與狹縫光柵相匹配的合成算法將RGB像素數(shù)據(jù)重新組合排列,最終將內(nèi)存中已經(jīng)排列好的RGB數(shù)據(jù)顯示在播放器的視頻區(qū)域。
    視頻播放器的顯示原理與動畫片的原理類似,利用人眼的視覺暫留特性,快速地把一張張圖像貼到播放器的視頻區(qū)域。人眼無法分辨這些靜止圖像,感覺如同播放動畫一樣。
    通過貼有特定光柵的顯示器來顯示、播放立體圖像,由于觀察者雙眼相對于光柵屏幕的空間位置不同,會產(chǎn)生雙眼視差[4],從而令觀察者無需借助立體眼鏡即可裸眼體驗立體感覺。
2 播放器性能
    為了精確測量播放程序中各個功能模塊的耗時情況,程序中加入了測量時間的功能。
    實現(xiàn)方式:在程序運行時,首先調(diào)用QueryPerformanceFrequency()函數(shù),得到CPU的時鐘頻率m_freq。在需要測量時間的操作 之前和之后調(diào)用QueryPerformanceCounter()函數(shù),分別得到2個時鐘計數(shù)值 m_count
_start和m_count_stop,則利用公式:
    dT=1 000(m_count_stop-m_count_star)/m_freq
即可得到執(zhí)行操作所消耗的時間。
  利用此種方法,測得播放器播放視頻過程中各個環(huán)節(jié)的耗時情況,如圖2所示。

    初步實現(xiàn)播放功能時,播放視頻的幀率很低,只有9 f/s~11 f/s,所以需要針對視頻播放過程中各個環(huán)節(jié)的原理和特點采取不同的方式提高播放器的運行效率。
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]。對具備顯示圖像功能的函數(shù)進(jìn)行測試,結(jié)果如下:
  (1) StretchDIBits。可以用拉伸模式完成全屏顯示功能,但是在拉伸模式下,圖像會出現(xiàn)明顯的色彩錯誤。
  (2) SetDIBitsToDevice。只能原比例顯示圖像,如果顯示器的分辨率設(shè)置小于1 920×1 080,則圖像無法完整顯示。
  (3) DrawDib函數(shù)組。DrawDib是不依賴于圖形設(shè)備接口(GDI)而直接操作顯存的函數(shù)組。能夠?qū)崿F(xiàn)圖像的顯示功能,并且能以任意寬高比進(jìn)行拉伸顯示,拉伸后的圖像無色彩錯誤。所以,此處采用DrawDib函數(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)測試,DrawDib函數(shù)組能夠很好地完成DIB圖像的顯示,貼圖速度快,沒有明顯的延遲現(xiàn)象,并且在全屏模式播放時沒有出現(xiàn)類似使用StretchDIBits()函數(shù)時出現(xiàn)的色彩失真,達(dá)到了良好的顯示效果。
3.2 內(nèi)存映射文件處理大文件操作
 分辨率為1 920×1 080的600幀的視頻,采用YUV420存儲格式時,體積高達(dá)1.78 GB。目前,對于這種大文件的操作通常是以內(nèi)存映射文件的方式來加以處理的[6]。
    根據(jù)播放器功能模塊的耗時統(tǒng)計結(jié)果,未使用內(nèi)存映射文件方式,而直接從硬盤讀取分辨率為720×360×8的YUV420數(shù)據(jù),平均每幀耗時35 ms,是整個播放流程中耗時最大的環(huán)節(jié)。所以,采用內(nèi)存映射文件的方式改進(jìn)文件讀取模塊可以提高播放器的效率。內(nèi)存文件映射是Windows的一種內(nèi)存管理方法,通過文件映射使磁盤文件的全部或部分內(nèi)容與進(jìn)程虛擬地址空間的某個區(qū)域建立映射關(guān)聯(lián),可以直接對被映射的文件進(jìn)行訪問,不必執(zhí)行文件I/O操作也無需對文件內(nèi)容進(jìn)行緩沖處理,這種特性在進(jìn)行大文件的磁盤事務(wù)操作時將獲得很高的效益。內(nèi)存映射文件的一般編程流程如圖3所示。

    經(jīng)過實際對比測試,直接從硬盤讀取分辨率為720×360×8的YUV420數(shù)據(jù)平均毎幀耗時35 ms。而通過內(nèi)存映射文件的方式讀取每幀數(shù)據(jù)的耗時可減少到15 ms左右??梢妰?nèi)存映射文件在處理大數(shù)據(jù)量文件時表現(xiàn)出了良好的性能,比通常使用的CFile類和 ReadFile()等函數(shù)的文件處理方式更加快速有效。
3.3 緩沖解碼
    播放器已經(jīng)實現(xiàn)了YUV視頻格式的播放功能,在此基礎(chǔ)上加入H.264解碼模塊以實現(xiàn)播放器對H.264格式的支持。

 


    采用開放源碼的JMVC來處理H.264視頻視頻的解碼。經(jīng)測試,對于1 920×1 080的H.264視頻,JMVC解碼速度在12 f/s左右,如果采用實時解碼播放的方式,播放的幀率較低,達(dá)不到流暢播放的要求,因此采用緩沖解碼的方式來實現(xiàn)。環(huán)形緩沖區(qū)的工作原理如圖4所示。

    為了接收J(rèn)MVC解碼H.264產(chǎn)生的YUV數(shù)據(jù),首先在內(nèi)存中開辟出能夠存儲100幀YUV數(shù)據(jù)的環(huán)形緩沖區(qū)YUV Buffer。所謂“環(huán)形”,是指當(dāng)需要接收的YUV圖像幀數(shù)多于緩沖區(qū)的承載量時,數(shù)據(jù)指針從緩沖區(qū)結(jié)尾處重新跳轉(zhuǎn)至緩沖區(qū)起始處,即重新返回到緩沖區(qū)起始處開始存儲,將先前的YUV數(shù)據(jù)覆蓋掉。播放線程將緩沖區(qū)內(nèi)的YUV數(shù)據(jù)處理并顯示出來后,數(shù)據(jù)指針同樣從緩沖區(qū)結(jié)尾處重新跳轉(zhuǎn)至緩沖區(qū)起始處,即重新返回緩沖區(qū)起始處,繼續(xù)處理播放YUV數(shù)據(jù)。
3.4 多線程的應(yīng)用
    根據(jù)播放器功能模塊的耗時統(tǒng)計結(jié)果,使用單線程方式處理YUV數(shù)據(jù)的轉(zhuǎn)換和RGB數(shù)據(jù)的合成平均耗時為18 ms和20 ms。
    為了提高多核CPU的利用效率,采用多線程方式改進(jìn)程序的功能模塊。由于圖像以幀為單位,每幀YUV圖像數(shù)據(jù)排列結(jié)構(gòu)相同且無相關(guān)性,所以在處理時將每幀圖像由上至下分成4快,每塊圖像數(shù)據(jù)開啟一個線程,同時采用四線程來處理轉(zhuǎn)換過程。轉(zhuǎn)換得到RGB圖像,其像素數(shù)據(jù)的排列順序也是從左至右、從下至上,所以RGB的合成工作也可采用四線程實現(xiàn)。
    經(jīng)過實際對比測試,采用4線程處理YUV數(shù)據(jù)的轉(zhuǎn)換和RGB數(shù)據(jù)的合成,平均耗時降至5 ms和7 ms,大大提高了圖像數(shù)據(jù)的轉(zhuǎn)換與合成效率。
3.5 多線程同步、線程間通信
    在播放H.264視頻格式的模式下,播放器首先啟動解碼線程,向緩沖區(qū)內(nèi)寫入YUV數(shù)據(jù)。當(dāng)緩沖區(qū)內(nèi)開辟的100幀控件被裝滿后,需要利用線程通信機(jī)制向播放線程發(fā)送消息。播放線程開始處于等待狀態(tài),從消息隊列中取得相應(yīng)消息并驗證,當(dāng)識別出解碼線程發(fā)送的特定消息后開啟播放功能。采用此種方式,可以在保證視頻不間斷播放的基礎(chǔ)上提高視頻播放的幀率。但是由于采用多線程實現(xiàn),線程間的同步成為不可忽視的問題。
    解碼和播放兩個線程是同時執(zhí)行的,解碼線程提供YUV圖像數(shù)據(jù),播放線程將緩沖區(qū)內(nèi)的YUV數(shù)據(jù)處理成RGB位圖數(shù)據(jù)并顯示出來。不允許在某一時刻,在任何一段內(nèi)存區(qū)域上同時發(fā)生讀取和寫入操作,所以,必須采取有效的線程同步措施。常用的線程同步方式有:互斥對象、事件對象、臨界區(qū)等。播放器中需要同步的只有解碼和播放兩個線程,所以此處采用互斥對象來實現(xiàn)線程的同步。線程之間的同步規(guī)則是:
    (1) 解碼線程可以超前播放線程,但是超前的幀數(shù)不能大于緩沖區(qū)的長度。
    (2) 播放線程不可以超前解碼線程。
    根據(jù)緩沖區(qū)的長度構(gòu)造一個互斥對象數(shù)組,數(shù)組的每個元素與緩沖區(qū)中一幀的YUV數(shù)據(jù)相對應(yīng)。解碼線程向緩沖區(qū)的某個區(qū)域?qū)懭霐?shù)據(jù)之前,首先要請求與該位置相對應(yīng)的互斥對象的擁有權(quán),完成寫入操作后,應(yīng)立即放棄該互斥對象的所有權(quán);播放線程從緩沖區(qū)內(nèi)讀取數(shù)據(jù)之前,也要首先請求與該位置相對應(yīng)的互斥對象,完成讀取操作后立即釋放該互斥對象。
    由于互斥對象只能被一個線程所擁有,在執(zhí)行相關(guān)操作前,如果得不到相應(yīng)的互斥對象,線程函數(shù)就會暫停執(zhí)行,等待另一個線程釋放互斥對象,有效地避免了同一段內(nèi)存同時被兩個線程讀取和寫入情況的。    
     經(jīng)過測試,這種方案成功地實現(xiàn)了解碼線程和播放線程的同步協(xié)調(diào),有效地避免了播放視頻過程中出現(xiàn)進(jìn)度差錯的問題。
3.6 視頻播放速率的控制
    播放線程中包含的操作有:(1) YUV到RGB轉(zhuǎn)換;(2) RGB圖像數(shù)據(jù)的重新合成;(3) RGB圖像的顯示。這三項操作整合到一個線程中,因為其時間損耗之和明顯小于H.264解碼,所以通過控制播放線程的速率來實現(xiàn)控制整體播放幀率的功能。
  播放線程中,設(shè)置一個定時器,每隔一定時間,執(zhí)行一幀的播放操作。播放線程每處理一幀圖像耗時約15 ms,每秒能顯示圖像的幀數(shù)約為66幀(1 000/15=66.6),所以用定時器控制播放線程的執(zhí)行時,只要將定時器的時隙設(shè)置成大于15 ms的任意值,就能實現(xiàn)以指定的幀率來播放視頻。例如,想要以25 f/s的幀率播放,只需將控制播放線程的定時器時隙設(shè)置成40 ms即可。
    經(jīng)過優(yōu)化后的各個環(huán)節(jié)耗時情況如圖5所示。

3.7 平面2D/立體3D模式任意切換功能
    平面與立體圖像的區(qū)別只是RGB像素排列的不同,所以要播放普通的平面2D圖像,只需要在合成立體圖像的環(huán)節(jié)中,將8個不同視點的數(shù)據(jù)來源設(shè)置成相同的8個視點圖像中的任意一個,合成后的圖像則是普通的2D平面圖像,通過光柵屏幕的觀看效果和在普通屏幕上觀看平面圖像的效果是相同的。
4 播放器外觀及顯示效果
    最終實現(xiàn)的播放器具備打開、列表、緩沖、播放、暫停、停止、進(jìn)度控制、全屏播放及2D/3D模式切換等功能。如圖6所示,上圖為普通模式播放效果,下圖為立體模式播放效果(立體模式需要在貼有光柵的專門顯示設(shè)備上觀看,在普通顯示器上觀察到的是模糊的圖像)。

    本文提出的立體視頻播放器的實現(xiàn)方案運用WIN32API實現(xiàn)播放功能,播放器不依賴于任何其他外部組件,軟件結(jié)構(gòu)清晰、設(shè)計原理簡潔、具有很強(qiáng)的可擴(kuò)展性。目前播放器已經(jīng)實現(xiàn)了對YUV和H.264兩種視頻格式的支持,以后還可以根據(jù)需要擴(kuò)展其功能。立體播放器以貼有光柵的42英寸大屏幕顯示器作為顯示輸出設(shè)備,播放視頻清晰流暢,立體視覺效果明顯,幀率符合設(shè)計要求,達(dá)到了預(yù)期的設(shè)計目標(biāo)和性能要求。
參考文獻(xiàn)
[1] 秦開懷,羅建利.自由立體顯示技術(shù)及其發(fā)展[J].中國圖像圖形學(xué)報,2009,14(10):1934-1940.
[2] 宋曉煒,楊蕾.一種光柵普適的LCD多視點立體圖像合成方法[J].計算機(jī)應(yīng)用,2008,1(28):195-198.
[3] 邵丹,韓家偉.YUV與RGB之間的轉(zhuǎn)換[J]. 長春大學(xué)學(xué)報,2004(4):51-53.
[4] 楊嘉琛,侯春萍,雷建軍.基于人眼視覺特征的立體圖像質(zhì)量客觀評價方法[J].天津大學(xué)學(xué)報,2009,42(7):622-627.
[5] 王伯尊,張鳳茹.在Windows下實現(xiàn)多幅大尺寸位圖的顯示與瀏覽[J].應(yīng)用科技,2002,29(4):42-44.
[6] 賈琴勇,郭慶平.內(nèi)存映射文件在大型數(shù)據(jù)文件中的實現(xiàn)及其優(yōu)越性[J].電腦知識與技術(shù),2007(17):1352-1353.
 

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。