MVC學習--JMVC入門

拖延了兩個多月,終於可以開始MVC方面的學習了,開頭總擔心3月的時候收到熱心朋友傳送的MVC論文集會荒廢掉,本週終於可以開工了。經過兩個月的資料準備,已經基本確定了以JVT-AD007標準文檔和JMVC的代碼開始MVC的學習,經過本週的努力,標準文檔和代碼都快速瀏覽了一遍,也比較簡略的看了幾篇論文,現在先做個小結。由於一切剛剛開始,希望看到文章的朋友多多斧正,也希望更多的朋友能加入到3DTV和MVC的研究工作中來,能夠一起努力。在我的學習過程中得到mvc的QQ羣(30262778)各位朋友的幫助,特此感謝。

多視角視頻編碼(Multiview video coding)是在H.264標準當中新增的內容,其歷史淵源和概況可以參照《Overview of Multi-view Video Coding》這篇論文,根據我所接觸到的同行當中,有進行計算機視覺研究的,有流媒體的,也有做3D視頻渲染的或者就是做編碼本身的。這些方向無疑對未來實際產品的開發有很重要的價值。我自己的研究方向還沒有確定下來,想先學習一下,然後再好好思考。

我先從JMVC入手,進行大概的系統實驗,該軟件是MVC的測試模型。我用的是JMVC4.0版本,該版本可以從mvc的QQ羣(30262778)的共享目錄中獲得,在VC2005編譯,沒有語法錯誤,之後在\jmvc\bin生成相應的可執行文件如下圖。

根據SoftwareManual,它們的功能分別是:

DownConvertStaticd: 進行視頻重新採樣的工具,可以進行上下采樣實驗。

H264AVCDecoderLibTestStaticd:解碼

H264AVCEncoderLibTestStaticd:編碼

MVCBitStreamAssemblerStaticd:把多個視點編出的264文件合成一個多視點264

MVCBitStreamExtractorStaticd:從一個多視點的264文件中提取出所需要的視點的264文件

PSNRStaticd:統計PSNR

最先接觸的是H264AVCEncoderLibTestStaticd,ballroom序列被用於編碼測試,在我的臺式機上編碼13幀0視點序列用了20分鐘左右,可見多視點編碼的編碼還是有很多需要優化的地方,並且可能要更高級的硬件平臺,才能走向使用。當我要編一個0-2-1三視點的測試的時候,寫了個小的批處理文件,實在不能等到中間手工切換。於是,可以再bin中加入一個bat文件,比如我的mvcenc.bat,然後寫上如下命令:

H264AVCEncoderLibTestStaticd -vf encoderMVC.cfg 0 >> log.txt
H264AVCEncoderLibTestStaticd -vf encoderMVC.cfg 2 >> log.txt
H264AVCEncoderLibTestStaticd -vf encoderMVC.cfg 1 >> log.txt

保存後雙擊此文件,就可以等結果了。我等着ballroom的三個序列,每個250幀,花掉18小時多。

等那三個序列出來後,用MVCBitStreamAssemblerStaticd進行了合成實驗,速度倒是很快了,不到一分鐘,就完成了,將三個流合成一個複合文件。(//todo以後將要進行碼流解讀的實驗)然後驗證一下PSNR的情況,此時,在原來制定的編碼配置文件(我這裏是bin/encoderMVC.cfg)中的ReconFile文件地址找到相應的重構文件,所謂重構文件就是經過編碼後在解碼的yuv文件,利用PSNRStaticd進行分析:

命令 PSNRStaticd <w> <h> <org> <rec> [<t> [<skip> [<strm> <fps>]]]
舉例:PSNRStaticd 640 480 D:\workspace\264\ballroom\ballroom_0.yuv recon_0.yuv 0 0 output_0.264 25
將列舉出每幀的PSNR和各幀平均值得
0       32,7034 37,2575 37,3829
1       32,0109 37,2741 37,2970
2       31,9856 37,2968 37,3429
3       32,0750 37,3475 37,3395
4       31,9481 37,3290 37,4099
5       31,9870 37,2369 37,4277
.
.
.
245     31,8244 37,4340 37,5473
246     31,7734 37,3649 37,5024
247     31,6821 37,2872 37,4452
248     31,8165 37,2298 37,3874
249     31,3657 37,0969 37,3409

266,8360        31,8918 37,2735 37,1468
266,8360        31,8918 37,2735 37,1468

等這些實驗跑了一次,有個基本的認識了,就可以去看看SoftwareManual對於cfg配置文件的說明了,這裏多數是容易理解的,有一項IterSearchRange,開頭不怎麼理解,後來在文豪的幫助講解下,知道是對B幀預測進行運動矢量迭代求解的算法,具體過程可以參考《Joint Estimation of Forward and Backward Motion Vectors for Interpolative Prediction of Video》。

弄清楚了這些,就可以看看具體的源碼和標準文檔了。一般從標準文檔弄清楚解碼過程是第一步,在學習JM的時候,很多人推薦這麼做。

JVT-AD007的Annex H是MVC部分,簡略看一下,以後還要經常翻看。我在看對anchor picture的解釋時,看到no inter prediction is used, and all following coded pictures in output order do not use inter prediction from any picture prior to the coded picture in decoding order. 看描述很像I幀,對比hierarchical B來看有點困惑,對比下面的結構圖,爲什麼I,B,P幀都有可能是anchor picture,後來問人才知道,我弄混了inter 和inter-view的概念,在這裏,inter 就是隻同一個視點的幀間預測,而inter-view纔是不同視點圖像的視圖間預測,是有區別的。

所以,anchor picture是GOP的最後一個幀,I,B,P幀都有可能是anchor picture。

H.8中會介紹解碼過程,和一般的H264對比,最直觀的是增加了參考幀調整和複合流的分解兩項,也許可以認爲,只有這兩個部分比較特殊於普通264/AVC的解碼。(//todo要解析清楚這兩個部分

代碼可以從H264AVCDecoderLibTest.cpp或者H264AVCEncoderLibTest.cpp的main函數開始入手,這裏是一個調用實際解碼庫和編碼庫的測試函數,我是先把編碼部分大致看了一下,這部分的主線如下:

H264AVCEncoderTest::go() -> CreaterH264AVCEncoder::process() -> PicEncoder::process() -> PicEncoder::xEncodePicture() -> SliceEncoder::encodeSlice() -> MbEncoder::encodeMacroblock()

有關宏塊的幀內和幀間預測,和各種模式代價的計算,然後最佳模式的選擇都在MbEncoder::encodeMacroblock()中,從這裏可以索引到各種運動估計的算法,在MotionEstimation::estimateBlockWithStart中,這裏也許是很多研究人員關注的熱點,已經看到若干篇inter-view運動估計的文章。

這裏只是粗淺的對自己第一週的學習做個總結,爭取在第二週(5.18-5.24)能夠學習解碼代碼,說明清楚以上兩個問題(參考幀調整和複合流的分解),如果還有時間,分析一下代碼當中的運動估計過程。

來自:http://jmvc.blog.sohu.com/116601692.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章