最近在搞视频播放这玩意,因为《天下贰》有需要播放片头动画,就是我们在游戏中常见的过场电影,首先想到肯定是bink video,很多游戏都用它,虽然我到现在还没有搞清楚其优势同目前主流的rmvb、wmv等体现在那里,但看到其高昂的价格,又不提供试用,我望而却步了,辗转在wmv和开源的xvid、ogm之间选择,最后经过比较和测试选择了xvid,其中一个最大的原因就是使用xvid代码很简单,就1个函数,3种用法,分别是create,delete和解码一帧,解出来的帧可以制定为很多格式,比如rgba32,rgba16,yuv等,内部已经统统帮你处理好,返回一个处理好的buffer,对于3d游戏,我们直接使用rgba32或者rgb24,创建对应贴图,lock填充,然后绘制出来就ok了。为了重用,引擎内部设计了一种MovieTexture,这样甚至可以把视频当作贴图贴到任何多边形上,而不一定用于传统的视频播放,想想我们场景如果放了一个电视:)。

 

xvid本身只对视频编码,所以xvid提供的库也没有音频的部分,如果需要播放带音频的文件,就需要考虑视频、音频同步的问题,xvid经过编码后一般是avi文件,而avi文件可以附带音频编码,而音频编码也不在乎采用的格式,比如mp3,ogg都可以,我采用的同步方案就是时间轴同步,视频和音频采用同一时间轴,当发生视频不同步的时候,音频等待视频,因为视频编码有关键桢和非关键桢,不能直接skip到某帧,否则可能出现马赛克。如果skip到关键桢,则需要分析avi文件idx0 chunk数据,传入对应stream buffer即可。