SkeyeRTSPLive高效转码之SkeyeVideoEncoder高效硬件编码解决方案(附源码)

在之前的《SkeyeRTSPLive高效转码之SkeyeVideoDecoder高效解码》系列文章中我们已经将视频解码成了原始图像数据(YUV/RGB),然后根据不同的转码需求进行编码。如视频分辨率缩放,调整码率,多码率输出等;为了解决转码过程中编码高分辨率高质量或者高压缩率(如H265)耗时的问题,我们采用Nvidia硬件驱动编码器进行编码,以追求最高效率的转码和最低的推送延迟。

SkeyeVideoEncoder基Nvidia独立显卡的硬件编码库SkeyeNvEncoder
1. 接口声明如下:
class SkeyeNvEncoder
{
public:
	//codec: 编码格式 0=h264, 1=h265/hevc
	int InitNvEncoder(int width,int height,int fps=25, int bitrate=4096, int gop=50, int qp=28, int rcMode=/*NV_ENC_PARAMS_RC_2_PASS_QUALITY*/NV_ENC_PARAMS_RC_CONSTQP, 
		char* encoderPreset = "Default", int codec = 0,int nDeviceType=0, int nDeviceID=0 );
		
	//H264获取SPS和PPS	
	int GetSPSAndPPS(unsigned char*sps,long&spslen,unsigned char*pps,long&ppslen);
	
	//H265获取VPS,SPS和PPS	
	int GetH265VPSSPSAndPPS(unsigned char*vps, long&vpslen, unsigned char*sps, long&spslen, unsigned char*pps, long&ppslen);

	// 编码InputFormat我们固定为YUV420PL(I420),可修改为NV12, YUY2 等等在Init()时进行格式转换, [12/18/2016 dingshuai]
	unsigned char* NvEncodeSync(unsigned char* pYUV420, int inLenth, int& outLenth, bool& bKeyFrame);

	//关闭编码器,停止编码
	int CloseNvEncoder();
};
2. SkeyeNvEncoder编码库调用流程
  • 第一步,初始化编码器及其参数
//初始化编码器参数
int InitNvEncoder(int width,int height,int fps, int bitrate, int gop,  
	int qp, int rcMode,  char* encoderPreset , int codec, int nDeviceType, int nDeviceID)
{
	//初始化设置参数 -- Start
	memset(&m_encodeConfig, 0, sizeof(EncodeConfig));
	m_encodeConfig.width = width;
	m_encodeConfig.height = height;
	m_nVArea = width*height;
	m_nCheckyuvsize = m_nVArea*3/2;

	//编码器识别的码率是bps, 但是我们输入的是kbps, so*1024
	m_encodeConfig.bitrate = bitrate*1024;

	//多通道编码优化图像质量只有在低延迟模式下工作(LOW_LATENCY)
	m_encodeConfig.rcMode = rcMode;//NV_ENC_PARAMS_RC_2_PASS_QUALITY

	m_encodeConfig.encoderPreset = encoderPreset;	//NV_ENC_PARAMS_RC_2_PASS_QUALITY;
	//默认指定低延时模式以及图像的压缩格式(HQ,HP,LOSSLESS ......)
	m_encodeConfig.presetGUID = NV_ENC_PRESET_LOW_LATENCY_HQ_GUID;

	// I帧间隔 [12/16/2016 dingshuai]
	m_encodeConfig.gopLength = gop;//NVENC_INFINITE_GOPLENGTH;

	//CUDA 
	m_encodeConfig.deviceType = nDeviceType;
	m_encodeConfig.deviceID = nDeviceID;

	m_encodeConfig.codec =  codec;//NV_ENC_H264;
	m_encodeConfig.fps = fps;
	m_encodeConfig.qp = qp;
	m_encodeConfig.i_quant_factor = DEFAULT_I_QFACTOR;
	m_encodeConfig.b_quant_factor = DEFAULT_B_QFACTOR;  
	m_encodeConfig.i_quant_offset = DEFAULT_I_QOFFSET;
	m_encodeConfig.b_quant_offset = DEFAULT_B_QOFFSET; 

	m_encodeConfig.pictur
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwordTwelve

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值