您的位置:首页 > 其它

In-Game HD Video Capture using Real-Time YUYV-DXT Compression

2014-01-09 14:23 295 查看
玩游戏的时候想截取视频一般都是通过第三方工具来完成的,Fraps很多时候会被用来截取实时的游戏视频,但是用了Fraps之后会发现帧率明显下降了很多,很影响游戏的体验。如果有一种可以实时截取游戏视频而不降低帧率的方法该多好啊,无意中发现Outerra的Blog有一篇Blog专门介绍了他们如何达到这个目的的,他们当然这个方法是需要内嵌到游戏本身的,不是像Fraps那么自由可以随便在那个游戏上,理论上应该是可以扩展一下的,只需要得到某个窗口的图像数据然后按照这个思路应该可以得到不错的效果。

DXT的压缩方法不适合于游戏图像,因为游戏图像的对比度很高,会导致色块很严重,因此可以换个思路将RGB转换到 YCoCg(Y为强度,CoCg分

别为橙色和绿色色度),YCoCg空间很适合DXT压缩

具体步骤如下:

1. 将每帧渲染的数据通过YCoCg的方式压缩,整体数据量降低为原来的1/3

2. cpu异步读取压缩的贴图数据

3. 将数据写入磁盘

GPU压缩贴图数据有效地降低了CPU和GPU之间的带宽,更重要的是可以降低磁盘写数据的带宽。SATA硬盘的持续写入速度是55MB/s,而不压缩的视频1280x720 30fps的数据量是79.1MB/s,而DXT压缩的视频只需要26.4MB/s,高清的数据流是59.3MB/s.

要截取游戏图像数据,需要先将游戏画面渲染到一张临时buffer里,压缩的shader用这个buffer的贴图作为输入,渲染到YCoCg,再提供给CPU读取。

下一步就是视频编码解码,我做了一个ffmpeg的插件来完成这个功能。

结果:

开始录视频后游戏会掉一些帧率,但是还是可以正常玩的,不像Fraps那样对帧率影响很明显。缺点是必须集成到游戏里才能使用,但最终结果非常不错。

下面给出结果以及和原始图像的对比。

这个方法可以说是量身定制的游戏录视频功能,在录视频方面比Fraps要出色的多,集成到游戏里也很简单,可以说是性价比很高的一个技术。



原始图像



压缩后的视频截图



4xDiff
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: