【问题标题】:"NV_ENC_ERR_INVALID_VERSION" error while using nvenc encoder使用 nvenc 编码器时出现“NV_ENC_ERR_INVALID_VERSION”错误
【发布时间】:2015-01-31 17:22:00
【问题描述】:

我正在使用 cuda nvenc 编码器对 YUV 帧进行编码。我想使用 RTSP 流传输编码的 h264 数据。我需要 SPSPPS 缓冲区来执行 RTSP 流。我正在使用“nvEncGetSequenceParams”来获取 spspps 缓冲区。我在按预期调用“nvEncInitializeEncoder”函数后调用了这个函数。我收到“NV_ENC_ERR_INVALID_VERSION”错误,这意味着我将错误的结构传递给此函数。但我已经多次检查我通过的结构是正确的。我认为这可能是驱动程序版本问题。我有 Quadro k5000 GPU。我已经在驱动程序版本 331.82 和 337.88 上尝试过这个。以下是我正在使用的代码。

NVENCSTATUS CNvEncoderH264::GetSPSPPSBUffer(char *SPSPPSBuffer)
{

    NVENCSTATUS nvSta = NV_ENC_SUCCESS;
    uint32_t size = 0;

    //m_spspps is of type NV_ENC_SEQUENCE_PARAM_PAYLOAD
    m_spspps.inBufferSize = 512;
    m_spspps.outSPSPPSPayloadSize = &size;
    SET_VER(m_spspps, NV_ENC_INITIALIZE_PARAMS);

    m_spspps.spsppsBuffer = SPSPPSBuffer;

    nvSta = m_pEncodeAPI->nvEncGetSequenceParams(m_hEncoder,&m_spspps);
    return nvSta;
}

【问题讨论】:

  • NVENC 不是 NVCUVENC,NVENC 与 CUDA 无关。这些问题不应使用 CUDA 标记。
  • @RobertCrovella 我完全同意关于特定问题的评论,但是“NVENC 与 CUDA 无关”的说法并不完全正确 - 您可以使用 CUDA 浮动上下文句柄初始化 NVENC(意味着在 NVENC 代码中涉及一些 CUDA API),用作 NVENC 输入的 Direct 3D 表面上的颜色转换可以使用 CUDA 完成。
  • 用于 NVENC 的 GPU 硬件资源与用于 CUDA 的 GPU 硬件资源完全分开,并且 API 是正交的。是的,它们可以互操作,但是没有定义上操纵 NVENC 功能的 CUDA API,也没有定义上操纵 CUDA 功能的 NVENC API。无论如何,我的评论的重点是 NVENC 问题不应该自动标记为 CUDA,这就是这里的情况。 NVENC 不是 CUDA 的一部分。感谢您回答此用户的问题。

标签: encode nvidia


【解决方案1】:

您为 SPS/PPS 结构设置了错误的版本宏。我没有手动的 NVIDIA 代码,所以我会尝试用谷歌搜索正确的宏,但经验法则是每个结构都有一个特定版本的宏(你使用 NV_ENC_INITIALIZE_PARAMS 来表示 SPS/PPS 结构,这绝对是不对。我假设m_spspps 的类型是NV_ENC_SEQUENCE_PARAM_PAYLOAD。所以你应该像这样初始化它:

 m_spspps.version = NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER;

【讨论】:

    猜你喜欢
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2019-11-14
    相关资源
    最近更新 更多