仅NVENC ME模式OpenEncodeSessionEx()失败,并出现“无效的结构版本”错误

问题描述 投票:0回答:1

我陷入了一种奇怪的行为,试图在仅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。

[任何人请帮助我])

nvidia opticalflow nvenc
1个回答
0
投票

好吧,我终于明白了。

我真是太傻了,但是问题出在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关键字,该功能即可正常工作。

我不知道,这是否是预期的行为,但是可以。谢谢大家。

© www.soinside.com 2019 - 2024. All rights reserved.