【DirectX3D - 5】渲染多路视频(单一窗口)

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

概述

windows 平台下视频渲染技术

  1. GDI
    图形设备接口(Graphics Device Interface)。主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形和图像输出。GDI的出现使程序员无需要关心硬件设备及设备正常驱动,就可以将应用程序的输出转化为硬件设备上的输出和构成,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。
    关于GDI的简介可以阅读这篇文章

  2. DirectDraw
    DirectDraw是微软发行的DirectX SDK中的一部分。DirectDraw已经过时,取而代之的是Direct2D。
    Direct2D 是一种硬件加速的即时模式二维图形 API,可为二维几何对象、位图和文本提供高性能、高质量的呈现。Direct2D API 可与使用 GDI、GDI+ 或 Direct3D 的现有代码进行交互。

  3. Direct3D
    Direct3D就是本文使用的渲染方式。我们在前文渲染图片也讲过了,主要有两种渲染方法,一种是使用Surface,另一种是使用Texture。

  4. OpenGL
    Open Graphics Library,开放图形库。
    用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。

说明
Direct3D 接口适用于 Windows平台
OpenGL 是跨平台的。

本文目的

基于D3D技术,使用其中的纹理方法,实现仅创建一个窗口,渲染多路视频。
一般的,在视频监控领域,显示多个视频,每一个视频都是一个独立的窗口。为了减少窗口的资源和管理,本文中介绍的方法是仅创建一个窗口,使用纹理内存的顶点映射方法,在一个大窗口中显示不同路的视频。

实现步骤

基本步骤

  1. 创建大窗口
  2. 创建统一的D3D设备资源
  3. 将大窗口划分为多个子区域,每一个子区域就是之后纹理内存映射的位置
  4. 为纹理内存填充视频数据
  5. 统一刷新

两种方式

实现方式分为两种,单独使用CPU渲染,单独使用GPU渲染。
两种方式基本步骤一致。

  • CPU渲染,是因为解码数据也是CPU实现的,视频数据来源于CPU,然后直接使用CPU渲染。
  • GPU渲染,是因为解码数据基于GPU实现,视频数据来源于GPU显存,不需要将显存数据做DtoH的拷贝操作,直接使用GPU资源渲染,减少资源拷贝的实践消耗。
  • 两者的区别仅在于视频数据的来源,以及是否需要注册纹理资源。

窗口说明

在这里插入图片描述
举例说明:
上述1920x1080的窗口,要显示16个小区域,纹理顶点映射要做的就是,将1920x1080的视频分别映射到上述的每一个小区域中。
这其实是一个大窗口,针对这一个大窗口,创建一个D3D设备,对于所有的画面,执行统一的刷新(Present)。

代码说明

本节将介绍关键代码的使用和注意。

// 数据结构
// 全局句柄
IDirect3D9* pD3D;
IDirect3DDevice9* pDevice;
// 刷新线程
pthread *pRenderThread;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值