GTX 1660Ti用NVENC编码YUV444时2560*1440分辨率报NV_ENC_ERR_INVALID_PARAM
针对你遇到的GTX 1660Ti使用video-sdk-samples进行HEVC YUV444编码时,1920×1080和3840×2160正常,但2560×1440报错NV_ENC_ERR_INVALID_PARAM的问题,结合NVENC特性和你的代码,给出以下核心排查方向:
编码器初始化与编码分辨率不匹配
NVENC要求编码器初始化阶段(调用nvEncInitializeEncoder)设置的encodeWidth和encodeHeight,必须与编码时NV_ENC_PIC_PARAMS中的inputWidth/inputHeight完全一致。如果代码在切换分辨率时没有重新初始化编码器(比如用1080P初始化后直接切2K),就会触发参数错误。检查初始化逻辑,确保每次分辨率变更都重新创建并初始化编码器实例。输入分辨率的对齐验证
虽然2560×1440看似符合NVENC基本对齐要求(宽度为32的倍数、高度为16的倍数),但需确认GetEncodeWidth()和GetEncodeHeight()返回的数值是否准确。可以在报错前增加日志打印这两个值,排查是否存在数值被意外修改、截断的情况。另外,部分显卡对YUV444格式的HEVC编码可能有更严格的对齐要求(比如高度也需要是32的倍数),可以尝试将1440调整为1472(32×46)做测试,验证是否能正常编码。输入缓冲区的Stride(行步长)错误
YUV444格式下,每个颜色分量(Y/U/V)的行步长必须满足NVENC的对齐要求(通常为32字节的倍数)。如果输入缓冲区是自行分配的而非通过nvEncCreateInputBuffer创建,很可能存在stride不符合要求的情况。建议改用NVENC提供的缓冲区创建接口,确保返回的pitch值符合标准;若必须自行分配,计算stride时要向上取整到32的倍数。SDK或驱动版本兼容性问题
旧版本的NVIDIA Video SDK或显卡驱动可能对2560×1440分辨率的YUV444 HEVC编码存在兼容性bug。尝试更新到最新的NVIDIA Video SDK(至少12.x以上版本)和显卡稳定版驱动,再重新测试。
你的相关代码片段:
void NvEncoder::DoEncode(NV_ENC_INPUT_PTR inputBuffer, std::vector<bool> &vKeyFrame, std::vector<std::vector<uint8_t>> &vPacket, NV_ENC_PIC_PARAMS *pPicParams) { NV_ENC_PIC_PARAMS picParams = {}; if (pPicParams) { picParams = *pPicParams; } picParams.version = NV_ENC_PIC_PARAMS_VER; picParams.pictureStruct = NV_ENC_PIC_STRUCT_FRAME; picParams.inputBuffer = inputBuffer; picParams.bufferFmt = GetPixelFormat(); picParams.inputWidth = GetEncodeWidth(); picParams.inputHeight = GetEncodeHeight(); picParams.outputBitstream = m_vBitstreamOutputBuffer[m_iToSend % m_nEncoderBuffer]; picParams.completionEvent = m_vpCompletionEvent[m_iToSend % m_nEncoderBuffer]; NVENCSTATUS nvStatus = m_nvenc.nvEncEncodePicture(m_hEncoder, &picParams); if (nvStatus == NV_ENC_SUCCESS || nvStatus == NV_ENC_ERR_NEED_MORE_INPUT) { m_iToSend++; GetEncodedPacket(m_vBitstreamOutputBuffer, vKeyFrame, vPacket, false); } else { printf("picParams.inputWidth = %d,picParams.inputHeight = %d\n", picParams.inputWidth, picParams.inputHeight); NVENC_THROW_ERROR("nvEncEncodePicture API failed", nvStatus); } }
错误信息:
nvEncEncodePicture Prompt Error:NV_ENC_ERR_INVALID_PARAM
内容的提问来源于stack exchange,提问作者Travis990

