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压缩
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要出色的多,集成到游戏里也很简单,可以说是性价比很高的一个技术。
![](http://www.outerra.com/video/vid-orig1.png)
原始图像
![](http://www.outerra.com/video/vid-yog1.png)
压缩后的视频截图
![](http://www.outerra.com/video/vid-dif4x1.png)
4xDiff
DXT的压缩方法不适合于游戏图像,因为游戏图像的对比度很高,会导致色块很严重,因此可以换个思路将RGB转换到 YCoCg(Y为强度,CoCg分
别为橙色和绿色色度),YCoCg空间很适合DXT压缩
具体步骤如下:
1. 将每帧渲染的数据通过YCoCg的方式压缩,整体数据量降低为原来的1/32. 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要出色的多,集成到游戏里也很简单,可以说是性价比很高的一个技术。
![](http://www.outerra.com/video/vid-orig1.png)
原始图像
![](http://www.outerra.com/video/vid-yog1.png)
压缩后的视频截图
![](http://www.outerra.com/video/vid-dif4x1.png)
4xDiff
相关文章推荐
- 浙大ZOJ 1011 NTA问题解决
- lwqq
- ServletContextListener使用详解
- 图像基本处理算法的简单实现(一)
- 串口编程利器:Pcomm lite 串口库介绍
- A general iterated shinkage algorithm for non-convex sparse coding.
- netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 详解
- Review Board,时区,HTTP
- 提出一种数据结构支持pop push 和findMin,并且每种操作的运行时间最坏为O(1)
- 黑马程序员——网络编程
- Android ListView的Item中有CheckBox,导致OnItemClick不响应的解决办法
- Linux Kernel中list解读
- PLSQL developer 连接不上64位Oracle 的解决方法
- 定义不同错误的异常类
- Java网络编程
- 定义不同错误的异常类 分类: python异常 2014-01-09 14:21 251人阅读 评论(0) 收藏
- Lync sign-in process
- 黑马程序员——GUI
- CDC与位图的一些概念 .
- Oracle的递归