在我之前写的一篇文章《SkeyeRTSPLive传统视频监控互联网+实现利器解决方案》中提到RTSP转RTMP的转流过程,简化流程就是通过SkeyeRTSPClient拉RTSP流,获取音视频编码数据,然后再通过SkeyeRTMPPusher推出去,流程非常简单;然后再实际开发过程中,我们发现其实这个过程并没有想象中那么简单;首先,RTSP协议支持多种音视频编码格式,如音频支持AAC,G711,G726,等,视频支持H264,H625,MJPEG, MPEG等等各种格式,而SkeyeRTMP推流只支持H264(已扩展支持H265)格式,这时,音频我们可以通过SkeyeAACEncoder将音频转码成AAC格式,而视频我们可以通过SkeyeVideoDecoder解码成原始数据,然后再通过SkeyeVideoEncoder将原始数据转码成RTMP推送指定的格式,本文,我们将重点讲述SkeyeVideoDecoder基于Intel硬解码库的硬解码流程。
SkeyeVideoDecoder基于Intel硬解码库SkeyeIntelHardDecoder
SkeyeIntelHardDecoder库是基于Intel主板集成显卡的硬件解码程序,内部进行解码采用D3D进行显示,其解码效率比ffmpeg软件解码效率提到至少5-6倍;
1. 接口声明如下:
// Intel Media Hardware Codec SDK Interface [8/17/2016 SwordTwelve]
#ifndef INTELHARDCODEC_INTERFACE_H
#define INTELHARDCODEC_INTERFACE_H
#ifdef __cplusplus
#define HARDCODEC_MAKEFOURCC(A,B,C,D) ((((int)A))+(((int)B)<<8)+(((int)C)<<16)+(((int)D)<<24))
/* Hardware Codec FourCC */
typedef enum tagINTELHARDCODEC_FORMAT{
HARDCODEC_FOURCC_NV12 = HARDCODEC_MAKEFOURCC('N','V','1','2'), /* Native Format */
HARDCODEC_FOURCC_YV12 = HARDCODEC_MAKEFOURCC('Y','V','1','2'),
HARDCODEC_FOURCC_YUY2 = HARDCODEC_MAKEFOURCC('Y','U','Y','2'),
HARDCODEC_FOURCC_RGB3 = HARDCODEC_MAKEFOURCC('R','G','B','3'), /* RGB24 */
HARDCODEC_FOURCC_RGB4 = HARDCODEC_MAKEFOURCC('R','G','B','4'), /* RGB32 */
HARDCODEC_FOURCC_P8 = 41, /* D3DFMT_P8 */
HARDCODEC_FOURCC_P8_TEXTURE = HARDCODEC_MAKEFOURCC('P','8','M','B')
}INTELHARDCODEC_FORMAT;
class SkeyeIntelHardDecoder_Interface
{
//导出接口
public:
public: //DLL 接口
virtual int WINAPI Init(HWND hWnd, bool bDxv2Show, bool bShowToScale, int mode =