一种基于Intel、AMD和Nvidia三平台的H264硬件编码系统的制作方法

xiaoxiao2021-2-23  113

一种基于Intel、AMD和Nvidia三平台的H264硬件编码系统的制作方法
【技术领域】
[0001 ] 本发明属于图形图像技术领域,更具体地,涉及一种基于Intel、AMD和Nvidia三平台的H264硬件编码系统。
【背景技术】
[0002]Η.264是国际标准化组织(IS0)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。H.264是ITU-T以H.26x系列为名称命名的视频编解码技术标准之一。H.264是ITU-T的VCEG(视频编码专家组)和IS0/IEC的MPEG(活动图像编码专家组)的联合视频组(JVT: joint video team)开发的一个数字视频编码标准。该标准最早来自于ITU-T的称之为H.26L的项目的开发。H.26L这个名称虽然不太常见,但是一直被使用着。
H.264是ITU-T以H.26x系列为名称命名的标准之一,AVC是IS0/IEC MPEG—方的称呼。
[0003]目前大部分的H264编码使用的是libx264的软件编码,这样在计算机的CPU性能比较差的情况下,会严重消耗中央处理器(Central Processing Unit,CPU)资源,导致计算机系统系统性能下降;即使有些计算机使用了硬件编码,但是仅仅是支持Intel平台的集成显卡或者Nvidia平台,并不能对Intel、AMD、Nvidia这几大平台进行统一的支持。

【发明内容】

