中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

接口说明

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

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

enum class EncoderRetCode : uint32_t {
    VIDEO_ENCODER_SUCCESS         = 0x00,
    VIDEO_ENCODER_CREATE_FAIL     = 0x01,  // 创建编码器失败
    VIDEO_ENCODER_INIT_FAIL       = 0x02,  // 初始化编码器失败
    VIDEO_ENCODER_START_FAIL      = 0x03,  // 启动编码器失败
    VIDEO_ENCODER_ENCODE_FAIL     = 0x04,  // 编码失败
    VIDEO_ENCODER_STOP_FAIL       = 0x05,  // 停止编码器失败
    VIDEO_ENCODER_DESTROY_FAIL    = 0x06,  // 销毁编码器失败

};

编码器配置参数定义如下:

struct EncodeParam {
    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);
}
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词