我陷入了一种奇怪的行为,试图在仅ME模式下初始化NVENC。 OpenEncodeSessionEx()
总是失败并显示#15-"This indicates that an invalid struct version was used by the client."
参数结构如下:
NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS session_params = {
.version = NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER,
.deviceType = NV_ENC_DEVICE_TYPE_CUDA,
.device = ctx,
.reserved = 0,
.apiVersion = NVENCAPI_VERSION,
.reserved1 = 0,
.reserved2 = NULL
};
int ret = encOpenEncodeSessionEx(&session_params, &encoder->enc);
我试图从不同的C和Golang环境中调用它,但是无论如何我都会得到该错误。 NVENC样本的编码器刚刚崩溃(segfault)。解码器可以完美地工作,而编码器则不能。
有人知道,什么确切条件会导致错误#15-NV_ENC_ERR_INVALID_VERSION
?
我使用440.82驱动程序将Cuda升级到10.2-没运气。试图降级为Cuda 10.0-仍然相同。我使用1060ti
GPU。
[任何人请帮助我])
好吧,我终于明白了。
我真是太傻了,但是问题出在static
关键字(C语言)中。因此,我编写了简单的包装程序来调用NVENC函数,如下所示:
static NVENCSTATUS encOpenEncodeSessionEx(NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS *params, void **encoder) {
return nvenc_api.nvEncOpenEncodeSessionEx(params, encoder);
}
以这种方式使用它,总是会出现NV_ENC_ERR_INVALID_VERSION
错误。只需删除static
关键字,该功能即可正常工作。
我不知道,这是否是预期的行为,但是可以。谢谢大家。