---
title: 接口说明
description: "该接口是指令流服务端引擎正常运行所需要调用的外部 视频编码 接口。该接口由二次开发者实现，并以动态链接库的形式提供。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/230RC2/armnative/kunpengcpsinstruction_17_0018.html
sourcePath: /source/zh/kunpengboostkithistory/230RC2/armnative/kunpengcpsinstruction_17_0018.html
indexId: 9ad0d6fab9811ee6775a631d000d65d979ce0aef0cf675c9aefb0aa654800f7985
---
# 接口说明

该接口是指令流服务端引擎正常运行所需要调用的外部 视频编码 接口。该接口由二次开发者实现，并以动态链接库的形式提供。

其中，视频编码接口调用的返回值定义如下：

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