CN105430408A - 一种基于Intel、AMD和Nvidia三平台的H264硬件解码系统 - Google Patents
一种基于Intel、AMD和Nvidia三平台的H264硬件解码系统 Download PDFInfo
- Publication number
- CN105430408A CN105430408A CN201510887824.XA CN201510887824A CN105430408A CN 105430408 A CN105430408 A CN 105430408A CN 201510887824 A CN201510887824 A CN 201510887824A CN 105430408 A CN105430408 A CN 105430408A
- Authority
- CN
- China
- Prior art keywords
- decoder
- hardware
- submodule
- interface
- decoding
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Compression Or Coding Systems Of Tv Signals (AREA)
Abstract
本发明公开了一种基于Intel、AMD和Nvidia三平台的H264硬件解码系统,包括通用解码模块、Intel硬件解码器、AMD硬件解码器以及Nvidia硬件解码器,其中所述通用解码模块,用于创建通用解码接口,判断计算机系统所支持的硬件解码器类型,根据计算机系统所支持的硬件解码器类型选择调用Intel硬件解码器、AMD硬件解码器或Nvidia硬件解码器中的任一种进行H264视频解码;Intel硬件解码器,用于对支持Intel硬件解码的计算机系统进行H264视频解码;AMD硬件解码器,用于对支持AMD硬件解码的计算机系统进行H264视频解码;Nvidia硬件解码器,用于对支持Nvidia硬件解码的计算机系统进行H264视频解码。本发明能够判断计算机系统所支持的硬件解码器类型,对各种不同的计算机系统无感知的提供H264硬件解码。
Description
技术领域
本发明属于图形图像技术领域,更具体地,涉及一种基于Intel、AMD和Nvidia三平台的H264硬件解码系统。
背景技术
H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。H.264是ITU-T以H.26x系列为名称命名的视频编解码技术标准之一。H.264是ITU-T的VCEG(视频解码专家组)和ISO/IEC的MPEG(活动图像解码专家组)的联合视频组(JVT:jointvideoteam)开发的一个数字视频解码标准。该标准最早来自于ITU-T的称之为H.26L的项目的开发。H.26L这个名称虽然不太常见,但是一直被使用着。H.264是ITU-T以H.26x系列为名称命名的标准之一,AVC是ISO/IECMPEG一方的称呼。
目前大部分的H264解码使用的是libx264的软件解码,这样在计算机的CPU性能比较差的情况下,会严重消耗中央处理器(CentralProcessingUnit,CPU)资源,导致计算机系统系统性能下降;即使有些计算机使用了硬件解码,但是仅仅是支持Intel平台的集成显卡或者Nvidia平台,并不能对Intel、AMD、Nvidia这几大平台进行统一的支持。
发明内容
针对现有技术的以上缺陷或改进需求,本发明提供了一种基于Intel、AMD和Nvidia三平台的H264硬件解码系统,其目的在于能够针对不同硬件平台的计算机平台无感知的提供相应的硬件解码方案,由此解决现有技术下部分计算机系统无法进行H264硬件解码的技术问题。
为实现上述目的,本发明提供了一种基于Intel、AMD和Nvidia三平台的H264硬件解码系统,包括通用解码模块、Intel硬件解码器、AMD硬件解码器以及Nvidia硬件解码器,其中:
所述通用解码模块,用于创建通用解码接口,判断计算机系统所支持的硬件解码器类型,根据计算机系统所支持的硬件解码器类型选择调用Intel硬件解码器、AMD硬件解码器或Nvidia硬件解码器中的任一种进行H264视频解码;
所述Intel硬件解码器,用于对支持Intel硬件解码的计算机系统进行H264视频解码;
所述AMD硬件解码器,用于对支持AMD硬件解码的计算机系统进行H264视频解码;
所述Nvidia硬件解码器,用于对支持Nvidia硬件解码的计算机系统进行H264视频解码。
本发明的一个实施例中,所述通用解码模块包括通用解码器接口子模块和解码器执行子模块,其中:
所述通用解码器接口子模块用于实现对解码器接口的定义,所述解码器接口包括文件打开接口、解码器类型获取接口和解码器创建接口,其中:
所述文件打开接口用于打开欲写入解码结果的文件,或者建立RTMP协议连接或者RTSP协议连接,所述文件打开接口的输入参数包括文件路径和读写文件参数;
所述解码器类型获取接口用于获取计算机系统所支持的解码器类型,以使所述解码器创建接口根据所述计算机系统所支持的解码器类型创建相应类型的硬件解码器;
所述解码器创建接口用于根据所述解码器类型获取接口返回的解码器类型创建相应类型的解码器,其输入参数为解码器类型,输出为相应类型解码器,所述解码器类型为Intel硬件解码器,或者AMD硬件解码器,或者Nvidia硬件解码器;
所述解码器执行子模块用于根据上述通用解码器接口子模块对解码器接口的定义创建解码器接口,利用创建的解码器接口判断计算机系统所支持的硬件解码器,选择调用Intel硬件解码器、AMD硬件解码器或Nvidia硬件解码器中的任一种对视频进行H264解码。
本发明的一个实施例中,所述解码器接口还包括读文件头接口,所述读文件头接口用于读文件头,所述文件头中包括了视频解码器的H264序列集参数和PPSH264图像集参数。
本发明的一个实施例中,所述解码器接口还包括元数据信息读取接口,用于读取文件中的元数据信息,包括元数据的个数,元数据中的键信息以及元数据中的值信息。
本发明的一个实施例中,所述解码器创建接口包括解码器打开接口、解码器关闭接口以及图像解码接口,其中:
所述解码器打开接口用于打开解码器,输入参数包括待解码视频的宽和待解码视频的高;
所述图像解码接口用于在上述解码器打开后,利用解码器解码图像,输入参数为待解码的视屏字节流以及解码后视屏的显示时间戳,输出为解码后的图像;
所述解码器关闭接口用于在解码结束后,关闭上述打开的解码器。
本发明的一个实施例中,所述解码器类型获取接口获取计算机系统所支持的解码器类型具体为:
若返回CT_QSV264,表示计算机系统支持Intel硬件解码;
若返回CT_AMD264,表示计算机系统支持AMD硬件解码;
若返回CT_NV264,表示计算机系统支持Nvidia硬件解码;
若返回CT_X264,表示计算机系统不支持任何硬件解码。
本发明的一个实施例中,所述图像解码接口具体包括字节流缓冲区建立子模块、图像高度设置子模块、图像宽度设置子模块、行像素大小获取子模块以及视频帧显示时间戳获取子模块,其中:
所述字节流缓冲区建立子模块,用于建立用于解码器解码的H264字节流缓冲区,
所述图像高度设置子模块,用于设置返回图像的高度;
所述图像宽度设置子模块,用于设置返回图像的宽度;
所述行像素大小获取子模块,用于获取返回图像一行像素占用的字节大小;
所述视频帧显示时间戳获取子模块,用于获取视频帧显示时间戳。
本发明的一个实施例中,所述Intel硬件解码器包括Intel硬件解码器初始化子模块、Intel硬件解码器解码子模块以及Intel硬件解码器关闭子模块,其中:
所述Intel硬件解码器初始化子模块用于初始化Intel硬件解码器,具体包括SDK初始化子模块、解码初始化子模块和显存分配子模块,其中:
所述SDK初始化子模块用于调用MFXInit初始化Intel官方的MediaSDK;
所述解码初始化子模块用于调用MFXVideoDECODE_Init来初始化解码器;
所述显存分配子模块,用于分配用来接收解码后图像的显存表面;
所述Intel硬件解码器解码子模块用于对视频进行H264解码,具体包括图像解码子模块和同步子模块,其中:
所述图像解码子模块,用于调用MFXVideoDECODE_DecodeFrameAsync对编码后的H264视频流进行解码;
所述同步子模块用于调用MFXVideoCORE_SyncOperation来进行CPU和GPU之间的同步,获取硬件解码返回的数据流;
所述Intel硬件解码器关闭子模块用于在停止解码时调用MFXVideoDECODE_Close来关闭解码器,进行资源的释放,并调用MFXClose来关闭IntelMediaSDK。
本发明的一个实施例中,所述AMD硬件解码器包括AMD硬件解码器初始化子模块、AMD硬件解码器解码子模块以及AMD硬件解码器关闭子模块,其中:
所述AMD硬件解码器初始化子模块用于初始化AMD硬件解码器,具体包括DLL加载子模块、接口创建子模块以及参数设置子模块,其中:
所述DLL加载子模块用于加载amf-core-windesktop32.dll和amf-component-vce-windesktop32.dll;
所述接口创建子模块用于调用AMFCreateContext创建AMFContext接口,以及调用AMFCreateComponent创建AMFComponent接口;
所述参数设置子模块用于调用AMFComponent接口的SetProperty设置相关的解码参数,所述解码参数包括分辨率;并调用AMFComponent接口的Init方法完成解码器的初始化;
所述AMD硬件解码器解码子模块用于对视频进行H264解码,具体包括AMD内存分配子模块、内存数据提交子模块以及图像获取子模块,其中:
所述AMD内存分配子模块用于调用AMFContext接口的AllocBuffer方法分配用来接收待解码的H264字节流的内存空间;
所述内存数据提交子模块用于调用AMFComponent接口的SubmitInput方法,将生成的内存数据提交到解码器中;
所述图像获取子模块用于调用AMFComponent接口的QueryOutput方法,获取解码器解码后生成的图像;
所述AMD硬件解码器关闭子模块,用于在停止解码时调用AMFComponent接口的Terminate方法关闭解码器,进行资源的释放。
本发明的一个实施例中,所述Nvidia硬件解码器包括Nvidia硬件解码器初始化子模块、Nvidia硬件解码器解码子模块以及Nvidia硬件解码器关闭子模块,其中:
所述Nvidia硬件解码器初始化子模块用于初始化Nvidia硬件解码器,具体包括解码环境初始化子模块、H264流分析器生成子模块、Nvidia内存生成子模块,其中:
所述解码环境初始化子模块用于加载nvcuda.dll和nvcuvid.dll,初始化必要的环境;并调用cuCtxCreate_v2接口创建上下文环境;
所述H264流分析器生成子模块用于调用cuvidCreateDecoder创建硬件解码器;并调用cuvidCreateVideoParser创建H264流分析器;
所述Nvidia内存生成子模块用于调用调用cuStreamCreate创建数据传输对象;并调用cuMemAllocHost_v2分配用于接收解码后的图像的系统内存;
所述Nvidia硬件解码器解码子模块用于对视频进行H264解码,具体包括填视频字节流解析子模块、解码子模块以及图像拷贝子模块,其中:
所述视频字节流解析子模块用于调用cuvidParseVideoData对传入H264视频字节流进行解析;
所述解码子模块用于调用cuvidDecodePicture对解析后的H264视频字节流进行解码得到图像;
所述图像拷贝子模块用于调用cuMemcpyDtoHAsync_v2将解码后的图像拷贝到系统内存中;
所述Nvidia硬件解码器关闭子模块,用于在停止解码时调用cuvidDestroyVideoParser关闭H264流分析器;调用cuvidDestroyDecoder关闭硬件解码器;调用cuMemFreeHost释放用来保存解码后的图像而分配的系统内存;调用cuCtxDestroy_v2释放当前上下文环境。
本发明提供的基于Intel、AMD和Nvidia三平台的H264硬件解码系统,能够判断计算机系统所支持的硬件解码器类型,并根据所述硬件解码器类型选择调用Intel硬件解码器、AMD硬件解码器或Nvidia硬件解码器中的任一种对需要在该计算机系统上播放的视频进行H264解码,从而能够对各种不同的计算机系统平台无感知的提供H264硬件解码。。
附图说明
图1是本发明实施例中基于Intel、AMD和Nvidia三平台的H264硬件解码系统的结构示意图;
图2是本发明实施例中通用解码器接口子模块的结构示意图;
图3是本发明实施例中Intel硬件解码器的结构示意图;
图4是本发明实施例中AMD硬件解码器的结构示意图;
图5是本发明实施例中Nvidia硬件解码器的结构示意图;
图6是本发明实施例中硬件解码系统的UML类图示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
如图1所示,本发明提供了一种基于Intel、AMD和Nvidia三平台的H264硬件解码系统,包括通用解码模块、Intel硬件解码器、AMD硬件解码器以及Nvidia硬件解码器,其中:
所述通用解码模块,用于创建通用解码接口,判断计算机系统所支持的硬件解码器类型,根据计算机系统所支持的硬件解码器类型选择调用Intel硬件解码器、AMD硬件解码器或Nvidia硬件解码器中的任一种进行H264视频解码;
具体地,如图2所示,所述通用解码模块包括通用解码器接口子模块和解码器执行子模块,其中:
所述通用解码器接口子模块用于实现对解码器接口的定义,所述解码器接口包括文件打开接口、解码器类型获取接口和解码器创建接口,其中:
所述文件打开接口用于打开欲写入解码结果的文件,或者建立RTMP协议连接或者RTSP协议连接,所述文件打开接口的输入参数包括文件路径和读写文件参数;所述文件路径为本地磁盘的文件路径,或者是以RTMP://XXX开头的RTMP协议URL,或者是以RTSP://XXX开头的RTSP协议URL,所述读写文件参数为读取;
所述解码器类型获取接口用于获取计算机系统所支持的解码器类型,以使所述解码器创建接口根据所述计算机系统所支持的解码器类型创建相应类型的硬件解码器;
所述解码器创建接口用于根据所述解码器类型获取接口返回的解码器类型创建相应类型的解码器,其输入参数为解码器类型,输出为相应类型解码器,所述解码器类型为Intel硬件解码器,或者AMD硬件解码器,或者Nvidia硬件解码器;其中所述解码器创建接口包括解码器打开接口、解码器关闭接口以及图像解码接口,其中:
所述解码器打开接口用于打开解码器,输入参数包括待解码视频的宽和待解码视频的高;
所述图像解码接口用于在上述解码器打开后,利用解码器解码图像,输入参数为待解码的视屏字节流以及解码后视屏的显示时间戳,输出为解码后的图像;所述图像解码接口具体包括字节流缓冲区建立子模块、图像高度设置子模块、图像宽度设置子模块、行像素大小获取子模块以及视频帧显示时间戳获取子模块,其中:
所述字节流缓冲区建立子模块,用于建立用于解码器解码的H264字节流缓冲区,
所述图像高度设置子模块,用于设置返回图像的高度;
所述图像宽度设置子模块,用于设置返回图像的宽度;
所述行像素大小获取子模块,用于获取返回图像一行像素占用的字节大小;
所述视频帧显示时间戳获取子模块,用于获取视频帧显示时间戳。
具体地,所述解码器类型获取接口获取计算机系统所支持的解码器类型具体为:
若返回CT_QSV264,表示计算机系统支持Intel硬件解码;
若返回CT_AMD264,表示计算机系统支持AMD硬件解码;
若返回CT_NV264,表示计算机系统支持Nvidia硬件解码;
若返回CT_X264,表示计算机系统不支持任何硬件解码。
进一步地,所述解码器接口还包括读文件头接口,所述读文件头接口用于读文件头,所述文件头中包括了视频解码器的H264序列集参数和PPSH264图像集参数。
进一步地,所述解码器接口还包括元数据信息读取接口,所述元数据信息读取接口用于读取文件中的元数据信息,包括元数据的个数,元数据中的键信息以及元数据中的值信息。
所述解码器执行子模块用于根据上述通用解码器接口子模块对解码器接口的定义创建解码器接口,利用创建的解码器接口判断计算机系统所支持的硬件解码器,选择调用Intel硬件解码器、AMD硬件解码器或Nvidia硬件解码器中的任一种对视频进行H264解码,其中:
所述Intel硬件解码器,用于对支持Intel硬件解码的计算机系统进行H264视频解码;
具体地,如图3所示,
所述Intel硬件解码器包括Intel硬件解码器初始化子模块、Intel硬件解码器解码子模块以及Intel硬件解码器关闭子模块,其中:
所述Intel硬件解码器初始化子模块用于初始化Intel硬件解码器,具体包括SDK初始化子模块、解码初始化子模块和显存分配子模块,其中:
所述SDK初始化子模块用于调用MFXInit初始化Intel官方的MediaSDK;
所述解码初始化子模块用于调用MFXVideoDECODE_Init来初始化解码器;
所述显存分配子模块,用于分配用来接收解码后图像的显存表面;
所述Intel硬件解码器解码子模块用于对视频进行H264解码,具体包括图像解码子模块和同步子模块,其中:
所述图像解码子模块,用于调用MFXVideoDECODE_DecodeFrameAsync对编码后的H264视频流进行解码;
所述同步子模块用于调用MFXVideoCORE_SyncOperation来进行CPU和GPU之间的同步,获取硬件解码返回的数据流;
所述Intel硬件解码器关闭子模块用于在停止解码时调用MFXVideoDECODE_Close来关闭解码器,进行资源的释放,并调用MFXClose来关闭IntelMediaSDK。
所述AMD硬件解码器,用于对支持AMD硬件解码的计算机系统进行H264视频解码;
具体地,如图4所示,所述AMD硬件解码器包括AMD硬件解码器初始化子模块、AMD硬件解码器解码子模块以及AMD硬件解码器关闭子模块,其中:
所述AMD硬件解码器初始化子模块用于初始化AMD硬件解码器,具体包括AMD硬件解码器初始化子模块、AMD硬件解码器解码子模块以及AMD硬件解码器关闭子模块,其中:
所述AMD硬件解码器初始化子模块用于初始化AMD硬件解码器,具体包括DLL加载子模块、接口创建子模块以及参数设置子模块,其中:
所述DLL加载子模块用于加载amf-core-windesktop32.dll和amf-component-vce-windesktop32.dll;
所述接口创建子模块用于调用AMFCreateContext创建AMFContext接口,以及调用AMFCreateComponent创建AMFComponent接口;
所述参数设置子模块用于调用AMFComponent接口的SetProperty设置相关的解码参数,所述解码参数包括分辨率;并调用AMFComponent接口的Init方法完成解码器的初始化;
所述AMD硬件解码器解码子模块用于对视频进行H264解码,具体包括AMD内存分配子模块、内存数据提交子模块以及图像获取子模块,其中:
所述AMD内存分配子模块用于调用AMFContext接口的AllocBuffer方法分配用来接收待解码的H264字节流的内存空间;
所述内存数据提交子模块用于调用AMFComponent接口的SubmitInput方法,将生成的内存数据提交到解码器中;
所述图像获取子模块用于调用AMFComponent接口的QueryOutput方法,获取解码器解码后生成的图像;
所述AMD硬件解码器关闭子模块,用于在停止解码时调用AMFComponent接口的Terminate方法关闭解码器,进行资源的释放。
所述Nvidia硬件解码器,用于对支持Nvidia硬件解码的计算机系统进行H264视频解码。
具体地,如图5所示,所述Nvidia硬件解码器包括Nvidia硬件解码器初始化子模块、Nvidia硬件解码器解码子模块以及Nvidia硬件解码器关闭子模块,其中:
所述Nvidia硬件解码器初始化子模块用于初始化Nvidia硬件解码器,具体包括
Nvidia硬件解码器初始化子模块、Nvidia硬件解码器解码子模块以及Nvidia硬件解码器关闭子模块,其中:
所述Nvidia硬件解码器初始化子模块用于初始化Nvidia硬件解码器,具体包括解码环境初始化子模块、H264流分析器生成子模块、Nvidia内存生成子模块,其中:
所述解码环境初始化子模块用于加载nvcuda.dll和nvcuvid.dll,初始化必要的环境;并调用cuCtxCreate_v2接口创建上下文环境;
所述H264流分析器生成子模块用于调用cuvidCreateDecoder创建硬件解码器;并调用cuvidCreateVideoParser创建H264流分析器;
所述Nvidia内存生成子模块用于调用调用cuStreamCreate创建数据传输对象;并调用cuMemAllocHost_v2分配用于接收解码后的图像的系统内存;
所述Nvidia硬件解码器解码子模块用于对视频进行H264解码,具体包括填视频字节流解析子模块、解码子模块以及图像拷贝子模块,其中:
所述视频字节流解析子模块用于调用cuvidParseVideoData对传入H264视频字节流进行解析;
所述解码子模块用于调用cuvidDecodePicture对解析后的H264视频字节流进行解码得到图像;
所述图像拷贝子模块用于调用cuMemcpyDtoHAsync_v2将解码后的图像拷贝到系统内存中;
所述Nvidia硬件解码器关闭子模块,用于在停止解码时调用cuvidDestroyVideoParser关闭H264流分析器;调用cuvidDestroyDecoder关闭硬件解码器;调用cuMemFreeHost释放用来保存解码后的图像而分配的系统内存;调用cuCtxDestroy_v2释放当前上下文环境。
具体地,在本发明实施例中可以通过提供统一的接口来屏蔽硬件差异性,可以通过如图6所示的UML(统一建模语言)类图描述本技术方案对三大平台的硬件解码封装以及对libx264软件解码器的封装。
对应有AmdDecoder、NvidiaDecoder、QsvDecoder他们分别代表AMD硬件解码器,NVIDIA硬件解码器、INTEL硬件解码器,他们都继承自BaseDecoder接口,BaseDecoder接口继承自IMediaDecoder接口,而IMediaDecoder就是最终统一化抽象的接口,该接口所提供的方法在图中已经写明包括(Open,打开解码器、Close,关闭解码器、Decode,解码等)具体的接口定义如下:
1、IMediaFile接口
(1.1)boolOpen(char*filepath,boolwrite)
打开文件,filepath参数代表文件路径,即可以是本地磁盘的文件路径,也可以是已RTMP://XXX开头的RTMP协议URL,也可以是RTSP://XXX开头的RTSP协议URL,write参数代表是读文件还是写文件,在解码中该为应为false。
(1.2)IMediaDecoder*CreateDecoder(CodecTypetype)
创建解码器,参数type为解码器的类型,返回值为IMediaDecoder接口
(1.23)boolGetMetaDataInformation(int*nummetas,char**key,char**value)
获取文件数据流中的所有元数据信息,参数nummetas返回元数据的个数,key返回元数据中的键信息,value返回元数据中的值信息
(1.4)intReadVideoHeader(uint8_t*buffer,intsize)
读取视屏编码器的SPS(序列集参数)和PPS(图像集参数)信息
(1.5)intGetVideoSize(int*width,int*height)
获取视频流图像的分辨率
2、CodecType枚举类型
(2.1)CT_VIDEOBEST
代表自动选择支持的硬件解码器,可以用来判断当前系统支持哪种类型的硬件解码器
(2.2)CT_X264
代表libx264软件解码器
(2.3)CT_QSV264
代表Intel硬件解码器
(2.4)CT_AMD264
代表AMD平台硬件解码器
3、IMediaDecoder接口
该接口通过IMediaFile的CreateDecoder获取,用于解码
(3.1)boolOpen(intwidth,intheight)
用于打开解码器,参数width代表待解码的视屏宽度,参数height代表待解码的视屏高度
(3.2)voidClose()
关闭解码器,回收资源
(3.3)IDecodedFrame*Decode(uint8_t*buffer,intsize,int64_tpts)
解码图像,参数buffer为待解码的视屏字节流,pts为解码后视屏的显示时间戳,返回值IdecodedFrame为解码后的图像
(3.4)CodecTypeGetCodecType()
用于获取解码器的类型,是INTEL硬件解码器还是AMD硬件解码器等
4、IDecodedFrame接口
该接口用于保存Decode方法解码H264字节流后的图像
(4.1)Buffer
包含解码后的图像像素
(4.2)Width
返回图像宽度
(4.3)Height
返回图像高度
(4.14)Pitch
返回图像一行像素占用的字节大小
(4.5)Pts
返回图像的显示时间戳
5、模块导出函数
IMediaFile*CreateMediaFile(ContainerFormatcf)
该函数为该技术方案的ylmediaengine模块中的DLL导出函数,用来创建一个IMediaFile接口,通过该创建的IMediaFile接口,便可以创建硬件H264解码器。
下面结合一个具体实例说明如何在实际计算机系统中利用上述系统进行H264硬件解码,例如通过该IMediaDecoder接口,在一种游戏直播平台(例如斗鱼TV直播伴侣)中使用该接口进行硬件解码并将解码后的画面推送到斗鱼TV服务器,进行直播,具体地,实现步骤如下:
(6.1)调用CreateMediaFile函数创建IMediaFile接口;
(6.2)调用IMediaFile的CreateDecoder接口创建IMediaDecoder接口硬件解码器,调用CreateDecoder方法时传入CT_VIDEOBEST参数,对返回的IMediaDecoder接口调用GetCodecType方法,当返回CT_QSV264时,系统支持INTEL硬件解码,当返回CT_NV264时系统支持NVIDIA硬件解码,当返回CT_AMD264时,系统支持AMD硬件解码。这样便可以自动判断当前系统支持何种类型的硬件解码器,这样不管是何种类型的硬件解码,均可以使用该接口来解码高清H264影片;
(6.3)调用IMediaFile的GetVideoSize接口获取待解码影片的分辨率,本例中解码的是1080p的影片,故应该得到的值是宽1920,高1080;
(6.4)调用IMediaFile的GetVideoHeader方法,获取待解码视频的SPS、PPS信息;
(6.5)调用IMediaDecoder的Open方法,传入该视频的分辨率,如1080p的影片的宽度应该为1920、高度为1080,来初始化硬件解码器;
(6.6)读取视频文件,调用IMediaDecoder接口的Decode方法对视频流进行解码,并返回IDecodedFrame接口;
(6.7)通过上步返回的IDecodedFrame接口,将解码后的图像绘制在直播伴侣窗口上。
通过以上步骤,便实现了本发明实施例中利用硬件解码,将图像推送到RTMP服务器进行直播的过程。
并且通过测试发现,采用软件解码的CPU消耗是硬件解码的CPU消耗的一倍之多,并且采用硬件解码后的图像清晰度与软件解码的清晰度没有明显的区别。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
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硬件解码器;
所述解码器执行子模块用于根据上述通用解码器接口子模块对解码器接口的定义创建解码器接口,利用创建的解码器接口判断计算机系统所支持的硬件解码器,选择调用Intel硬件解码器、AMD硬件解码器或Nvidia硬件解码器中的任一种对视频进行H264解码。
3.如权利要求2所述的基于Intel、AMD和Nvidia三平台的H264硬件解码系统,其特征在于,所述解码器接口还包括读文件头接口,所述读文件头接口用于读文件头,所述文件头中包括了视频解码器的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字节流缓冲区,
所述图像高度设置子模块,用于设置返回图像的高度;
所述图像宽度设置子模块,用于设置返回图像的宽度;
所述行像素大小获取子模块,用于获取返回图像一行像素占用的字节大小;
所述视频帧显示时间戳获取子模块,用于获取视频帧显示时间戳。
8.如权利要求1至7任一项所述的基于Intel、AMD和Nvidia三平台的H264硬件解码系统,其特征在于,所述Intel硬件解码器包括Intel硬件解码器初始化子模块、Intel硬件解码器解码子模块以及Intel硬件解码器关闭子模块,其中:
所述Intel硬件解码器初始化子模块用于初始化Intel硬件解码器,具体包括SDK初始化子模块、解码初始化子模块和显存分配子模块,其中:
所述SDK初始化子模块用于调用MFXInit初始化Intel官方的MediaSDK;
所述解码初始化子模块用于调用MFXVideoDECODE_Init来初始化解码器;
所述显存分配子模块,用于分配用来接收解码后图像的显存表面;
所述Intel硬件解码器解码子模块用于对视频进行H264解码,具体包括图像解码子模块和同步子模块,其中:
所述图像解码子模块,用于调用MFXVideoDECODE_DecodeFrameAsync对编码后的H264视频流进行解码;
所述同步子模块用于调用MFXVideoCORE_SyncOperation来进行CPU和GPU之间的同步,获取硬件解码返回的数据流;
所述Intel硬件解码器关闭子模块用于在停止解码时调用MFXVideoDECODE_Close来关闭解码器,进行资源的释放,并调用MFXClose来关闭IntelMediaSDK。
9.如权利要求1至7任一项所述的基于Intel、AMD和Nvidia三平台的H264硬件解码系统,其特征在于,所述AMD硬件解码器包括AMD硬件解码器初始化子模块、AMD硬件解码器解码子模块以及AMD硬件解码器关闭子模块,其中:
所述AMD硬件解码器初始化子模块用于初始化AMD硬件解码器,具体包括DLL加载子模块、接口创建子模块以及参数设置子模块,其中:
所述DLL加载子模块用于加载amf-core-windesktop32.dll和amf-component-vce-windesktop32.dll;
所述接口创建子模块用于调用AMFCreateContext创建AMFContext接口,以及调用AMFCreateComponent创建AMFComponent接口;
所述参数设置子模块用于调用AMFComponent接口的SetProperty设置相关的解码参数,所述解码参数包括分辨率;并调用AMFComponent接口的Init方法完成解码器的初始化;
所述AMD硬件解码器解码子模块用于对视频进行H264解码,具体包括AMD内存分配子模块、内存数据提交子模块以及图像获取子模块,其中:
所述AMD内存分配子模块用于调用AMFContext接口的AllocBuffer方法分配用来接收待解码的H264字节流的内存空间;
所述内存数据提交子模块用于调用AMFComponent接口的SubmitInput方法,将生成的内存数据提交到解码器中;
所述图像获取子模块用于调用AMFComponent接口的QueryOutput方法,获取解码器解码后生成的图像;
所述AMD硬件解码器关闭子模块,用于在停止解码时调用AMFComponent接口的Terminate方法关闭解码器,进行资源的释放。
10.如权利要求1至7任一项所述的基于Intel、AMD和Nvidia三平台的H264硬件解码系统,其特征在于,所述Nvidia硬件解码器包括Nvidia硬件解码器初始化子模块、Nvidia硬件解码器解码子模块以及Nvidia硬件解码器关闭子模块,其中:
所述Nvidia硬件解码器初始化子模块用于初始化Nvidia硬件解码器,具体包括解码环境初始化子模块、H264流分析器生成子模块、Nvidia内存生成子模块,其中:
所述解码环境初始化子模块用于加载nvcuda.dll和nvcuvid.dll,初始化必要的环境;并调用cuCtxCreate_v2接口创建上下文环境;
所述H264流分析器生成子模块用于调用cuvidCreateDecoder创建硬件解码器;并调用cuvidCreateVideoParser创建H264流分析器;
所述Nvidia内存生成子模块用于调用调用cuStreamCreate创建数据传输对象;并调用cuMemAllocHost_v2分配用于接收解码后的图像的系统内存;
所述Nvidia硬件解码器解码子模块用于对视频进行H264解码,具体包括填视频字节流解析子模块、解码子模块以及图像拷贝子模块,其中:
所述视频字节流解析子模块用于调用cuvidParseVideoData对传入H264视频字节流进行解析;
所述解码子模块用于调用cuvidDecodePicture对解析后的H264视频字节流进行解码得到图像;
所述图像拷贝子模块用于调用cuMemcpyDtoHAsync_v2将解码后的图像拷贝到系统内存中;
所述Nvidia硬件解码器关闭子模块,用于在停止解码时调用cuvidDestroyVideoParser关闭H264流分析器;调用cuvidDestroyDecoder关闭硬件解码器;调用cuMemFreeHost释放用来保存解码后的图像而分配的系统内存;调用cuCtxDestroy_v2释放当前上下文环境。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510887824.XA CN105430408B (zh) | 2015-12-04 | 2015-12-04 | 一种基于Intel、AMD和Nvidia三平台的H264硬件解码系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510887824.XA CN105430408B (zh) | 2015-12-04 | 2015-12-04 | 一种基于Intel、AMD和Nvidia三平台的H264硬件解码系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105430408A true CN105430408A (zh) | 2016-03-23 |
CN105430408B CN105430408B (zh) | 2018-07-06 |
Family
ID=55508296
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510887824.XA Active CN105430408B (zh) | 2015-12-04 | 2015-12-04 | 一种基于Intel、AMD和Nvidia三平台的H264硬件解码系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105430408B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108848386A (zh) * | 2018-06-26 | 2018-11-20 | 深圳智锐通科技有限公司 | 跨多cpu和多gpu芯片的混合解码方法 |
CN108989747A (zh) * | 2018-07-05 | 2018-12-11 | 深圳智锐通科技有限公司 | 跨多gpu芯片的视频拼接方法及装置 |
CN109963191A (zh) * | 2017-12-14 | 2019-07-02 | 中兴通讯股份有限公司 | 一种视频信息的处理方法、装置及存储介质 |
CN110022480A (zh) * | 2018-01-09 | 2019-07-16 | 武汉斗鱼网络科技有限公司 | 一种基于amd显卡的h265硬件编码方法及直播平台 |
CN110022479A (zh) * | 2018-01-09 | 2019-07-16 | 武汉斗鱼网络科技有限公司 | 一种基于Nvidia Maxwell2显卡的H265硬件编码方法及直播平台 |
CN110022478A (zh) * | 2018-01-09 | 2019-07-16 | 武汉斗鱼网络科技有限公司 | 一种基于Intel SkyLake集成显卡的H265硬件编码方法及直播平台 |
CN111246214A (zh) * | 2018-11-28 | 2020-06-05 | 杭州海康威视数字技术股份有限公司 | 一种视频解码方法、装置 |
CN112069040A (zh) * | 2020-09-27 | 2020-12-11 | 山东云海国创云计算装备产业创新中心有限公司 | 一种硬盘点灯方法、装置及相关组件 |
CN114339257A (zh) * | 2022-01-26 | 2022-04-12 | 稿定(厦门)科技有限公司 | 用于解码视频文件的方法及装置 |
CN115209223A (zh) * | 2022-05-12 | 2022-10-18 | 广州方硅信息技术有限公司 | 视频编/解码的控制处理方法、装置、终端以及存储介质 |
CN115580735A (zh) * | 2022-12-08 | 2023-01-06 | 北京海誉动想科技股份有限公司 | 视频编解码处理与系统、编解码服务器与插件模块 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101196846A (zh) * | 2006-12-04 | 2008-06-11 | 英业达股份有限公司 | 信号处理系统 |
CN102685481A (zh) * | 2011-03-18 | 2012-09-19 | 腾讯科技(深圳)有限公司 | 一种媒体文件处理方法及其系统 |
US20140044191A1 (en) * | 2012-08-13 | 2014-02-13 | Gurulogic Microsystems Oy | Decoder and method |
CN103617191A (zh) * | 2013-11-07 | 2014-03-05 | 北京奇虎科技有限公司 | 使用硬件加速实现浏览器渲染的方法和浏览器 |
CN104980752A (zh) * | 2015-06-11 | 2015-10-14 | 武汉大千信息技术有限公司 | 利用cpu和gpu实现多路自适应并行转码的方法及系统 |
-
2015
- 2015-12-04 CN CN201510887824.XA patent/CN105430408B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101196846A (zh) * | 2006-12-04 | 2008-06-11 | 英业达股份有限公司 | 信号处理系统 |
CN102685481A (zh) * | 2011-03-18 | 2012-09-19 | 腾讯科技(深圳)有限公司 | 一种媒体文件处理方法及其系统 |
US20140044191A1 (en) * | 2012-08-13 | 2014-02-13 | Gurulogic Microsystems Oy | Decoder and method |
CN103617191A (zh) * | 2013-11-07 | 2014-03-05 | 北京奇虎科技有限公司 | 使用硬件加速实现浏览器渲染的方法和浏览器 |
CN104980752A (zh) * | 2015-06-11 | 2015-10-14 | 武汉大千信息技术有限公司 | 利用cpu和gpu实现多路自适应并行转码的方法及系统 |
Non-Patent Citations (1)
Title |
---|
郭献: "基于Intel平台的H.264硬件加速编解码器的研究与应用", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109963191A (zh) * | 2017-12-14 | 2019-07-02 | 中兴通讯股份有限公司 | 一种视频信息的处理方法、装置及存储介质 |
CN110022480B (zh) * | 2018-01-09 | 2022-03-25 | 武汉斗鱼网络科技有限公司 | 一种基于amd显卡的h265硬件编码方法及直播平台 |
CN110022480A (zh) * | 2018-01-09 | 2019-07-16 | 武汉斗鱼网络科技有限公司 | 一种基于amd显卡的h265硬件编码方法及直播平台 |
CN110022479A (zh) * | 2018-01-09 | 2019-07-16 | 武汉斗鱼网络科技有限公司 | 一种基于Nvidia Maxwell2显卡的H265硬件编码方法及直播平台 |
CN110022478A (zh) * | 2018-01-09 | 2019-07-16 | 武汉斗鱼网络科技有限公司 | 一种基于Intel SkyLake集成显卡的H265硬件编码方法及直播平台 |
CN108848386A (zh) * | 2018-06-26 | 2018-11-20 | 深圳智锐通科技有限公司 | 跨多cpu和多gpu芯片的混合解码方法 |
CN108989747A (zh) * | 2018-07-05 | 2018-12-11 | 深圳智锐通科技有限公司 | 跨多gpu芯片的视频拼接方法及装置 |
CN111246214A (zh) * | 2018-11-28 | 2020-06-05 | 杭州海康威视数字技术股份有限公司 | 一种视频解码方法、装置 |
CN111246214B (zh) * | 2018-11-28 | 2022-05-06 | 杭州海康威视数字技术股份有限公司 | 一种视频解码方法、装置 |
CN112069040A (zh) * | 2020-09-27 | 2020-12-11 | 山东云海国创云计算装备产业创新中心有限公司 | 一种硬盘点灯方法、装置及相关组件 |
CN112069040B (zh) * | 2020-09-27 | 2022-07-08 | 山东云海国创云计算装备产业创新中心有限公司 | 一种硬盘点灯方法、装置及相关组件 |
CN114339257A (zh) * | 2022-01-26 | 2022-04-12 | 稿定(厦门)科技有限公司 | 用于解码视频文件的方法及装置 |
CN114339257B (zh) * | 2022-01-26 | 2023-11-28 | 稿定(厦门)科技有限公司 | 用于解码视频文件的方法及装置 |
CN115209223A (zh) * | 2022-05-12 | 2022-10-18 | 广州方硅信息技术有限公司 | 视频编/解码的控制处理方法、装置、终端以及存储介质 |
CN115580735A (zh) * | 2022-12-08 | 2023-01-06 | 北京海誉动想科技股份有限公司 | 视频编解码处理与系统、编解码服务器与插件模块 |
Also Published As
Publication number | Publication date |
---|---|
CN105430408B (zh) | 2018-07-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105430408A (zh) | 一种基于Intel、AMD和Nvidia三平台的H264硬件解码系统 | |
CN110460858B (zh) | 信息处理装置和方法 | |
KR102577659B1 (ko) | 기본 스트림들로부터 디코딩된 비디오 콘텐츠를 디스플레이의 특성들에 적응시키기 위한 방법 및 디바이스 | |
CN104333808B (zh) | 用于Android及Linux智能电视机上的通用播放器 | |
CN105491387A (zh) | 一种基于Intel、AMD和Nvidia三平台的H264硬件编码系统 | |
CN1144434A (zh) | 视频解压缩方法和装置 | |
CN105163127A (zh) | 视频分析方法及装置 | |
CN104754349A (zh) | 硬解码音视频的方法及装置 | |
US9888247B2 (en) | Video coding using region of interest to omit skipped block information | |
CN109587546A (zh) | 视频处理方法、装置、电子设备和计算机可读介质 | |
CN115668937A (zh) | 为体积视频比特流和沉浸式视频比特流生成打包视频帧的方法、装置和制品 | |
US20180376180A1 (en) | Method and apparatus for metadata insertion pipeline for streaming media | |
US20230130807A1 (en) | Method for on-demand video editing at transcode-time in a video streaming system | |
US10154275B2 (en) | Systems and methods for embedding metadata into video contents | |
CN110769241B (zh) | 视频帧处理方法、装置、用户端及存储介质 | |
KR102280094B1 (ko) | 이미지/비디오 신호에 관련된 비트 스트림을 생성하기 위한 방법, 특정 정보 데이터를 포함하는 비트 스트림, 그와 같은 특정 정보 데이터를 획득하기 위한 방법 | |
US20220335976A1 (en) | System and method for rendering key and fill video streams for video processing | |
Haidous et al. | Content-adaptable ROI-aware video storage for power-quality scalable mobile streaming | |
CN115103215A (zh) | 直播的质检方法、系统、Web服务器及存储介质 | |
US20130286285A1 (en) | Method, apparatus and system for exchanging video data in parallel | |
Liu et al. | A HEVC steganography method based on QDCT coefficient | |
CN109495793B (zh) | 一种弹幕写入方法、装置、设备及介质 | |
US20190260817A1 (en) | Providing apparatus, data providing method, and storage medium | |
US7277100B2 (en) | Managing multi-component data | |
JP2022527882A (ja) | ポイントクラウドの処理 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |