NVIDIA VIDEO ENCODER(NVENC)7.0.1 SDK 编码流程 学习笔记

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);



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值