windows平台视频渲染技术小结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/CrystalShaw/article/details/91388983

一、概述

在Windows平台下的视频播放技术主要有以下三种:GDI,Direct3D和OpenGL;也经常看到DirectDraw这个技术,根据维基介绍,DirectDraw是微软弃用的一个API,曾经是DirectX API的一部分。

      

二、GDI

图形设备接口(英语:Graphics Device Interface,缩写GDI)是微软视窗系统提供的应用程序接口,也是其用来表征图形对象、将图形对象传送给诸如显示器、打印机之类输出设备的核心组件。GDI是视窗操作系统(Microsoft Windows)的三大核心部件(也称“子系统”)之一。

GDI用来完成一些和绘制有关的工作,像直线或曲线的绘制,文字渲染,调色板控制。它不能用来直接绘制一些界面元素,像窗口、菜单等等,这些工作由用户子系统来完成,位于user32.dll中,它是创建在GDI之上的一个软件层。其他系统也有类似GDI的东西,比如Macintosh的Quartz(传统的QuickDraw),和GTK的GDK/Xlib。

GDI最大的好处是它有可以直接访问硬件设备的能力。通过GDI可以非常容易的在不同类型的设备上绘制图形,像显示屏和打印机或类似的显示设备。这些能力是微软Windows系统“所见即所得”程序的核心。

简单的不需要快速图形渲染的游戏可能会用到GDI。但是GDI对一些高级的动画制作无能为力,它缺少显卡中帧的概念,还缺少3D图形硬件光栅化的支持等等。现代的游戏通常使用DirectX和OpenGL而不是GDI,因为这些技术能更好的让程序员利用硬件的特性来加速图形图像的显示。

GDI主要用于软件开发调试时使用,性能和效果不及Direct3D和OpenGL。

webrtc的main_wnd.cc文件void MainWnd::OnPaint()函数有GDI示例代码。

三、Direct3D

Direct3D(简称:D3D)是微软公司在Microsoft Windows操作系统上所开发的一套3D绘图编程接口,是DirectX的一部分,当前广为各家显卡所支持。与OpenGL同为计算机绘图软件和计算机游戏最常使用的两套绘图编程接口之一。

1995年2月,微软收购了英国的Rendermorphics公司,将RealityLab2.0技术发展成Direct3D标准,并集成到MicrosoftWindows中,Direct3D在DirectX3.0开始出现。后来在DirectX8.0发表时与DirectDraw编程接口合并并改名为DirectXGraphics。

四、OpenGL

OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。

OpenGL的高效实现(利用图形加速硬件)存在于Windows,部分UNIX平台和Mac OS。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。开放源代码库Mesa是一个纯基于软件的图形API,它的代码兼容于OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的API。 

OpenGL规范由1992年成立的OpenGL架构评审委员会(ARB)维护。ARB由一些对创建一个统一的、普遍可用的API特别感兴趣的公司组成。根据OpenGL官方网站,2002年6月的ARB投票成员包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems,Microsoft曾是创立成员之一,但已于2003年3月退出。 

五、Direct3D VS OpenGL

1、可以看出Direct3D和OpenGL都是协议接口,各大显卡厂商,需要根据这个接口协议,实现具体细节。操作GPU等硬件。

比方说英伟达显卡商,就在官网上说明提供opengl和directx两种API接口。

https://developer.nvidia.com/opengl
https://developer.nvidia.com/directx

Intel集成显卡也会在官网上说明支持的opengl和directx版本号。

2、Direct3D仅支持Window操作系统,opengl可以支持多个操作系统,比方说Linux、Mac OS等。

3、至于在window操作系统上,谁更好一些,这里看到一篇有趣的介绍Direct3D和OpenGL相爱相杀的博客。

为什么选择OpenGL-and-not-DirectX》http://blog.wolfire.com/2010/01/Why-you-should-use-OpenGL-and-not-DirectX

六、SDL

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。当前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

说白了,就是opengl也好,direct 3D也好,你们把底层音视频交互工作搞的太复杂了,SDL在Direct3D和OpenGL协议接口上,再定义一套协议接口,无论什么系统平台,只要用SDL这一套接口,就能实现音视频渲染+游戏功能。

SDL应用框架如下图:不过这张图有个地方不准确,SDL在window下也可以调用opengl,参数要特殊配置一下

                             

ffmpeg的ffplay.c文件下的main函数,有SDL示例代码。

七、参考

SDL系列讲解(一)简介

https://blog.csdn.net/leixiaohua1020/article/details/40246783

https://en.wikipedia.org/wiki/DirectDraw

https://zh.wikipedia.org/wiki/GDI%2B

https://zh.wikipedia.org/wiki/Direct3D

https://zh.wikipedia.org/wiki/OpenGL

https://zh.wikipedia.org/wiki/SDL

 

 

 

猜你喜欢

转载自blog.csdn.net/CrystalShaw/article/details/91388983