接口说明
该接口是指令流服务端引擎正常运行所需要调用的外部
其中,视频编码接口调用的返回值定义如下:
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);
}
父主题: 指令流服务端引擎依赖的视频编码接口