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

接口说明

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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,  // 销毁编码器失败

};

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

1
2
3
4
5
6
struct EncodeParam {
    uint32_t width     = 0;  // 编码输入/输出宽度
    uint32_t height    = 0;  // 编码输入/输出高度
    uint32_t frameRate = 0;  // 编码输入帧率
    uint32_t bitrate   = 0;  // 编码输出码率
};

调用示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// 函数原型声明,定义实现由客户提供 
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);
}