Nvidia Codec SDK中nvEncOpenEncodeSessionEx()返回未知错误码15的问题
NVENC编码会话创建失败:状态码15及后续内存错误排查
我正在Visual C++中使用Nvidia Codec SDK搭建可接收D3D11纹理的NVENC编码会话,在调用nvEncOpenEncodeSessionEx()时返回状态码15,该值与已知错误码均不匹配,具体错误输出如下:
6 1 4 2 5 12 20 Error opening encode session! 15
截至出错位置的完整代码:
#include <iostream> #include <stdio.h> #include <windows.h> #pragma comment(lib, "d3d11") #include <d3d11.h> #pragma comment(lib, "dxgi") #include <dxgi1_2.h> #pragma comment(lib, "nvencodeapi.lib") #include "nvEncodeAPI.h" using namespace std; int main() { HRESULT HR; NVENCSTATUS NVS; // intermediate variables for casting IDXGIOutput* pDisplay_old; IDXGIFactory1* pFactory; IDXGIAdapter* pGPU; ID3D11Device* pD3D; IDXGIOutput1* pDisplay; // create DXGI factory HR = CreateDXGIFactory1(IID_PPV_ARGS(&pFactory)); if (HR != S_OK) { cout << "Error creating DXGI factory!"; return 1; } // create D3D11 device D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &pD3D, NULL, NULL); if (HR != S_OK) { cout << "Error creating D3D11 device!"; return 1; } // get GPU adapter HR = pFactory->EnumAdapters(0, &pGPU); if (HR != S_OK) { cout << "Error querying GPU!"; return 1; } // get display HR = pGPU->EnumOutputs(0, &pDisplay_old) != S_OK; if (HR != S_OK) { cout << "Error querying display!"; return 1; } pDisplay_old->QueryInterface(&pDisplay); // retrieve list of nvenc functions NV_ENCODE_API_FUNCTION_LIST NvEnc; NV_ENCODE_API_FUNCTION_LIST* pNvEnc = &NvEnc; NVS = NvEncodeAPICreateInstance(pNvEnc); if (NVS != NV_ENC_SUCCESS) { cout << "Error initializing NVENC API!"; return 1; } void* encoder = NULL; cout << NV_ENC_ERR_INVALID_PTR << "\n"; cout << NV_ENC_ERR_NO_ENCODE_DEVICE << "\n"; cout << NV_ENC_ERR_INVALID_DEVICE << "\n"; cout << NV_ENC_ERR_UNSUPPORTED_DEVICE << "\n"; cout << NV_ENC_ERR_DEVICE_NOT_EXIST << "\n"; cout << NV_ENC_ERR_UNSUPPORTED_PARAM << "\n"; cout << NV_ENC_ERR_GENERIC << "\n"; // start nvenc encode session NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS encode_session_params = { 0 }; encode_session_params.version = NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER; encode_session_params.apiVersion = NVENCAPI_VERSION; encode_session_params.reserved = NULL; encode_session_params.deviceType = NV_ENC_DEVICE_TYPE_DIRECTX; encode_session_params.device = (void*)pD3D; NVS = pNvEnc->nvEncOpenEncodeSessionEx(&encode_session_params, &encoder); if (NVS != NV_ENC_SUCCESS) { cout << "Error opening encode session! " << NVS; return 1; } NV_ENC_INITIALIZE_PARAMS initialize_params = { 0 }; initialize_params.version = NV_ENC_INITIALIZE_PARAMS_VER; initialize_params.encodeGUID = NV_ENC_CODEC_HEVC_GUID; initialize_params.encodeWidth = 1920; initialize_params.encodeHeight = 1080; initialize_params.frameRateNum = 60; initialize_params.enableEncodeAsync = 0; initialize_params.enablePTD = 0; initialize_params.enableOutputInVidmem = 0; NVS = pNvEnc->nvEncInitializeEncoder((void*)pNvEnc, &initialize_params); if (NVS != NV_ENC_SUCCESS) { cout << "Error creating encoder!"; return 1; } }
因找不到优质API文档,借助ChatGPT编写代码,但细节回答模糊不一致,打印已知错误码是主要排查手段。
更新内容
通过查看nvEncOpenEncodeSessionEx()和NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS的官方签名,补全了所有参数,修改后的代码片段如下:
void* pEncoder = NULL; // start nvenc encode session NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS encode_session_params = {}; encode_session_params.version = NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER; encode_session_params.deviceType = NV_ENC_DEVICE_TYPE_DIRECTX; encode_session_params.device = pD3D; encode_session_params.reserved = 0; encode_session_params.apiVersion = NVENCAPI_VERSION; encode_session_params.reserved1[253] = 0; encode_session_params.reserved2[64] = NULL; NVS = pNvEnc->nvEncOpenEncodeSessionEx(&encode_session_params, &pEncoder); if (NVS != NV_ENC_SUCCESS) { cout << "Error opening encode session! " << NVS; return 1; }
但修改后引发新的内存访问违例错误:
原问题未解决,还出现了新问题。
内容的提问来源于stack exchange,提问作者Tiger Yang
相关产品推荐
相关产品推荐

