概述
windows 平台下视频渲染技术
-
GDI
图形设备接口(Graphics Device Interface)。主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形和图像输出。GDI的出现使程序员无需要关心硬件设备及设备正常驱动,就可以将应用程序的输出转化为硬件设备上的输出和构成,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。
关于GDI的简介可以阅读这篇文章。 -
DirectDraw
DirectDraw是微软发行的DirectX SDK中的一部分。DirectDraw已经过时,取而代之的是Direct2D。
Direct2D 是一种硬件加速的即时模式二维图形 API,可为二维几何对象、位图和文本提供高性能、高质量的呈现。Direct2D API 可与使用 GDI、GDI+ 或 Direct3D 的现有代码进行交互。 -
Direct3D
Direct3D就是本文使用的渲染方式。我们在前文渲染图片也讲过了,主要有两种渲染方法,一种是使用Surface,另一种是使用Texture。 -
OpenGL
Open Graphics Library,开放图形库。
用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。
说明
Direct3D 接口适用于 Windows平台
OpenGL 是跨平台的。
本文目的
基于D3D技术,使用其中的纹理方法,实现仅创建一个窗口,渲染多路视频。
一般的,在视频监控领域,显示多个视频,每一个视频都是一个独立的窗口。为了减少窗口的资源和管理,本文中介绍的方法是仅创建一个窗口,使用纹理内存的顶点映射方法,在一个大窗口中显示不同路的视频。
实现步骤
基本步骤
- 创建大窗口
- 创建统一的D3D设备资源
- 将大窗口划分为多个子区域,每一个子区域就是之后纹理内存映射的位置
- 为纹理内存填充视频数据
- 统一刷新
两种方式
实现方式分为两种,单独使用CPU渲染,单独使用GPU渲染。
两种方式基本步骤一致。
- CPU渲染,是因为解码数据也是CPU实现的,视频数据来源于CPU,然后直接使用CPU渲染。
- GPU渲染,是因为解码数据基于GPU实现,视频数据来源于GPU显存,不需要将显存数据做DtoH的拷贝操作,直接使用GPU资源渲染,减少资源拷贝的实践消耗。
- 两者的区别仅在于视频数据的来源,以及是否需要注册纹理资源。
窗口说明

举例说明:
上述1920x1080的窗口,要显示16个小区域,纹理顶点映射要做的就是,将1920x1080的视频分别映射到上述的每一个小区域中。
这其实是一个大窗口,针对这一个大窗口,创建一个D3D设备,对于所有的画面,执行统一的刷新(Present)。
代码说明
本节将介绍关键代码的使用和注意。
// 数据结构
// 全局句柄
IDirect3D9* pD3D;
IDirect3DDevice9* pDevice;
// 刷新线程
pthread *pRenderThread;

本文介绍在Windows平台上利用Direct3D技术在一个窗口中渲染多路视频的方法,包括使用CPU和GPU渲染的不同实现方式,并详细阐述了创建设备、纹理等关键步骤。
4327

被折叠的 条评论
为什么被折叠?



