接口说明
该接口是指令流服务端引擎正常运行所需要调用的外部
其中,视频编码接口调用的返回值定义如下:
enum VmiEncoderRetCode : uint32_t { VMI_ENCODER_SUCCESS = 0x00, VMI_ENCODER_CREATE_FAIL = 0x01, // 创建编码器失败 VMI_ENCODER_INIT_FAIL = 0x02, // 初始化编码器失败 VMI_ENCODER_START_FAIL = 0x03, // 启动编码器失败 VMI_ENCODER_ENCODE_FAIL = 0x04, // 编码失败 VMI_ENCODER_STOP_FAIL = 0x05, // 停止编码器失败 VMI_ENCODER_DESTROY_FAIL = 0x06, // 销毁编码器失败 VMI_ENCODER_REGISTER_FAIL = 0x07 // 注册函数失败 };
编码器配置参数定义如下:
struct VmiEncodeParams { uint32_t width = 0; // 编码输入/输出宽度 uint32_t height = 0; // 编码输入/输出高度 uint32_t frameRate = 0; // 编码输入帧率 uint32_t bitrate = 0; // 编码输出码率 };
调用示例
// 函数原型声明,定义实现由客户提供 const std::string VENC_SHARED_LIB_NAME = "libVideoEncoder.so"; using VencCreateEncoderFunc = EncoderRetCode (*)(uint32_t *encHandle); using VencInitEncoderFunc = EncoderRetCode (*)(uint32_t encHandle, const EncodeParam encParams); using VencStartEncoderFunc = EncoderRetCode (*)(uint32_t encHandle); using VencEncodeOneFrameFunc = EncoderRetCode (*)(uint32_t encHandle, const uint8_t *inputData, uint32_t inputSize, uint8_t **outputData, uint32_t *outputSize); using VencStopEncoderFunc = EncoderRetCode (*)(uint32_t encHandle); using VencDestroyEncoderFunc = EncoderRetCode (*)(uint32_t encHandle); void Test() { // 动态加载视频编码动态库的函数符号 void *handle = dlopen(VENC_SHARED_LIB_NAME.c_str(), RTLD_NOW); VencCreateEncoderFunc createEncoder = reinterpret_cast<VencCreateEncoderFunc>(dlsym(handle, VENC_CREATE_ENCODER_STR.c_str())); VencInitEncoderFunc initEncoder = reinterpret_cast<VencInitEncoderFunc>(dlsym(handle, VENC_CREATE_ENCODER_STR.c_str())); VencStartEncoderFunc startEncoder = reinterpret_cast<VencStartEncoderFunc>(dlsym(handle, VENC_CREATE_ENCODER_STR.c_str())); VencEncodeOneFrameFunc encodeOneFrame = reinterpret_cast<VencEncodeOneFrameFunc>(dlsym(handle, VENC_CREATE_ENCODER_STR.c_str())); VencStopEncoderFunc stopEncoder = reinterpret_cast<VencStopEncoderFunc>(dlsym(handle, VENC_CREATE_ENCODER_STR.c_str())); VencDestroyEncoderFunc destroyEncoder = reinterpret_cast<VencDestroyEncoderFunc>(dlsym(handle, VENC_CREATE_ENCODER_STR.c_str())); // 创建编码器 uint32_t encHandle = 0; EncoderRetCode ret = createEncoder(&encHandle); if (ret != VIDEO_ENCODER_SUCCESS) { //若创建编码器失败,进行出错处理 } // 初始化编码器 EncodeParam param = { .width = ..., .height = ..., .frameRate = ..., .bitrate = ... }; EncoderRetCode ret = initEncoder(encHandle, param); if (ret != VIDEO_ENCODER_SUCCESS) { //若初始化编码器失败,进行出错处理 } // 启动编码器 EncoderRetCode ret = startEncoder(encHandle); if (ret != VIDEO_ENCODER_SUCCESS) { //若启动编码器失败,进行出错处理 } // 编码一帧数据 uint8_t *inputData = ...; uint32_t inputSize = ...; uint8_t *outputData = nullptr; uint32_t outputSize = 0; EncoderRetCode ret = encodeOneFrame(encHandle, inputData, inputSize, &outputData, &outputSize); if (ret != VIDEO_ENCODER_SUCCESS) { //若编码一帧数据失败,进行出错处理 } // 停止编码器 EncoderRetCode ret = stopEncoder(encHandle); if (ret != VIDEO_ENCODER_SUCCESS) { //若停止编码器失败,进行出错处理 } // 销毁编码器 EncoderRetCode ret = destroyEncoder(encHandle); if (ret != VIDEO_ENCODER_SUCCESS) { //若销毁编码器失败,进行出错处理 } dlclose(handle); }
父主题: 指令流服务端引擎依赖的视频编码接口