0

我遇到了一个奇怪的行为,试图在 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 样本的编码器刚刚崩溃(段错误)。解码器可以完美运行,而编码器则不能。

有谁知道,什么确切的条件可能会导致错误 #15 - NV_ENC_ERR_INVALID_VERSION

我使用 440.82 驱动程序将 Cuda 升级到 10.2 - 不走运。试图降级到 Cuda 10.0 - 还是一样。我使用1060tiGPU。

请任何人帮助我))

4

1 回答 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关键字,该功能就会按预期工作。

我不知道这是否是预期的行为,但它有效。谢谢大家。

于 2020-05-30T06:57:31.193 回答