具有 HVEC 的 Nvidia NvEnc 导致 Div 为零

Nvidia NvEnc with HVEC causes Div by Zero

我正在尝试使用 Nvidias NvEnc API 构建硬件编码器。此 API 提供了两种编解码器的使用来对任何给定数据进行编码:H264 和 HEVC。 所以首先必须选择两个代码之一,然后配置编码会话或使用各种预设之一。我正在按照 Nvidias NvEnc Programming Guide 中的描述进行操作。

我在使用 HVEC 编解码器时有以下代码导致问题:

//Create Init Params
InitParams* ip = new InitParams();

ip->encodeGUID = m_encoderGuid; //encoder GUID is either H264 or HEVC
ip->encodeWidth = width;
ip->encodeHeight = height;
ip->version = NV_ENC_INITIALIZE_PARAMS_VER;
ip->presetGUID = m_presetGuid; //One of the presets
ip->encodeConfig = NULL; //If using preset, further config should be set to NULL

//Async Encode
ip->enableEncodeAsync = 1;

//Send the InputBuffer in Display Order
ip->enablePTD = 1;

//Causing Div by Zero error if used with HEVC GUID:
CheckApiError(m_apiFunctions.nvEncInitializeEncoder(m_Encoder, ip));

所以问题又来了:我使用的是 H264 GUID,一切都在运行。如果我使用 HEVC,我会得到 Div 的零...我不会从 api 调用中得到一些错误代码,只是一个普通的 div 零错误。 所以我的问题是:HEVC 是否需要我没有通过使用预设提供的更多信息?如果有,是什么信息?

非常感谢!

编辑:已解决。编程指南没有说明必须设置这些字段,但是 NV_ENC_INITIALIZE_PARAMSframeRateNum 组成frameRateDen 导致 div 为零...不知道为什么在使用 H264 时不会发生这种情况。有人可能会关闭这个..

这就是我根据 NVidias 编程指南所做的配置。如上所述,不提供 frameRateNum 和 frameRateDen 的值会导致 Div by Zero 错误,尤其是在初始 memset 之后。

//Create Init Params
InitParams* ip = new InitParams();
m_initParams = ip;
memset(ip, 0, sizeof(InitParams));

//Set Struct Version
ip->version = NV_ENC_INITIALIZE_PARAMS_VER;

//Used Codec
ip->encodeGUID = m_encoderGuid;

//Size of the frames
ip->encodeWidth = width;
ip->encodeHeight = height;

//Set to 0, no dynamic resolution changes!
ip->maxEncodeWidth = 0;
ip->maxEncodeHeight = 0;

//Aspect Ratio
ip->darWidth = width;
ip->darHeight = height;

// Frame rate
ip->frameRateNum = 60;
ip->frameRateDen = 1;

//Misc
ip->reportSliceOffsets = 0;
ip->enableSubFrameWrite = 0;

//Preset GUID
ip->presetGUID = m_presetGuid;

//Apply Preset
NV_ENC_PRESET_CONFIG presetCfg;
memset(&presetCfg, 0, sizeof(NV_ENC_PRESET_CONFIG));
presetCfg.version = NV_ENC_PRESET_CONFIG_VER;
presetCfg.presetCfg.version = NV_ENC_CONFIG_VER;
CheckApiError(m_apiFunctions.nvEncGetEncodePresetConfig(m_Encoder,
    m_encoderGuid, m_presetGuid, &presetCfg));
// Copy the Preset Config to member var
memcpy(&m_encodingConfig, &presetCfg.presetCfg, sizeof(NV_ENC_CONFIG));
/************************************************************************/
/* Room for Config Adjustments                                          */
/************************************************************************/

//Set Init configs encoding config
ip->encodeConfig = &m_encodingConfig;

//Async Encode!
ip->enableEncodeAsync = 1;

//Send the InputBuffer in Display Order
ip->enablePTD = 1;


CheckApiError(m_apiFunctions.nvEncInitializeEncoder(m_Encoder, ip));