源代码下载

在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技术,还可以做出很炫很酷的特效,就看我们的想象力了。

from:http://blog.csdn.net/dengzikun/article/details/5807694

使用D3D渲染YUV视频数据的更多相关文章

  1. 使用D3D渲染YUV视频数据<转>

    源代码下载 转载地址:http://blog.csdn.net/dengzikun/article/details/5824874 源码地址:http://download.csdn.net/down ...

  2. 使用DirectDraw直接显示YUV视频数据

    最近在编写一个进行视频播放的ActiveX控件,工作已经接近尾声,现将其中显示YUV数据的使用DirectDraw的一些经验总结如下:(解码部分不是我编写的,我负责从网络接收数据,将数据传给解码器,并 ...

  3. 如何使用DirectDraw直接显示RGB、YUV视频数据(播放yuv)

    #include "draw.h"void CTest100Dlg::OnButton1() { // TODO: Add your control notification ha ...

  4. 基于RTP的H264视频数据打包解包类

    from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...

  5. JavaCV 采集摄像头及桌面视频数据

    javacv 封装了javacpp-presets库很多native API,简化了开发,对java程序员来说比较友好. 之前使用JavaCV库都是使用ffmpeg native API开发,这种方式 ...

  6. FFmpeg YUV视频序列编码为视频

    上一篇已经写了如何配置好开发环境,这次就先小试牛刀,来个视频的编码.搞视频处理的朋友肯定比较熟悉YUV视频序列,很多测试库提供的视频数据都是YUV视频序列,我们这里就用用YUV视频序列来做视频.关于Y ...

  7. D3D-GetBackBuffer &GetFrontBufferData 抓屏&D3D抓取GPU数据

    HRESULT GetBackBuffer( [in]          UINT                iSwapChain, [in]          UINT              ...

  8. 实战OpenGLES--iOS平台使用OpenGLES渲染YUV图片

    上一篇文章 实战FFmpeg--iOS平台使用FFmpeg将视频文件转换为YUV文件 演示了如何将视频文件转换为yuv文件保存,现在要做的是如何将yuv文件利用OpenGLES渲染展示出图像画面.要将 ...

  9. 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码

    ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的測试,图像格式png,jpg, gif等等測试均O ...

随机推荐

  1. 【BZOJ】【2561】最小生成树

    网络流/最小割 对于所有小于L的边求一个割使得U,V不连通,这样就可以保证L可能在最小生成树里. 最大生成树同理. 答案累加一下即可.(Orz Hzwer) (我一开始怎么会sb地去想到一起求呢……) ...

  2. 【BZOJ】【2194】快速傅里叶之二

    FFT c[k]=sigma a[i]*b[i-k] 这个形式不好搞…… 而我们熟悉的卷积的形式是这样的 c[k]=sigma a[i]*b[k-i]也就是[下标之和是定值] 所以我们将a数组反转一下 ...

  3. sql2008安装时提示重启计算机失败解决方法

    安装sql 2008的时候,在检测安装环境中有一项是”重新启动计算机”显示的结果是“失败”.上网看了半天,找到了解决方案,虽然我没弄明白具体原因,但问题是解决了,解决方案如下: 一.Windows+R ...

  4. WCF 笔记 (2) - 传输泛型 List 对象

    WCF 笔记 (2) - 传输泛型 List 对象 本帖介绍怎么在 WCF 中,在 Server-side 和 Client-side 之间,传递默认无法传输的 List<T>.List& ...

  5. Appium对京东App中WebView的处理

    Appium用uiautomator无法对WebView进行className定位,所以只能模拟动作.可以用android sdk自带的monitor工具,先进行截图,再用任意图像处理软件,获取截图的 ...

  6. HDU1251 统计难题 Trie树

    题目很水,但毕竟是自己第一道的Trie,所以还是发一下吧.Trie的更多的应用慢慢学,AC自动机什么的也慢慢学.... #include<iostream> #include<cst ...

  7. 2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)

    题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少 ...

  8. 理解maven

    1.理解“仓库” 首次运行完mvn -version后,会在用户目录下创建一个.m2的目录(比如:C:\Users\当前用户名\.m2\),这个目录是maven的“本地仓库”,仓库是maven中一个很 ...

  9. Xamarin.Android 入门之:xamarin使用webserver和html交互

    一.引言 如今,Android+html5开发已经成为最流行的开发模式. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设 ...

  10. HTML5 增强的页面元素

    一.HTML5 改良的 input 元素的种类 1.<input type="number" id="num1"> var n1 = documen ...