2020-08-18
linux arm nvidia硬编码
1.首先https://developer.nvidia.com/nvidia-video-codec-sdk下载最新的nvidia codec
aarch64里找到对应的库libnvcuvid.so libnvidia-encode.so
这些库可以像静态链接库一样加载 并不需要dlopen等函数进行动库加载
2.因为在linux版本下都是使用cuda进行编解码
所以需要安装cuda
在nvidia官网下载对应的cuda版本:cuda-11.0
安装后配置库目录为:/usr/local/cuda-11.0/lib64 以及/usr/local/cuda-11.0/lib64/stubs
分别对应以下2个库 cuda cudart
3.之后将video-codec-sdk中的sample打开 引入
其中crc.cu 是cuda 的语法的源文件 要编译需使用nvcc进行编译
将crc编译成为静态库 之后加载即可
例如:
nvcc -lib test1.cu -o libtestcu.a
对应的就是 nvcc -lib crc.cu -o libcrc.a 就会生成出静态库
5.调整传入的参数
AppEncCuda中的参数是命令行传入
所以需要自行设置一些参数
首先是输入视频的宽高 ,视频的格式,以及编码之后的视频流格式(h264,h265等)
而AppEncCuda代码中有一个NV_ENC_INITIALIZE_PARAMS initializeParams 需要特别注意
因为传参数并没有文档说明
那么大部分我们需要默认参数
那么initializeParams.encodeConfig则可以通过nvidia的api预处理
代码如下:
NV_ENCODE_API_FUNCTION_LIST API;
void* encoder;
NV_ENC_PRESET_CONFIG encodepreset;
//NV_ENC_RECONFIGURE_PARAMS
memset(&encodepreset, 0, sizeof(NV_ENC_PRESET_CONFIG));
encodepreset.version = NV_ENC_PRESET_CONFIG_VER;
encodepreset.presetCfg.version = NV_ENC_CONFIG_VER;
NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS encodeSessionExParams = { NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER };
encodeSessionExParams.device = NvEncC::getInstance()->getContext();
encodeSessionExParams.deviceType = NV_ENC_DEVICE_TYPE_CUDA;
encodeSessionExParams.apiVersion = NVENCAPI_VERSION;
API = { NV_ENCODE_API_FUNCTION_LIST_VER };
NVENC_API_CALL(NvEncodeAPICreateInstance(&API));
API.nvEncOpenEncodeSessionEx(&encodeSessionExParams, &encoder);
NVENCSTATUS nvStatus = API.nvEncGetEncodePresetConfig(encoder, NvEncC::getInstance()->getGuidCodeC(), NvEncC::getInstance()->getGuidPreset(), &encodepreset);
memcpy(&encodeConfig, &encodepreset.presetCfg, sizeof(NV_ENC_CONFIG));
如此一来encodeConfig就可以获取nvdia的预处理值了。
6.需要注意的点
NVENC_API_CALL(m_nvenc.nvEncInitializeEncoder(m_hEncoder, &m_initializeParams));
如果返回的是8
那么传递的参数有误
需要修改对应的参数