在我之前写的一篇文章《SkeyeRTSPLive传统视频监控互联网+实现利器解决方案》中提到RTSP转RTMP的转流过程,简化流程就是通过SkeyeRTSPClient拉RTSP流,获取音视频编码数据,然后再通过SkeyeRTMPPusher推出去,流程非常简单;然后再实际开发过程中,我们发现其实这个过程并没有想象中那么简单;首先,RTSP协议支持多种音视频编码格式,如音频支持AAC,G711,G726,等,视频支持H264,H625,MJPEG, MPEG等等各种格式,而SkeyeRTMPPusher推流只支持H264(已扩展支持H265)格式,这时,音频我们可以通过SkeyeAACEncoder将音频转码成AAC格式,而视频我们可以通过SkeyeVideoDecoder解码成原始数据,然后再通过SkeyeVideoEncoder将原始数据转码成RTMP推送指定的格式,本文,我们将重点讲述SkeyeVideoDecoder基于Nvidia(英伟达)独立显卡的解码流程。
SkeyeVideoDecoder基Nvidia独立显卡的硬解码库SkeyeNvDecoder
SkeyeNvDecoder库是基于Nvidia独立显卡驱动的硬件解码程序,该解码程序效率非常高效且具有强大的并行解码效能力,其解码效率比ffmpeg软件解码效率提到至少5-6倍,最新的RTX系列显卡其解码效率甚至比软解码高10-12倍,轻松解码多路4K乃至8K高清视频无压力,本文采用的是截止目前(20190714)最新的显卡驱动,CUDA版本需要10.0或者以上版本支持。
1. 接口声明如下:
#ifndef SKEYENVDECODERAPI_H
#define SKEYENVDECODERAPI_H
#include <string>
//++ typedefine start
#ifndef SKEYENVDECODER_HANDLE
#define SKEYENVDECODER_HANDLE void*
#endif//SKEYENVDECODER_HANDLE
typedef enum _OutputFormat //native=默认解码器输出为NV12格式
{
native = 0, bgrp, rgbp, bgra, rgba, bgra64, rgba64
}OutputFormat;
typedef enum _SKEYENvDecoder_CodecType {
SKEYENvDecoder_Codec_MPEG1 = 0, /**< MPEG1 */
SKEYENvDecoder_Codec_MPEG2, /**< MPEG2 */
SKEYENvDecoder_Codec_MPEG4, /**< MPEG4 */
SKEYENvDecoder_Codec_VC1, /**< VC1 */
SKEYENvDecoder_Codec_H264, /**< H264 */
SKEYENvDecoder_Codec_JPEG, /**< JPEG */
SKEYENvDecoder_Codec_H264_SVC, /**< H264-SVC */
SKEYENvDecoder_Codec_H264_MVC, /**< H264-MVC */
SKEYENvDecoder_Codec_HEVC, /**< HEVC */
SKEYENvDecoder_Codec_VP8, /**< VP8 */
SKEYENvDecoder_Codec_VP9, /**< VP9 */
SKEYENvDecoder_Codec_NumCodecs, /**< Max codecs */
} SKEYENvDecoder_CodecType;
typedef enum _SKEYENvDecoder_YUVType {
// Uncompressed YUV
SKEYENvDecoder_YUV420 = (('I' << 24) | ('Y' << 16) | ('U' << 8) | ('V')), /**< Y,U,V (4:2:0) */
SKEYENvDecoder_YV12 = (('Y' << 24) | ('V' << 16) | ('1' << 8) | ('2')), /**< Y,V,U (4:2:0) */
SKEYENvDecoder_NV12 = (('N' << 24) | ('V' << 16) | ('1' &l