2014-12-03 1102 views
3

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

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; 
} 
+1

NVENC不NVCUVENC,并NVENC无关与CUDA这些问题不应该与CUDA被标记 – 2014-12-03 15:35:28

+0

。 @RobertCrovella我完全同意关于特定问题的评论,但是“NVENC与CUDA无关”的说法并不完全正确 - 您可以使用CUDA浮动上下文句柄初始化NVENC(这意味着在NVENC中涉及一些CUDA API代码),颜色转换可以使用CUDA完成用作NVENC输入的Direct 3D表面上的ons。 – 2014-12-04 10:33:06

+0

用于NVENC的GPU hw资源与用于CUDA的GPU资源完全分离,并且API是正交的。是的,他们可以互操作,但是根据定义操纵NVENC功能并没有CUDA API,并且没有按定义操纵CUDA功能的NVENC API。无论如何,我的评论意见是,NVENC问题不应该被CUDA自动标记,这在这里似乎就是这种情况。 NVENC不是CUDA的一部分。感谢您提供此用户问题的答案。 – 2014-12-04 14:19:22

回答

1

您正在将错误的版本宏设置为SPS/PPS结构。我手头没有我的NVIDIA代码,所以我会尝试谷歌正确的宏,但拇指的规则是,每个结构都有一个特定的版本宏(对于SPS/PPS结构,您肯定使用了NV_ENC_INITIALIZE_PARAMS 。不对我承担的m_spspps类型为NV_ENC_SEQUENCE_PARAM_PAYLOAD所以,你应该这样初始化:

m_spspps.version = NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER; 
相关问题