我正在使用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;
}
答案 0 :(得分:1)
您正在为SPS / PPS结构设置错误的版本宏。我没有手动获取我的NVIDIA代码,所以我会尝试使用Google正确的宏,但拇指的规则是每个结构都有一个特定的版本宏(你使用的是NV_ENC_INITIALIZE_PARAMS用于SPS / PPS绝对不正确的结构。我假设m_spspps
的类型是NV_ENC_SEQUENCE_PARAM_PAYLOAD
。所以你应该像这样初始化它:
m_spspps.version = NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER;