拖延了两个多月,终于可以开始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