You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:44:56