使用D3D渲染YUV视频数据<转>
转载地址:http://blog.csdn.net/dengzikun/article/details/5824874
源码地址:http://download.csdn.net/download/dengzikun/2909129
在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示。OVERLAY技术主要是为了解决在PC上播放VCD而在显卡上实现的一个基于硬件的技术。OVERLAY的出现,很好的解决了在PC上播放VCD所遇到的困难。早期PC处理能力有限,播放VCD时,不但要做视频解码工作,还需要做YUV到RGB的颜色空间转换,软件实现非常耗费资源,于是,YUV OVERLAY表面出现了,颜色空间转换被转移到显卡上去实现,显卡做这些工作是具有天生优势的。
随着显卡技术的发展,OVERLAY的局限性也越来越充分的暴露出来。一般显卡只支持一个OVERLAY表面,用OVERLAY实现多画面比较困难,视频和文本的叠加也有困难,当然,要实现一些特效就更难了。更重要的是,OVERLAY技术在显卡上是属于2D模块,在高品质3D游戏的推动下,现在的显卡的功能和性能,主要体现在3D模块上,厂商投入最大的,也是在GPU的3D模块上。OVERLAY技术无法利用和发挥显卡GPU的3D性能。微软早就停止了对DIRECTDRAW的支持,鼓励开发人员转向DIRECT3D,所以OVERLAY也无法使用新的API。
早期的3D渲染,主要是使用CPU做的,显卡做的较少。后来,显卡GPU的处理能力越来越强,承担的3D渲染功能也越来越多,开始使用的是固定渲染管线,也就是说所有的渲染算法都是显卡内置的,我们只能组合使用这些算法。现在的显卡采用的都是可编程的渲染管线,也就是说我们可以编写自己的渲染算法,下载到显卡上去执行,替换固定渲染管线算法,灵活性大大提高。随着GPU效能的提高,显卡在图像处理、视频处理、科学计算等领域得到了广泛的应用。
使用D3D渲染YUV视频,可以采用D3D SURFACE渲染,也可以采用D3D纹理来渲染。SURFACE渲染比较简单,但功能限制较多,下面我们只讨论D3D纹理视频渲染。纹理视频渲染,就是把视频数据填充到二维纹理中,结合我们自己写的一段像素Shader代码,送到显卡的GPU渲染管线中去渲染。
以下假设读者了解所讨论的视频格式细节。
对于YV12视频数据,可以创建三个纹理,分别填充Y、U、V视频数据。对于缺失的U、V采样点,我们可以利用显卡内置的双线性滤波算法插值出来,这是简单的方法。当然,也可以采用更好的图像插值算法,以达到更高的图像质量,这需要我们通过Shader实现我们的插值算法,然后分别把U、V渲染到纹理,实现更好的插值。相对与双线性滤波,缺点是复杂更度高,效率低。U、V插值后,视频数据从YUV420转换为YUV444,然后做颜色空间转换,从YUV444转换为RGB32,转换的Shader代码很简单,就是一个矩阵乘法运算。对于I420数据,就是把YV12数据的U、V数据在内存中的位置对调,其他处理和YV12一样。
NV12格式,Y平面和YV12一样,UV部分是打包格式。所以UV部分需要单独处理,先把UV部分填充到一个纹理中,然后对UV纹理做两次简单的渲染到纹理,从而把U、V数据分别渲染到两个纹理。经过这样的处理,我们得到的数据就和YV12的数据一样了,接下来的处理就可以参照YV12的处理流程和方法了。
对于打包格式的数据YUY2,渲染时需要插值出缺失的U、V采样。YUY2在只在奇数像素上缺失U、V采样,这样处理的时候需要区分奇偶像素,对于偶数像素,不需要做U、V插值,直接做颜色空间转换。对于奇数像素,需要利用相邻的U、V采样做插值,可以采用Catmull-Rom插值算法或者线性插值算法。插值后,就可以做颜色空间转换。UYVY的做法和YUY2类似。
对于RGB格式,我所使用的NVIDIA GeForce 9800 GT显卡支持RGB32,RGB555,RGB565,不支持RGB24。所以对于RGB24,需要在Shader代码中分别取出R、G、B,再组成RGB32输出即可。RGB32,RGB555,RGB565不需要额外处理,可以直接渲染。
对于平面文本叠加,采用了微软提供的CD3DFont类,但这个类不支持中文,我在这个类的基础上做了一些修改,实现了一个支持中文的文本叠加类。这两个类互相配合,可以高效地实现平面文本叠加。
以上所讨论的内容,均使用Direct3D9.0c进行了验证测试。对OpenGL了解不多,但我想这些方法对于OpenGL应该同样适用,毕竟这两个3D架构在PC上实现的功能是相近的。
使用3D渲染平面视频,可以实现多种特效,像多画面、画中画、文本叠加、缩放,都很容易实现,性能也很好。如果结合其他3D技术,还可以做出很炫很酷的特效,就看我们的想象力了。
使用D3D渲染YUV视频数据<转>的更多相关文章
- 使用D3D渲染YUV视频数据
源代码下载 在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示.OVERLAY技术主要是为了解决在PC上播放VCD而在显 ...
- 使用DirectDraw直接显示YUV视频数据
最近在编写一个进行视频播放的ActiveX控件,工作已经接近尾声,现将其中显示YUV数据的使用DirectDraw的一些经验总结如下:(解码部分不是我编写的,我负责从网络接收数据,将数据传给解码器,并 ...
- 如何使用DirectDraw直接显示RGB、YUV视频数据(播放yuv)
#include "draw.h"void CTest100Dlg::OnButton1() { // TODO: Add your control notification ha ...
- 基于RTP的H264视频数据打包解包类
from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...
- JavaCV 采集摄像头及桌面视频数据
javacv 封装了javacpp-presets库很多native API,简化了开发,对java程序员来说比较友好. 之前使用JavaCV库都是使用ffmpeg native API开发,这种方式 ...
- FFmpeg YUV视频序列编码为视频
上一篇已经写了如何配置好开发环境,这次就先小试牛刀,来个视频的编码.搞视频处理的朋友肯定比较熟悉YUV视频序列,很多测试库提供的视频数据都是YUV视频序列,我们这里就用用YUV视频序列来做视频.关于Y ...
- D3D-GetBackBuffer &GetFrontBufferData 抓屏&D3D抓取GPU数据
HRESULT GetBackBuffer( [in] UINT iSwapChain, [in] UINT ...
- 实战OpenGLES--iOS平台使用OpenGLES渲染YUV图片
上一篇文章 实战FFmpeg--iOS平台使用FFmpeg将视频文件转换为YUV文件 演示了如何将视频文件转换为yuv文件保存,现在要做的是如何将yuv文件利用OpenGLES渲染展示出图像画面.要将 ...
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的測试,图像格式png,jpg, gif等等測试均O ...
随机推荐
- UVA-1660 Cable TV Network (最小割)
题目大意:给一张n个点.m条边的无向图,求最小点割集的基数. 题目分析:求无向图最小点割集的基数可以变成求最小割.考虑单源s单汇t的无向图,如果要求一个最小点集,使得去掉这个点集后图不再连通(连通分量 ...
- 331. Verify Preorder Serialization of a Binary Tree -- 判断是否为合法的先序序列
One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, ...
- IOS-工程师Mac上的必备软件
前言 iOS工程师一直都是那么的高逼格,用的是Mac电脑,耍的是iPhone手机,哇咔咔~~ 但是,作为一名iOS开发工程师,我们除了高逼格外,还必须是全能的.你不会点UI设计.不会点后台语 ...
- JDK1.7+eclipse 4.4(luna)+pydev4.4.5构建django开发环境
最近一直用pycharm搞django学习,但是到2017年随着版本的不断更新,启动之慢,吃资源吃内存越来越严重.果然想找一个IDE替代品. 之前用java开发分布式WEB应用,用eclipse开了N ...
- Window 7 平台的IE11浏览器预览版发布
继之前Windows 8.1 带来了IE11浏览器之后,今天Window 7 以及Windows Server 2008 R2平台的IE11浏览器预览版也已经发布. 当然这还只是一个开发者预览版,可能 ...
- c#实现对登陆信息的反馈,实现对网站登录密码的扫描
最近发现我们学校的电信上网改密码的页面很简单,没有验证码,于是我就很好奇,后来发现原来是我们学校的电信的那个改密码的页面有漏洞于是就可以通过扫描账号免费上网 原理就是对修改密码的页面进行POST请求 ...
- (转)Web系统大规模并发——电商秒杀与抢购
电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...
- 在create-react-app创建的项目下允许函数绑定运算符
前话 React的函数绑定一致是个问题,主要有下面几种方式: 事件处理器动态绑定 export default class Com extends React.Component { render() ...
- 《DSP using MATLAB》第2章习题Problem2.1
1.代码: %% ------------------------------------------------------------------------ %% Output Info abo ...
- Oracle联合查询
select * from teacher--联合查询 --01.union (并集)select tno from teacher where tno>1080 union(select tn ...