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

本文介绍了通过实时YUYV-DXT压缩技术实现在游戏中捕获高清视频的方法,避免了使用第三方工具如Fraps导致的帧率下降问题。这种方法将RGB转换为YCoCg空间进行压缩,减少数据量并降低CPU和GPU间带宽需求。虽然需要集成到游戏内部,但能显著提高录制体验,且效果优于Fraps。

 玩游戏的时候想截取视频一般都是通过第三方工具来完成的,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

 


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值