[0004]针对现有技术的以上缺陷或改进需求,本发明提供了一种基于Intel、AMD和Nvidia三平台的H264硬件编码系统,其目的在于能够针对不同硬件平台的计算机平台无感知的提供相应的硬件编码方案,由此解决现有技术下部分计算机系统无法进行H264硬件编码的技术问题。
[0005]为实现上述目的,本发明提供了一种基于Intel、AMD和Nvidia三平台的H264硬件编码系统,包括通用编码模块、Intel硬件编码器、AMD硬件编码器以及Nvidia硬件编码器,其中:
[0006]所述通用编码模块,用于创建通用编码接口,判断计算机系统所支持的硬件编码器类型,根据计算机系统所支持的硬件编码器类型选择调用Intel硬件编码器、AMD硬件编码器或Nvidia硬件编码器中的任一种进行H264视频编码;
[0007]所述Intel硬件编码器,用于对支持Intel硬件编码的计算机系统进行H264视频编码;
[0008]所述AMD硬件编码器,用于对支持AMD硬件编码的计算机系统进行H264视频编码;
[0009]所述Nvidia硬件编码器,用于对支持Nvidia硬件编码的计算机系统进行H264视频编码。
[0010]本发明的一个实施例中,所述通用编码模块包括通用编码器接口子模块和编码器执行子模块,其中:
[0011]所述通用编码器接口子模块用于实现对编码器接口的定义,所述编码器接口包括文件打开接口、编码器类型获取接口、编码器创建接口、写字节流接口、文件关闭接口,其中:
[0012]所述文件打开接口用于打开欲写入编码结果的文件,或者建立实时消息传输协议(Time Messaging Protocol,RTMP)连接或者实时流传输协议(Real Time StreamingProtocol,RTSP)连接,所述文件打开接口的输入参数包括文件路径和读写文件参数;
[0013]所述编码器类型获取接口用于获取计算机系统所支持的编码器类型,以使所述编码器创建接口根据所述计算机系统所支持的编码器类型创建相应类型的硬件编码器;
[0014]所述编码器创建接口用于根据所述编码器类型获取接口返回的编码器类型创建相应类型的编码器,其输入参数为编码器类型,输出为相应类型编码器,所述编码器类型为Intel硬件编码器,或者AMD硬件编码器,或者Nvidia硬件编码器;
[0015]所述写字节流接口用于将编码后的字节流写入上述欲写入编码结果的文件中,或者通过RTMP协议连接发送到RTMP服务器,或者通过RTSP协议连接发送到RTSP服务器;
[0016]所述文件关闭接口用于在编码结束后关闭正在写入的文件,或者关闭已建立的RTMP协议连接或者RTSP协议连接;
[0017]所述编码器执行子模块用于根据上述通用编码器接口子模块对编码器接口的定义创建编码器接口,利用创建的编码器接口判断计算机系统所支持的硬件编码器,选择调用Intel硬件编码器、AMD硬件编码器或Nvidia硬件编码器中的任一种对视频进行H264编码。
[0018]本发明的一个实施例中,所述编码器接口还包括写文件头接口,所述写文件头接口用于写文件头,所述文件头中包括了视频编码器的H264序列集参数和PPSH264图像集参数,所述H264序列集参数和PPSH264图像集参数用于在解码器解码时使用。
[0019]本发明的一个实施例中,所述编码器接口还包括元数据信息设置接口,所述元数据信息设置接口用于设置文件中的元数据信息。
[0020]本发明的一个实施例中,所述编码器创建接口包括编码器打开接口、编码器关闭接口以及图像编码接口,其中:
[0021 ]所述编码器打开接口用于打开编码器,输入参数包括待编码视频的宽、待编码视频的高以及编码的码率;
[0022]所述图像编码接口用于在上述编码器打开后,利用编码器编码图像,输入参数为要编码的图像和编码时间戳;
[0023]所述编码器关闭接口用于在编码结束后,关闭上述打开的编码器。
[0024]本发明的一个实施例中,所述编码器类型获取接口获取计算机系统所支持的编码器类型具体为:
[0025]若返回CT_QSV264,表示计算机系统支持Intel硬件编码;
[0026]若返回CT_AMD264,表示计算机系统支持AMD硬件编码;
[0027]若返回CT_NV264,表示计算机系统支持Nvidia硬件编码;
[0028]若返回CT_X264,表示计算机系统不支持任何硬件编码。
[0029]本发明的一个实施例中,所述图像编码接口具体包括字节流缓冲区建立子模块、字节流缓冲区大小设置子模块、视频帧显示时间戳设置子模块、视屏帧解码时间戳设置子模块、关键帧判断子模块以及图像编码接口释放子模块,其中:
[0030]所述字节流缓冲区建立子模块,用于建立用于解码器解码的H264字节流缓冲区,
[0031]所述字节流缓冲区大小设置子模块,用于设置用于解码器解码的H264字节流缓冲区大小;
[0032]所述视频帧显示时间戳设置子模块,用于设置用于解码器解码的视频帧显示时间戳;
[0033]所述视屏帧解码时间戳设置子模块,用于设置视屏帧解码时间戳;
[0034]所述关键帧判断子模块,用于判断当前帧是否为关键帧;
[0035]所述图像编码接口释放子模块,用于释放当前图像编码接口。
[0036]本发明的一个实施例中,所述Intel硬件编码器包括Intel硬件编码器初始化子模块、Intel硬件编码器编码子模块以及Intel硬件编码器关闭子模块,其中:
[0037]所述Intel硬件编码器初始化子模块用于初始化Intel硬件编码器,具体包括SDK初始化子模块、编码初始化子模块、显存分配子模块和Intel参数获取子模块,其中:
[0038]所述SDK初始化子模块用于调用MFXInit初始化Intel官方的MediaSDK;
[0039]所述编码初始化子模块用于调用MFXVideoENCODE_Init来初始化编码器;
[0040]所述显存分配子模块,用于分配用来接收待编码的图像的显存表面,具体包括;[0041 ] 调用MFXVideoENCODE_Query1Surf来获取需要创建的显存表面数量;
[0042]创建IDirect3DDeviceManager9接口,用来提供视频加速功能;
[0043]调用IDirect3DDeviceManager9接口的OpenDeviceHandle方法,获取设备句柄;
[0044]通过上步的设备句柄,调用IDirect3DDeviceManager9接口法,创建 IID_IDirectXVideoDecoder Service (接口 IID)的 ID irectXVideoDecoder Service接口;
[0045]调用上步创建的IDirectXVideoDecoderService 接口 的 Create Surf ace 方法来完成视频加速表面的创建;
[0046]所述Intel参数获取子模块用于在初始化编码器成功后,获取H264序列集参数和H264图像集参数;
[0047]所述Intel硬件编码器编码子模块用于对视频进行H264编码,具体包括图像编码子模块和同步子模块,其中:
[0048]所述图像编码子模块,用于调用MFXVideoENCODE_EncodeFrameAsync对NV12格式的图像进行编码;
[0049]所述同步子模块用于调用MFXVideo⑶RE_Sync0perat1n来进行CPU和GPU之间的同步,获取硬件编码返回的数据流;
[0050]所述Intel硬件编码器关闭子模块用于在停止编码时调用MFXVideoENC0DE_Close来关闭编码器,进行资源的释放,并调用MFXClose来关闭Intel MediaSDK。
[0051]本发明的一个实施例中,所述AMD硬件编码器包括AMD硬件编码器初始化子模块、AMD硬件编码器编码子模块以及AMD硬件编码器关闭子模块,其中:
[0052]所述AMD硬件编码器初始化子模块用于初始化AMD硬件编码器,具体包括DLL加载子模块、接口创建子模块、参数设置子模块以及AMD参数获取子模块,其中:
[0053]所述DLL加载子模块用于加载amf-core_windesktop32.dl 1 和amf-componen t-vce-windesktop32.dll ;
[0054]所述接口创建子模块用于调用AMFCreateContext创建AMFContext接口,以及调用AMFCreateComponent创建AMFComponent接口,
[°°55] 所述参数设置子模块用于调用AMFComponent接口的SetProperty设置相关的编码参数,所述编码参数包括分辨率,码率和帧率;并调用AMFComponent接口的Ini t方法完成编码器的初始化;
[0056]所述AMD参数获取子模块用于调用AMFComponent接口的GetProperty方法,获取AMF_VIDEO_ENCODER_EXTRADATA枚举类型的H264序列集参数和PPSH264图像集参数;
[0057]所述AMD硬件编码器编码子模块用于对视频进行H264编码,具体包括视频表面分配子模块、视频表面提交子模块以及AMD字节流获取子模块,其中:
[0058]所述视频表面分配子模块用于调用AMFContext接口的AllocSurface方法分配用来接收待编码的图像的视频表面;
[°°59] 所述视频表面提交子模块用于调用AMFComponent接口的Submit Input方法,将上步中生成的视频表面提交到编码器中;
[0000]所述AMD字节流获取子模块用于调用AMFComponent接口的QueryOutput方法,获取编码器编码后的字节流;
[0061 ] 所述AMD硬件编码器关闭子模块,用于在停止编码时调用AMFComponent接口的Terminate方法关闭编码器,进行资源的释放。
[0062]本发明的一个实施例中,所述Nvidia硬件编码器包括Nvidia硬件编码器初始化子模块、Nvidia硬件编码器编码子模块以及Nvidia硬件编码器关闭子模块,其中:
[0063]所述Nvidia硬件编码器初始化子模块用于初始化Nvidia硬件编码器,具体包括编码环境初始化子模块、Nvidia参数设置子模块、Nvidia参数获取子模块以及显存表面创建子模块,其中:
[0064]所述编码环境初始化子模块用于加载nvcuda.dll和nvEncodeAP1.dll,初始化必要的环境;并调用nvEncodeAPI 模块的NvEncodeAPI Cr eat elnstance方法创建 NV_ENC0DE_API_FUNCT10N_LIST结构;以及调用cuCtxCreate_v2接口创建上下文环境;
[0065]所述Nvidia参数设置子模块用于调用nvEncOpenEncodeSess1nEx方法创建编码器会话,并调用nvEncGetEncodePresetConfig对编码器参数进行设置,以及调用nvEncInitializeEncoder完成编码器的初始化;
[0066]所述Nvidia参数获取子模块用于调用nvEncGetSequenceParams获取类型为NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER 的 H264序列集参数和 PPSH264 图像集参数;
[0067]所述显存表面创建子模块用于调用nvEncCreatelnputBuffer创建用来接收待编码的图像数据的显存表面,并调用nvEncCreateBitstreamBuffer创建编码输出存储数据;
[0068]所述Nvidia硬件编码器编码子模块用于对视频进行H264编码,具体包括填充编码图像子模块、编码子模块以及Nvidia字节流获取子模块,其中:
[0069]所述填充编码图像子模块用于调用nvEncLocklnputBuffer锁定上述显存表面创建子模块创建的显存表面,并填充编码图像;并调用nvEncUnlocklnputBuffer对该显存表面进行解锁;
[0070]所述编码子模块用于调用nvEncEncodePicture进行编码;
[0071 ] 所述Nvidia字节流获取子模块用于调用nvEncLockBitstream获取编码后返回的字节流,做相应的处理后,调用nvEncUnlockBitstream释放字节流;
[0072]所述Nv i d i a硬件编码器关闭子模块,用于在停止编码时调用nvEncDestroyEncoder关闭编码器,并调用cuCtxDestroy_v2释放当前环境上下文。
[0073]本发明提供的基于Intel、AMD和Nvidia三平台的H264硬件编码系统,能够判断计算机系统所支持的硬件编码器类型,并根据所述硬件编码器类型选择调用Intel硬件编码器、AMD硬件编码器或Nvidia硬件编码器中的任一种对需要在该计算机系统上播放的视频进行H264编码,从而能够对各种不同的计算机系统平台无感知的提供H264硬件编码。。
【附图说明】
[0074]图1是本发明实施例中基于Intel、AMD和Nvidia三平台的H264硬件编码系统的结构示意图;
[0075]图2是本发明实施例中通用编码器接口子模块的结构示意图;
[0076]图3是本发明实施例中Intel硬件编码器的结构示意图;
[0077]图4是本发明实施例中AMD硬件编码器的结构示意图;
[0078]图5是本发明实施例中Nvidia硬件编码器的结构示意图;
[0079]图6是本发明实施例中硬件编码系统的UML类图示意图。
【具体实施方式】
[0080]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
[0081 ] 如图1所示,本发明提供了一种基于Intel、AMD和Nvidia三平台的H264硬件编码系统,包括通用编码模块、Intel硬件编码器、AMD硬件编码器以及Nvidia硬件编码器,其中:
[0082]所述通用编码模块,用于创建通用编码接口,判断计算机系统所支持的硬件编码器类型,根据计算机系统所支持的硬件编码器类型选择调用Intel硬件编码器、AMD硬件编码器或Nvidia硬件编码器中的任一种进行H264视频编码;
[0083]具体地,如图2所示,所述通用编码模块包括通用编码器接口子模块和编码器执行子模块,其中:
[0084]所述通用编码器接口子模块用于实现对编码器接口的定义,所述编码器接口包括文件打开接口、编码器类型获取接口、编码器创建接口、写字节流接口、文件关闭接口,其中:
[0085]所述文件打开接口用于打开欲写入编码结果的文件,或者建立RTMP协议连接或者RTSP协议连接,所述文件打开接口的输入参数包括文件路径和读写文件参数;所述文件路径为本地磁盘的文件路径,或者是以RTMP: //XXX开头的RTMP协议URL,或者是以RTSP: //XXX开头的RTSP协议URL,所述读写文件参数为写入;
[0086]所述编码器类型获取接口用于获取计算机系统所支持的编码器类型,以使所述编码器创建接口根据所述计算机系统所支持的编码器类型创建相应类型的硬件编码器;
[0087]所述编码器创建接口用于根据所述编码器类型获取接口返回的编码器类型创建相应类型的编码器,其输入参数为编码器类型,输出为相应类型编码器,所述编码器类型为Intel硬件编码器,或者AMD硬件编码器,或者Nvidia硬件编码器;其中所述编码器创建接口包括编码器打开接口、编码器关闭接口以及图像编码接口,其中:
[0088]所述编码器打开接口用于打开编码器,输入参数包括待编码视频的宽、待编码视频的高以及编码的码率;
[0089]所述图像编码接口用于在上述编码器打开后,利用编码器编码图像,输入参数为要编码的图像和编码时间戳;
[0090]其中所述图像编码接口具体包括字节流缓冲区建立子模块、字节流缓冲区大小设置子模块、视频帧显示时间戳设置子模块、视屏帧解码时间戳设置子模块、关键帧判断子模块以及图像编码接口释放子模块,其中:
[0091]所述字节流缓冲区建立子模块,用于建立用于解码器解码的H264字节流缓冲区,
[0092]所述字节流缓冲区大小设置子模块,用于设置用于解码器解码的H264字节流缓冲区大小;
[0093]所述视频帧显示时间戳设置子模块,用于设置用于解码器解码的视频帧显示时间戳;
[0094]所述视屏帧解码时间戳设置子模块,用于设置视屏帧解码时间戳;
[0095]所述关键帧判断子模块,用于判断当前帧是否为关键帧;
[0096]所述图像编码接口释放子模块,用于释放当前图像编码接口。
[0097]所述编码器关闭接口用于在编码结束后,关闭上述打开的编码器。
[0098]所述写字节流接口用于将编码后的字节流写入上述欲写入编码结果的文件中,或者通过RTMP协议连接发送到RTMP服务器,或者通过RTSP协议连接发送到RTSP服务器;
[0099]所述文件关闭接口用于在编码结束后关闭正在写入的文件,或者关闭已建立的RTMP协议连接或者RTSP协议连接;
[0100]具体地,所述编码器类型获取接口获取计算机系统所支持的编码器类型具体为:
[0101]若返回CT_QSV264,表示计算机系统支持Intel硬件编码;
[0102]若返回CT_AMD264,表示计算机系统支持AMD硬件编码;
[0103]若返回CT_NV264,表示计算机系统支持Nvidia硬件编码;
[0104]若返回CT_X264,表示计算机系统不支持任何硬件编码。
[0105]进一步地,所述编码器接口还包括写文件头接口,所述写文件头接口用于写文件头,所述文件头中包括了视频编码器的H264序列集参数和PPSH264图像集参数,所述H264序列集参数和PPSH264图像集参数用于在解码器解码时 使用。
[0106]进一步地,所述编码器接口还包括元数据信息设置接口,所述元数据信息设置接口用于设置文件中的元数据信息。
[0107]所述编码器执行子模块用于根据上述通用编码器接口子模块对编码器接口的定义创建编码器接口,利用创建的编码器接口判断计算机系统所支持的硬件编码器,选择调用Intel硬件编码器、AMD硬件编码器或Nvidia硬件编码器中的任一种对视频进行H264编码,其中:
[0108]所述Intel硬件编码器,用于对支持Intel硬件编码的计算机系统进行H264视频编码;
[0109]具体地,如图3所示,所述Intel硬件编码器包括Intel硬件编码器初始化子模块、Intel硬件编码器编码子模块以及Intel硬件编码器关闭子模块,其中:
[0110]所述Intel硬件编码器初始化子模块用于初始化Intel硬件编码器,具体包括SDK初始化子模块、编码初始化子模块、显存分配子模块和Intel参数获取子模块,其中:
[0111]所述SDK初始化子模块用于调用MFXInit初始化Intel官方的MediaSDK;
[0112]所述编码初始化子模块用于调用MFXVideoENCODE_Init来初始化编码器;
[0113]所述显存分配子模块,用于分配用来接收待编码的图像的显存表面,具体包括;
[0114]调用MFXVideoENCODE_Query 1Surf来获取需要创建的显存表面数量;
[0115]创建IDirect3DDeviceManager9接口,用来提供视频加速功能;
[0116]调用IDirect3DDeviceManager9接口的OpenDeviceHandle方法,获取设备句柄;
[0117]通过上步的设备句柄,调用IDirect3DDeviceManager9接口法,创建IID_IDirectXVideoDecoderService(接口 IID)的IDirectXVideoDecoderService接口;
[0118]调用上步创建的IDirectXVideoDecoderService 接口 的 Create Surf ace 方法来完成视频加速表面的创建;
[0119]所述Intel参数获取子模块用于在初始化编码器成功后,获取H264序列集参数和H264图像集参数;
[0120]所述Intel硬件编码器编码子模块用于对视频进行H264编码,具体包括图像编码子模块和同步子模块,其中:
[0121]所述图像编码子模块,用于调用MFXVideoENCODE_EncodeFrameAsync对NV12格式的图像进行编码;
[0122]所述同步子模块用于调用MFXVideo⑶RE_Sync0perat1n来进行CPU和GPU之间的同步,获取硬件编码返回的数据流;
[0123]所述Intel硬件编码器关闭子模块用于在停止编码时调用MFXVideoENC0DE_Close来关闭编码器,进行资源的释放,并调用MFXClose来关闭Intel MediaSDK。
[0124]所述AMD硬件编码器,用于对支持AMD硬件编码的计算机系统进行H264视频编码;
[0125]具体地,如图4所示,所述AMD硬件编码器包括AMD硬件编码器初始化子模块、AMD硬件编码器编码子模块以及AMD硬件编码器关闭子模块,其中:
[0126]所述AMD硬件编码器初始化子模块用于初始化AMD硬件编码器,具体包括DLL加载子模块、接口创建子模块、参数设置子模块以及AMD参数获取子模块,其中:
[0127]所述DLL加载子模块用于加载amf-core_windesktop32.dl 1 和amf-component-vce-windesktop32.dll ;
[0128]所述接口创建子模块用于调用AMFCreateContext创建AMFContext接口,以及调用AMFCreateComponent创建AMFComponent接口,
[0129]所述参数设置子模块用于调用AMFComponent接口的SetProperty设置相关的编码参数,所述编码参数包括分辨率,码率和帧率;并调用AMFComponent接口的Ini t方法完成编码器的初始化;
[0130]所述AMD参数获取子模块用于调用AMFComponent接口的GetProperty方法,获取AMF_VIDE0_ENC0DER_EXTRADATA枚举类型的H264序列集参数和PPSH264图像集参数;
[0131]所述AMD硬件编码器编码子模块用于对视频进行H264编码,具体包括视频表面分配子模块、视频表面提交子模块以及AMD字节流获取子模块,其中:
[0132]所述视频表面分配子模块用于调用AMFContext接口的AllocSurf ace方法分配用来接收待编码的图像的视频表面;
[0133]所述视频表面提交子模块用于调用AMFComponent接口的Submit Input方法,将上步中生成的视频表面提交到编码器中;
[0? 34] 所述AMD字节流获取子模块用于调用AMFComponent接口的QueryOutput方法,获取编码器编码后的字节流;
[0135]所述AMD硬件编码器关闭子模块,用于在停止编码时调用AMFComponent接口的Terminate方法关闭编码器,进行资源的释放。
[0136]所述Nvidia硬件编码器,用于对支持Nvidia硬件编码的计算机系统进行H264视频编码。
[0137]具体地,如图5所示,所述Nvidia硬件编码器包括Nvidia硬件编码器初始化子模块、Nvidia硬件编码器编码子模块以及Nvidia硬件编码器关闭子模块,其中:
[0138]所述Nvidia硬件编码器初始化子模块用于初始化Nvidia硬件编码器,具体包括编码环境初始化子模块、Nvidia参数设置子模块、Nvidia参数获取子模块以及显存表面创建子模块,其中:
[0139]所述编码环境初始化子模块用于加载nvcuda.dll和nvEncodeAP1.dll,初始化必要的环境;并调用nvEncodeAPI 模块的NvEncodeAPI Cr eat elnstance方法创建 NV_ENC0DE_API_FUNCT1N_LIST结构;以及调用cuCtxCreate_v2接口创建上下文环境;
[0140]所述Nvidia参数设置子模块用于调用nvEncOpenEncodeSess1nEx方法创建编码器会话,并调用nvEncGetEncodePresetConfig对编码器参数进行设置,以及调用nvEncInitializeEncoder完成编码器的初始化;
[0141 ] 所述Nvidia参数获取子模块用于调用nvEncGetSequenceParams获取类型为NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER 的 H264序列集参数和 PPSH264 图像集参数;
[ΟΙ42] 所述显存表面创建子模块用于调用nvEncCreatelnputBuffer创建用来接收待编码的图像数据的显存表面,并调用nvEncCreateBitstreamBuffer创建编码输出存储数据;
[0143]所述Nvidia硬件编码器编码子模块用于对视频进行H264编码,具体包括填充编码图像子模块、编码子模块以及Nvidia字节流获取子模块,其中:
[0144]所述填充编码图像子模块用于调用nvEncLocklnputBuffer锁定上述显存表面创建子模块创建的显存表面,并填充编码图像;并调用nvEncUnlocklnputBuffer对该显存表面进行解锁;
[0145]所述编码子模块用于调用nvEncEncodePicture进行编码;
[ΟΙ46] 所述Nvidia字节流获取子模块用于调用nvEncLockBitstream获取编码后返回的字节流,做相应的处理后,调用nvEncUnlockBitstream释放字节流;
[0147]所述NV i d i a硬件编码器关闭子模块,用于在停止编码时调用nvEncDestroyEncoder关闭编码器,并调用cuCtxDestroy_v2释放当前环境上下文。
[0148]具体地,在本发明实施例中可以通过提供统一的接口来屏蔽硬件差异性,通过如图6所示的UML(统一建模语言)类图描述本技术方案对三大平台的硬件编码封装以及对libx264软件编码器的封装。
[0149]对应有AmdEncoder、NvidiaEncoder、QsvEncoder 以及 X264Encoder,他们分别代表AMD硬件编码器,Nvidia硬件编码器、Intel硬件编码器,以及x264软件编码器,他们都继承自 BaseEncoder接口,BaseEncoder接口 继承自 IMediaEncoder接口,而IMediaEncoder就是最终统一化抽象的接口,该接口所提供的方法在图中已经写明包括(Open,打开编码器、Close,关闭编码器、Encode,编码等)具体的接口定义如下:
[0150]l、BfediaFile 接口
[0151](l.l)bool Open(char*filepath,boo1 write)
[0152]打开文件,filepath参数代表文件路径,即可以是本地磁盘的文件路径,也可以是已RTMP: //XXX开头的RTMP协议URL,也可以是RTSP: //XXX开头的RTSP协议URL,write参数代表是读文件还是与文件,在编码中该为应为true。
[0153](1.2)IMediaEncoder*CreateEncoder(CodecType type)
[ΟΙ54] 创建编码器,参数type为编码器的类型,返回值为IMediaEncoder接口
[0155](1.3)bool WriteFileHeade r()
[0156]写文件头,多媒体文件中文件头中包括了视频编码器的SPS、PPS信息,用于解码器解码
[0157](1.4)bool WritePacket(IRawPacket*pkt)
[0158]用于写编码后的字节流,该方法既可以将字节流保存到本地磁盘文件中,也可以同过RTMP协议发送到RTMP服务器,参数pkt中包含了将要写的字节流以及相关信息
[0159](1.5)int64_t Sizeffritten()
[0160]用于返回已写的字节数
[0161](1.6)void SetMetaDataInformat1n(const std::string&key,const std::string&value)
[0162 ]用于设置文件中的Me taData (元数据)信息
[0163](1.7)bool CloseO
[0164]关闭文件,会关闭正在写的文件或正在发送的RTMP协议,并关闭H264编码器,释放资源
[0165]2、CodecType 枚举类型
[0166](2.1)CT_VIDE0BEST
[0167]代表自动选择支持的硬件编码器,可以用来判断当前系统支持哪种类型的硬件编码器
[0168](2.2)CT_X264
[0169]代表libx264软件编码器
[0170](2.3)CT_QSV264
[0171]代表Intel硬件编码器
[0172](2.4)CT_AMD264
[0173]代码AMD平台硬件编码器
[0174]3IMediaEncoder 接口
[0175]该接口通过 IMediaFile 的 CreateEncoder 接口获取
[0176](3.1)bool 0pen(int width,int height,int bitrate)
[0177]打开编码器,参数width为待编码视频的宽,height为待编码视频的高,bitrate为编码的码率
[0178](3.2)bool CloseO
[0179]关闭编码器
[0180](3.3)IRawPacket*Encode(uint8_t*pixels[3],int64_t stamp)
[°181 ] 编码图像,参数pixies为要编码的图像,stamp为编码时间戳,返回IRawPacket接P
[0182](3.4)CodecType GetCodecType()
[0183]获取编码器的类型
[0184]4、IRawPacket接口
[0185]该接口为IMediaEncoder进行编码的时候返回的H264字节流接口
[0186](4.1)uint8_t*Buffer()
[0187]H264字节流缓冲区,用于解码器解码
[0188](4.2)int Size()
[0189]H264字节流缓冲区大小,用于解码器解码
[0190](4.3)int64_t Pts()
[0191 ] 视频帧显示时间戳,用于解码器解码
[0192](4.4)int64_t Dts()
[0193]视屏帧解码时间戳
[0194](4.5)bool Keyframe()
[0195]判断是否为关键帧
[0196](4.6)Release()
[0197]释放该接口
[0198]5模块导出函数
[0199]IMediaFile*CreateMediaFile(ContainerFormat cf)
[°20°] 该函数为该技术方案的ylmediaengine模块中的DLL导出函数,用来创建一个HfediaFile接口,通过该创建的HfediaFile接口,便可以创建硬件H264编码器。
[0201]下面结合一个具体实例说明如何在实际计算机系统中利用上述系统进行H264硬件编码,例如通过该頂ediaFile接口,在一种游戏直播平台(例如斗鱼TV直播伴侣)中使用该接口进行硬件编码并将编码后的画面推送到斗鱼TV服务器,进行直播,具体地,实现步骤如下:
[0202](6.1)调用CreateMediaFile函数创建IMediaFile接口 ;
[0203](6.2)调用IMediaFile接口的CreateEncoder方法创建IMediaEncoder接口,传入的参数为 CT_VIDE0BEST ;
[0204](6.3)调用上步中的IMediaEncoder接口的GetCodecType方法,获取当前编码器的类型。当返回CT_QSV264时,系统支持Intel硬件编码,返回CT_AMD264时系统支持AMD硬件编码,返回CT_NV264时系统支持Nvidia硬件编码,返回CT_X264时系统不支持任何硬件编码;例如:
[0205]当系统显卡类型为:Nvidia GeForce 740类型时,支持Nvidia硬件编码;当系统显卡类型为:Intel(R)HD Graphics时,支持Intel硬件编码;当系统显卡类型为:AMD RadeonHD 7700Series时,支持AMD硬件编码
[0206](6.4)初始化编码器
[0207]选择分辨率为1920*1080,帧数选择25FPS,码率选择1600,编码器选择AMD硬件编码。
[0208]通过步骤(6.2)中创建的IMediaDecoder接口,调用该接口的Open方法,并将这些参数传入Open方法中,进行编码器的初始化;
[0209](6.5)连接1^通3服务器
[0210]初始化编码器成功后,调用BfediaFile的Open方法,连接RTMP服务器;
[0211](6.6)发送H264头信息到RTMP服务器
[0212]连接RTMP服务器成功后,调用BfediaFile的WriteFileHeader方法,将视频的头信息发送的RTMP服务器,供播放器解码;
[0213](6.7)进行编码
[0214]以上过程都成功后,便可以调用IMediaEncoder的Encode方法,将直播伴侣预览窗口中的画面进行编码,并返回IRawPacket接口 ;
[0215](6.8)推送视频流
[0216]通过上步中返回的IRawPacket接口,调用IMediaFile的WritePacket方法,将编码后的视频流推送的RTMP服务器。
[0217]通过以上步骤,便实现了本发明实施例中利用硬件编码,将图像推送到RTMP服务器进行直播的过程。
[0218]本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【主权项】
1.一种基于Intel、AMD和NVidia三平台的H264硬件编码系统,其特征在于,包括通用编码模块、Intel硬件编码器、AMD硬件编码器以及Nvidia硬件编码器,其中: 所述通用编码模块,用于创建通用编码接口,判断计算机系统所支持的硬件编码器类型,根据计算机系统所支持的硬件编码器类型选择调用Intel硬件编码器、AMD硬件编码器或Nvidia硬件编码器中的任一种进行H264视频编码; 所述Intel硬件编码器,用于对支持Intel硬件编码的计算机系统进行H264视频编码; 所述AMD硬件编码器,用于对支持AMD硬件编码的计算机系统进行H264视频编码; 所述Nvidia硬件编码器,用于对支持Nvidia硬件编码的计算机系统进行H264视频编码。2.如权利要求1所述的基于Intel、AMD和Nvidia三平台的H264硬件编码系统,其特征在于,所述通用编码模块包括通用编码器接口子模块和编码器执行子模块,其中: 所述通用编码器接口子模块用于实现对编码器接口的定义,所述编码器接口包括文件打开接口、编码器类型获取接口、编码器创建接口、写字节流接口、文件关闭接口,其中: 所述文件打开接口用于打开欲写入编码结果的文件,或者建立RTMP协议连接或者RTSP协议连接,所述文件打开接口的输入参数包括文件路径和读写文件参数; 所述编码器类型获取接口用于获取计算机系统所支持的编码器类型,以使所述编码器创建接口根据所述计算机系统所支持的编码器类型创建相应类型的硬件编码器; 所述编码器创建接口用于根据所述编码器类型获取接口返回的编码器类型创建相应类型的编码器,其输入参数为编码器类型,输出为相应类型编码器,所述编码器类型为Intel硬件编码器,或者AMD硬件编码器,或者Nvidia硬件编码器; 所述写字节流接口用于将编码后的字节流写入上述欲写入编码结果的文件中,或者通过RTMP协议连接发送到RTMP服务器,或者通过RTSP协议连接发送到RTSP服务器; 所述文件关闭接口用于在编码结束后关闭正在写入的文件,或者关闭已建立的RTMP协议连接或者RTSP协议连接; 所述编码器执行子模块用于根据上述通用编码器接口子模块对编码器接口的定义创建编码器接口,利用创建的编码器接口判断计算机系统所支持的硬件编码器,选择调用Intel硬件编码器、AMD硬件编码器或Nvidia硬件编码器中的任一种对视频进行H264编码。3.如权利要求2所述的基于Intel、AMD和Nvidia三平台的H264硬件编码系统,其特征在于,所述编码器接口还包括写文件头接口,所述写文件头接口用于写文件头,所述文件头中包括了视频编码器的H264序列集参数和PPSH264图像集参数,所述H264序列集参数和PPSH264图像集参数用于在解码器解码时使用。4.如权利要求2所述的基于Intel、AMD和Nvidia三平台的H264硬件编码系统,其特征在于,所述编码器接口还包括元数据信息设置接口,所述元数据信息设置接口用于设置文件中的元数据信息。5.如 权利要求2至4任一项所述的基于Intel、AMD和Nvidia三平台的H264硬件编码系统,其特征在于,所述编码器创建接口包括编码器打开接口、编码器关闭接口以及图像编码接口,其中: 所述编码器打开接口用于打开编码器,输入参数包括待编码视频的宽、待编码视频的高以及编码的码率; 所述图像编码接口用于在上述编码器打开后,利用编码器编码图像,输入参数为要编码的图像和编码时间戳; 所述编码器关闭接口用于在编码结束后,关闭上述打开的编码器。6.如权利要求2至4任一项所述的基于Intel、AMD和Nvidia三平台的H264硬件编码系统,其特征在于,所述编码器类型获取接口获取计算机系统所支持的编码器类型具体为: 若返回CT_QSV264,表示计算机系统支持Intel硬件编码; 若返回CT_AMD264,表示计算机系统支持AMD硬件编码; 若返回CT_NV264,表示计算机系统支持Nvidia硬件编码; 若返回CT_X264,表示计算机系统不支持任何硬件编码。7.如权利要求5所述的基于Intel、AMD和Nvidia三平台的H264硬件编码系统,其特征在于,所述图像编码接口具体包括字节流缓冲区建立子模块、字节流缓冲区大小设置子模块、视频帧显示时间戳设置子模块、视屏帧解码时间戳设置子模块、关键帧判断子模块以及图像编码接口释放子模块,其中: 所述字节流缓冲区建立子模块,用于建立用于解码器解码的H264字节流缓冲区, 所述字节流缓冲区大小设置子模块,用于设置用于解码器解码的H264字节流缓冲区大小; 所述视频帧显示时间戳设置子模块,用于设置用于解码器解码的视频帧显示时间戳; 所述视屏帧解码时间戳设置子模块,用于设置视屏帧解码时间戳; 所述关键帧判断子模块,用于判断当前帧是否为关键帧; 所述图像编码接口释放子模块,用于释放当前图像编码接口。8.如权利要求1至7任一项所述的基于Intel、AMD和Nvidia三平台的H264硬件编码系统,其特征在于,所述Intel硬件编码器包括Intel硬件编码器初始化子模块、Intel硬件编码器编码子模块以及Intel硬件编码器关闭子模块,其中: 所述Intel硬件编码器初始化子模块用于初始化Intel硬件编码器,具体包括SDK初始化子模块、编码初始化子模块、显存分配子模块和Intel参数获取子模块,其中: 所述SDK初始化子模块用于调用MFXInit初始化Intel官方的MediaSDK; 所述编码初始化子模块用于调用MFXVideoENCODE_Init来初始化编码器; 所述显存分配子模块,用于分配用来接收待编码的图像的显存表面,具体包括; 调用MFXVideoENCODE_Query1Surf来获取需要创建的显存表面数量; 创建IDirect3DDeviceManager9接口,用来提供视频加速功能; 调用IDirect3DDeviceManager9接口 的OpenDeviceHandle方法,获取设备句柄;通过上步的设备句柄,调用10:[代(^3006¥;^6]\^1的86的接口的GetVideoService方法,创建IID_IDirectXVideoDecoderService(接口 IID)的IDirectXVideoDecoderService接P; 调用上步创建的10;[代(^乂¥丨(16006(30(16^61^;^6接口的063七6311忖306方法来完成视频加速表面的创建; 所述Intel参数获取子模块用于在初始化编码器成功后,获取H264序列集参数和H264图像集参数; 所述Intel硬件编码器编码子模块用于对视频进行H264编码,具体包括图像编码子模块和同步子模块,其中: 所述图像编码子模块,用于调用MFXVideoENCODE_EncodeFrameAsync对NV12格式的图像进行编码; 所述同步子模块用于调用MFXVideoCORE_SyncOperat1n来进行CPU和GPU之间的同步,获取硬件编码返回的数据流; 所述Intel硬件编码器关闭子模块用于在停止编码时调用MFXVideoENCODE_Close来关闭编码器,进行资源的释放,并调用MFXClose来关闭Intel MediaSDK。9.如权利要求1至7任一项所述的基于Intel、AMD和Nvidia三平台的H264硬件编码系统,其特征在于,所述AMD硬件编码器包括AMD硬件编码器初始化子模块、AMD硬件编码器编码子模块以及AMD硬件编码器关闭子模块,其中: 所述AMD硬件编码器初始化子模块用于初始化AMD硬件编码器,具体包括DLL加载子模块、接口创建子模块、参数设置子模块以及AMD参数获取子模块,其中: 所述01^加载子模块用于加载&!11;1^-(30作1;[11(16 81<:1:(^32.dl 1和amf-component_vce_windesktop32.dll ; 所述接口创建子模块用于调用AMFCreateContext创建AMFContext接口,以及调用AMFCreateComponent创建AMFComponent接 口, 所述参数设置子模块用于调用AMFComponent接口的SetProperty设置相关的编码参数,所述编码参数包括分辨率,码率和帧率;并调用AMFComponent接口的Init方法完成编码器的初始化; 所述AMD参数获取子模块用于调用AMFComponent接口的GetProperty方法,获取AMF_VIDEO_ENCODER_EXTRADATA枚举类型的H264序列集参数和PPSH264图像集参数; 所述AMD硬件编码器编码子模块用于对视频进行H264编码,具体包括视频表面分配子模块、视频表面提交子模块以及AMD字节流获取子模块,其中: 所述视频表面分配子模块用于调用AMFContext接口的AllocSurf ace方法分配用来接收待编码的图像的视频表面; 所述视频表面提交子模块用于调用AMFComponent接口的Submit Input方法,将生成的视频表面提交到编码器中; 所述AMD字节流获取子模块用于调用AMFComponent接口的QueryOutput方法,获取编码器编码后的字节流; 所述AMD硬件编码器关闭子模块,用于在停止编码时调用AMFComponent接口的Terminate方法关闭编码器,进行资源的释放。10.如权利要求1至7任一项所述的基于Intel、AMD和Nvidia三平台的H264硬件编码系统,其特征在于,所述Nvidia硬件编码器包括Nvidia硬件编码器初始化子模块、Nvidia硬件编码器编码子模块以及Nvidia硬件编码器关闭子模块,其中: 所述Nvidia硬件编码器初始化子模块用于初始化Nvidia硬件编码器,具体包括编码环境初始化子模块、Nvidia参数设置子模块、Nvidia参数获取子模块以及显存表面创建子模块,其中: 所述编码环境初始化子模块用于加载nvcuda.dl 1和nvEncodeAP1.dl 1,初始化必要的环境;并调用 nvEncodeAPI 模块的 NvEncodeAPICreatelnstance 方法创建 NV_ENCODE_API_FUNCT1N_LIST结构;以及调用cuCtxCreate_v2接口创建上下文环境; 所述Nvidia参数设置子模块用于调用nvEncOpenEncodeSess1nEx方法创建编码器会话,并调用nvEncGetEncodePresetConfig对编码器参数进行设置,以及调用nvEncInitializeEncoder完成编码器的初始化; 所述Nvidia参数获取子模块用于调用nvEncGetSequenceParams获取类型为NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER 的 H264序列集参数和 PPSH264 图像集参数; 所述显存表面创建子模块用于调用nvEncCreatelnputBuffer创建用来接收待编码的图像数据的显存表面,并调用nvEncCreateBitstreamBuffer创建编码输出存储数据; 所述Nvidia硬件编码器编码子模块用于对视频进行H264编码,具体包括填充编码图像子模块、编码子模块以及Nvidia字节流获取子模块,其中: 所述填充编码图像子模块用于调用nvEncLocklnputBuffer锁定上述显存表面创建子模块创建的显存表面,并填充编码图像;并调用nvEncUnlocklnputBuffer对该显存表面进行解锁; 所述编码子模块用于调用nvEncEncodePicture进行编码; 所述Nvidia字节流获取子模块用于调用nvEncLockBitstream获取编码后返回的字节流,做相应的处理后,调用nvEncUnlockBitstream释放字节流; 所述Nvidia硬件编码器关闭子模块,用于在停止编码时调用nvEncDestroyEncoder关闭编码器,并调用cuCtxDestroy_v2释放当前环境上下文。
【专利摘要】本发明公开了一种基于Intel、AMD和Nvidia三平台的H264硬件编码系统,包括通用编码模块、Intel硬件编码器、AMD硬件编码器以及Nvidia硬件编码器,其中所述通用编码模块,用于创建通用编码接口,判断计算机系统所支持的硬件编码器类型,根据计算机系统所支持的硬件编码器类型选择调用Intel硬件编码器、AMD硬件编码器或Nvidia硬件编码器中的任一种进行H264视频编码;Intel硬件编码器,用于对支持Intel硬件编码的计算机系统进行H264视频编码;AMD硬件编码器,用于对支持AMD硬件编码的计算机系统进行H264视频编码;Nvidia硬件编码器,用于对支持Nvidia硬件编码的计算机系统进行H264视频编码。本发明能够判断计算机系统所支持的硬件编码器类型,对各种不同的计算机系统无感知的提供H264硬件编码。
【IPC分类】H04N19/44, H04N19/42
【公开号】CN105491387
【申请号】CN201510887873
【发明人】杨亮
【申请人】武汉斗鱼网络科技有限公司
【公开日】2016年4月13日
【申请日】2015年12月4日

最新回复(0)