基于DXVA进行硬件解码H264视频流的方法及系统与流程

文档序号:11880962阅读:1681来源:国知局

本发明涉及H264格式的视频流的解码领域,具体涉及一种基于DXVA(DirectX Video Acceleration,视频硬件加速)进行硬件解码H264(数字视频压缩格式)视频流的方法及系统。



背景技术:

随着网络的发展,越来越多的用户喜爱在网络直播平台中观看直播,因此网络直播平台已经广泛适用于社会之中,网络直播平台的直播内容也越来越多样化。

为了保证网络信息的健康传播,杜绝不良直播内容的流出,需要网络直播平台的直播内容进行监控,在监控之前需要对直播内容进行解码。现有的对网络直播平台的直播内容一般通过H264进行编码,H264格式的视频流进行解码的方法一般为软件解码,软件解码方法存在以下缺陷:

传统的H264软件解码时,会占用较多的CPU资源,进而使得解码速度较慢,同时进行解码的视频流较少;而且随着视频显示格式的提高,网络直播平台中的视频流的视频显示格式越来越高清化,采用H264软件对HD视频流(高清视频流,分辨率达到720p以上的视频流)的解码更为缓慢。



技术实现要素:

针对现有技术中存在的缺陷,本发明解决的技术问题为:提供一种基于DXVA进行硬件解码H264视频流的方法及系统。本发明对高清视频流的解码速度较快,工作效率较高。

为达到以上目的,本发明提供的基于DXVA进行硬件解码H264视频流的方法,包括以下步骤:

S1:通过多媒体编程接口创建DXVA功能接入接口;

S2:通过DXVA功能接入接口创建视频解码服务接口;

S3:通过视频解码服务接口获取DXVA硬件解码器中所有的硬件解码级别,分别获取每个解码级别的最优硬件解码参数;

S4:调用视频解码服务接口分别创建解码视频输出接口和硬件解码接口;

S5:将FFMPEG分别与S3中的最优硬件解码参数、S4中的解码视频输出接口和硬件解码接口关联;

S6:通过关联后的FFMPEG对需要解码的视频流进行解码并显示。

本发明提供的实现上述方法的基于DXVA进行硬件解码H264视频流的系统,包括DXVA功能接入接口创建模块、视频解码服务接口创建模块、最优硬件解码参数获取模块、解码视频输出接口创建模块、硬件解码接口创建模块、FFMPEG关联模块和解码显示模块;

DXVA功能接入接口创建模块用于:通过多媒体编程接口创建DXVA功能接入接口;

视频解码服务接口创建模块用于:通过DXVA功能接入接口创建视频解码服务接口;

最优硬件解码参数获取模块用于:通过视频解码服务接口获取DXVA硬件解码器中所有的硬件解码级别,分别获取每个解码级别的最优硬件解码参数;

解码视频输出接口创建模块用于:调用视频解码服务接口创建解码视频输出接口;

硬件解码接口创建模块用于:调用视频解码服务接口创建硬件解码接口;

FFMPEG关联模块用于:将FFMPEG分别与最优硬件解码参数、解码视频输出接口和硬件解码接口关联;

解码显示模块用于:通过FFMPEG对需要解码的视频流进行解码并显示。

与现有技术相比,本发明的优点在于:

与现有技术中的软件解码相比,本发明将DXVA硬件解码器与FFMPEG(Fast Forward Mpeg,多媒体视频处理工具)结合,从而基于DXVA对网络直播平台的视频流进行硬件解码。经测试得出,本发明的方法和系统使用时,利用Windows操作系统的视频加速接口,在Intel的I5-4440这样的计算机下,能够同时进行50多路的1080p高清视频流的硬件解码,解码速度较快,工作效率较高,进而能够实现通过多台计算机的配置,对网络直播平台下的所有视频直播内容进行监控。

附图说明

图1为本发明实施例中的基于DXVA进行硬件解码H264视频流的方法的流程图。

具体实施方式

以下结合附图及实施例对本发明作进一步详细说明。

参见图1所示,本发明实施例中的基于DXVA进行硬件解码H264视频流的方法,包括以下步骤:

S1:通过多媒体编程接口创建DXVA功能接入接口并进行初始化;多媒体编程接口采用Direct3D9(DirectX的一个版本,其包含2D或3D图像的编程接口、音频接口、以及外接设备的输入输出接口);在此基础上,S1的具体流程为:

S101:通过DXVA2CreateDirect3DDeviceManager9(接入接口创建函数)创建IDirect3DDeviceManager9接口(即DXVA功能接入接口)。

S102:通过IDirect3D9接口(Direct3D9的入口接口)的创建函数(CreateDevice)创建解码图像显示接口:IDirect3DDevice9接口,该接口是Direct3D9中最为重要的一个接口,提供创建资源、状态管理、内存管理和显示绘制等功能。

S103:通过IDirect3DDevice9接口对IDirect3DDeviceManager9接口进行初始化。

S2:通过DXVA功能接入接口创建视频解码服务接口,具体流程为:

S201:调用IDirect3DDeviceManager9接口的重置函数(ResetDevice),对IDirect3DDeviceManager9接口进行重置;

