我正在使用 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;
}
最佳答案
您正在为 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;
关于encode - 使用 nvenc 编码器时出现 "NV_ENC_ERR_INVALID_VERSION"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27266767/