Video_Codec_SDK_7.0.1
1、使用C:\Windows\SysWOW64\nvEncodeAPI.dll
2、nvStatus = m_pNvHWEncoder->ParseArguments(&encodeConfig, argc, argv);
首先分析配置参数,打开输入输出文件。
3、根据设备选择初始化
如:InitCuda(encodeConfig.deviceID);
4、初始化nvcodeApi
nvStatus = m_pNvHWEncoder->Initialize(m_pDevice, NV_ENC_DEVICE_TYPE_CUDA);
nvEncodeAPICreateInstance = (MYPROC)GetProcAddress(m_hinstLib, "NvEncodeAPICreateInstance");
此函数中调用nvStatus = nvEncodeAPICreateInstance(m_pEncodeAPI);
初始化了m_pEncodeAPI,API的调用
5、nvStatus = m_pNvHWEncoder->NvEncOpenEncodeSessionEx(device, deviceType);
开启一个编码任务,并返回一个编码句柄供后续函数使用
nvStatus = m_pEncodeAPI->nvEncOpenEncodeSessionEx(&openSessionExParams, &m_hEncoder);
NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS
NV_ENC_DEVICE_TYPE
6、确定编码GUID
m_pEncodeAPI->nvEncGetEncodeGUIDCount(m_hEncoder, encodeGUIDCount);
nvStatus = m_pEncodeAPI->nvEncGetEncodeGUIDs(m_hEncoder, GUIDs, guidArraySize, GUIDCount);
NV_ENC_PRESET_DEFAULT_GUID
NV_ENC_CODEC_H264_GUID
7、预置配置参数GUID
nvStatus = m_pEncodeAPI->nvEncGetEncodePresetCount(m_hEncoder, inputCodecGuid, &presetGUIDCount);
nvStatus = m_pEncodeAPI->nvEncGetEncodePresetGUIDs(m_hEncoder, inputCodecGuid, presetGUIDArray, presetGUIDCount, &presetGUIDArraySize);
nvStatus = m_pEncodeAPI->nvEncGetEncodePresetConfig(m_hEncoder, encodeGUID, presetGUID, presetConfig);
NV_ENC_PRESET_CONFIG
NV_ENC_CONFIG
8、
选择一个编码器配置文件
nvStatus = m_pEncodeAPI->nvEncGetEncodeProfileGUIDCount(m_hEncoder, encodeGUID, encodeProfileGUIDCount);
nvStatus = m_pEncodeAPI->nvEncGetEncodeProfileGUIDs(m_hEncoder, encodeGUID, profileGUIDs, guidArraySize, GUIDCount);
GUID
9、选择编码器所支持的格式
nvStatus = m_pEncodeAPI->nvEncGetInputFormatCount(m_hEncoder, encodeGUID, inputFmtCount);
nvStatus = m_pEncodeAPI->nvEncGetInputFormats(m_hEncoder, encodeGUID, inputFmts, inputFmtArraySize, inputFmtCount);
10、查询硬件所支持的编码特性
nvStatus = m_pEncodeAPI->nvEncGetEncodeCaps(m_hEncoder, encodeGUID, capsParam, capsVal);
NV_ENC_CAPS_PARAM
NV_ENC_CAPS
11、初始化硬件编码过程
nvStatus = m_pEncodeAPI->nvEncInitializeEncoder(m_hEncoder, &m_stCreateEncodeParams);
NV_ENC_INITIALIZE_PARAMS 编码uid 预置uid 同步异步模式
NV_ENC_CONFIG
NV_ENC_MV_PRECISION
NV_ENC_RC_PARAMS
NV_ENC_CODEC_CONFIG
NV_ENC_CONFIG_H264
NV_ENC_CONFIG_HEVC
12、申请输入输出缓冲
nvStatus = m_pEncodeAPI->nvEncCreateInputBuffer(m_hEncoder, &createInputBufferParams);
nvStatus = m_pEncodeAPI->nvEncCreateBitstreamBuffer(m_hEncoder, &createBitstreamBufferParams);
NV_ENC_PIC_PARAMS 设置当前帧的参赛
13、编码帧
nvStatus = m_pEncodeAPI->nvEncLockInputBuffer(m_hEncoder, &lockInputBufferParams);
nvStatus = m_pEncodeAPI->nvEncUnlockInputBuffer(m_hEncoder, inputBuffer);
nvStatus = m_pEncodeAPI->nvEncEncodePicture(m_hEncoder, &encPicParams);
nvStatus = m_pEncodeAPI->nvEncLockBitstream(m_hEncoder, lockBitstreamBufferParams);
nvStatus = m_pEncodeAPI->nvEncUnlockBitstream(m_hEncoder, bitstreamBuffer);
14、释放资源
nvStatus = m_pEncodeAPI->nvEncDestroyInputBuffer(m_hEncoder, inputBuffer);
nvStatus = m_pEncodeAPI->nvEncDestroyBitstreamBuffer(m_hEncoder, bitstreamBuffer);
nvStatus = m_pEncodeAPI->nvEncDestroyEncoder(m_hEncoder);