S202:调用IDirect3DDeviceManager9接口的设备句柄获取函数(OpenDeviceHandle),获取一个设备句柄deviceHandle;

S203:调用IDirect3DDeviceManager9接口的视频服务获取函数(GetVideoService),通过S202中的设备句柄deviceHandle创建IDirectXVideoDecoderService接口(视频解码服务接口)。

S3:通过视频解码服务接口获取DXVA硬件解码器中所有的硬件解码级别,分别获取每个解码级别的最优硬件解码参数,具体流程为:

S301:调用IDirectXVideoDecoderService接口的硬件解码级别获取函数(GetDecoderDeviceGuids),获取DXVA硬件解码器中所有的硬件解码级别。

S302:调用硬件解码参数获取函数(GetDecoderConfigurations),获取每个解码级别的DXVA2_ConfigPictureDecode(最优硬件解码参数),以供后面的过程使用。

S4:调用视频解码服务接口的表面创建函数(CreateSurface),创建解码视频输出接口(IDirect3DSurface9接口),解码后的视频图像内容存储在该接口中。调用视频解码服务接口的视频解码创建函数(CreateVideoDecoder)创建硬件解码接口(IDirectXVideoDecoder接口)并初始化。

S5:将FFMPEG分别与S3中的最优硬件解码参数、S4中的解码视频输出接口和硬件解码接口关联,具体流程为:

S501:对FFMPEG进行初始化,与DXVA关联形成DXVA连接场景(dxva_context)。

S502:分别将S3中的硬件解码参数DXVA2_ConfigPictureDecode以及S4中的解码视频输出接口IDirect3DSurface9和硬件解码接口IDirectXVideoDecoder,赋值至dxva_context中的对应字段。

S503:将赋值后的dxva_context与FFMPEG的结构体数据(AVCodecContext)的硬件解码连接参数(hwaccel_context)关联,从而建立起DXVA同FFMPEG的连接。

S503中的AVCodecContext是FFMPEG的解码函数的重要解码条件,默认情况下,解码函数是进行软件解码的;所以要将FFMPEG和DXVA协作进行硬件解码,则需要对AVCodecContext的硬件解码连接参数(hwaccel_context)进行相应的设置。hwaccel_context是一个dxva_context场景的指针,其包括2个回调函数get_format和get_buffer2,get_format用于返回硬件解码的像素类型,get_buffer2用于向DXVA提供解码后的图像输出(即与解码视频输出接口对应)。

S6:通过FFMPEG的解码函数(avcodec_decode_video2),对需要解码的视频流(视频流根据网络地址预先获取)进行解码;解码后的图像会通过解码函数进行返回;返回的值是一个包含IDirect3DSurface9的指针。通过S102中的解码图像显示接口显示解码后的图像。

本发明实施例提供的实现上述方法的基于DXVA进行硬件解码H264视频流的系统,包括DXVA功能接入接口创建模块、视频解码服务接口创建模块、最优硬件解码参数获取模块、解码视频输出接口创建模块、硬件解码接口创建模块、FFMPEG关联模块、解码显示模块和视频流获取模块。

DXVA功能接入接口创建模块用于:通过多媒体编程接口(Direct3D9)创建DXVA功能接入接口;具体工作流程为:通过接入接口创建函数创建DXVA功能接入接口;通过Direct3D9的入口接口创建解码图像显示接口;通过解码图像显示接口对DXVA功能接入接口进行初始化。

视频解码服务接口创建模块用于:通过DXVA功能接入接口创建视频解码服务接口;具体工作流程为:对DXVA功能接入接口进行重置;调用DXVA功能接入接口的设备句柄获取函数,获取一个设备句柄;调用DXVA功能接入接口的视频服务获取函数,通过所述设备句柄创建视频解码服务接口。

最优硬件解码参数获取模块用于:通过视频解码服务接口获取DXVA硬件解码器中所有的硬件解码级别,分别获取每个解码级别的最优硬件解码参数;具体工作流程为:调用视频解码服务接口的硬件解码级别获取函数,获取DXVA硬件解码器中所有的硬件解码级别;调用硬件解码参数获取函数,获取每个解码级别的最优硬件解码参数。

解码视频输出接口创建模块用于:调用视频解码服务接口的表面创建函数,创建解码视频输出接口。

硬件解码接口创建模块用于:调用视频解码服务接口的视频解码创建函数,创建硬件解码接口。

FFMPEG关联模块用于:将FFMPEG分别与最优硬件解码参数、解码视频输出接口和硬件解码接口关联;具体工作流程为:对FFMPEG进行初始化,与DXVA关联形成DXVA连接场景;分别将最优硬件解码参数、解码视频输出接口和硬件解码接口,赋值至DXVA连接场景中的对应字段;将赋值后的DXVA连接场景与FFMPEG的结构体数据的硬件解码连接参数关联。

视频流获取模块用于:根据网络地址获取需要解码的视频流。

解码显示模块用于:通过FFMPEG对需要解码的视频流进行解码并显示,具体工作流程为:通过FFMPEG的解码函数对需要解码的视频流进行解码;通过所述解码图像显示接口显示解码后的图像。

本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1