《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 一種多視點自由立體高清視頻播放器的設計與實現(xiàn)
一種多視點自由立體高清視頻播放器的設計與實現(xiàn)
來源:電子技術應用2011年第12期
高得鑫1,侯永宏1,王寶亮1,韓晶晶1, 鄒箭男2
1. 天津大學 電子信息工程學院,天津 300072; 2. 江西司法警官職業(yè)學院, 江西 奉新330013
摘要: 根據多視點自由立體視頻的壓縮編碼特征與數據存儲結構,提出一種基于光柵顯示技術的軟件解決方案,采用底層Windows API 編寫實現(xiàn)播放器的全部功能。設計實現(xiàn)了針對YUV視頻格式的播放器,并以此為基礎加入H.264解碼功能模塊,最終實現(xiàn)多線程工作模式的視頻播放器,支持YUV與H.264兩種視頻格式,具備平面/立體播放模式自由切換功能。播放立體視頻時圖像清晰、流暢、立體感明顯。
中圖分類號: TP37
文獻標識碼: 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


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

    立體播放器處理視頻文件的流程是,從數據文件讀取YUV420數據,根據圖像的大小,以幀為單位轉換為內存無關位圖DIB(即RGB格式)[3],并利用與狹縫光柵相匹配的合成算法將RGB像素數據重新組合排列,最終將內存中已經排列好的RGB數據顯示在播放器的視頻區(qū)域。
    視頻播放器的顯示原理與動畫片的原理類似,利用人眼的視覺暫留特性,快速地把一張張圖像貼到播放器的視頻區(qū)域。人眼無法分辨這些靜止圖像,感覺如同播放動畫一樣。
    通過貼有特定光柵的顯示器來顯示、播放立體圖像,由于觀察者雙眼相對于光柵屏幕的空間位置不同,會產生雙眼視差[4],從而令觀察者無需借助立體眼鏡即可裸眼體驗立體感覺。
2 播放器性能
    為了精確測量播放程序中各個功能模塊的耗時情況,程序中加入了測量時間的功能。
    實現(xiàn)方式:在程序運行時,首先調用QueryPerformanceFrequency()函數,得到CPU的時鐘頻率m_freq。在需要測量時間的操作 之前和之后調用QueryPerformanceCounter()函數,分別得到2個時鐘計數值 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 關鍵技術研究與性能改進方法
3.1 內存中圖像數據的顯示

    將內存中的RGB數據顯示到視頻區(qū)域,需要在具備圖像顯示功能的函數體中,提供表示圖像顏色位數、尺寸等格式信息的結構體BITMAPINFO,以及圖像數據起始地址的指針BMPbuffer[5]。對具備顯示圖像功能的函數進行測試,結果如下:
  (1) StretchDIBits??梢杂美炷J酵瓿扇溜@示功能,但是在拉伸模式下,圖像會出現(xiàn)明顯的色彩錯誤。
  (2) SetDIBitsToDevice。只能原比例顯示圖像,如果顯示器的分辨率設置小于1 920×1 080,則圖像無法完整顯示。
  (3) DrawDib函數組。DrawDib是不依賴于圖形設備接口(GDI)而直接操作顯存的函數組。能夠實現(xiàn)圖像的顯示功能,并且能以任意寬高比進行拉伸顯示,拉伸后的圖像無色彩錯誤。所以,此處采用DrawDib函數組來實現(xiàn)內存位圖的顯示功能。
 顯示功能的核心偽代碼為:
 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()。
    核心函數是DrawDibDraw(),參數中需要提供視頻顯示控件上表示繪圖區(qū)域的參數rect、LPBITMAPINFO類型的結構體指針m_lpBmpInfo及DIB數據的起始地址BMPbuffer。
 經測試,DrawDib函數組能夠很好地完成DIB圖像的顯示,貼圖速度快,沒有明顯的延遲現(xiàn)象,并且在全屏模式播放時沒有出現(xiàn)類似使用StretchDIBits()函數時出現(xiàn)的色彩失真,達到了良好的顯示效果。
3.2 內存映射文件處理大文件操作
 分辨率為1 920×1 080的600幀的視頻,采用YUV420存儲格式時,體積高達1.78 GB。目前,對于這種大文件的操作通常是以內存映射文件的方式來加以處理的[6]。
    根據播放器功能模塊的耗時統(tǒng)計結果,未使用內存映射文件方式,而直接從硬盤讀取分辨率為720×360×8的YUV420數據,平均每幀耗時35 ms,是整個播放流程中耗時最大的環(huán)節(jié)。所以,采用內存映射文件的方式改進文件讀取模塊可以提高播放器的效率。內存文件映射是Windows的一種內存管理方法,通過文件映射使磁盤文件的全部或部分內容與進程虛擬地址空間的某個區(qū)域建立映射關聯(lián),可以直接對被映射的文件進行訪問,不必執(zhí)行文件I/O操作也無需對文件內容進行緩沖處理,這種特性在進行大文件的磁盤事務操作時將獲得很高的效益。內存映射文件的一般編程流程如圖3所示。

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

 


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

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

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

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

此內容為AET網站原創(chuàng),未經授權禁止轉載。