文档
注册

视频编码

功能介绍

通过构造VideoEncoder类实例可实现视频编码功能,编码功能配置项及各项约束与支持情况请参考MindX SDK mxVision 用户指南的“VideoEncodeConfig”章节中的数据结构说明。

视频编码支持自定义输出数据格式,通过自定义回调函数传入编码功能配置项,方便用户使用编码后的数据,详情可参考MindX SDK mxVision 用户指南的“VideoEncodeCallBack”章节。

接口调用流程

首先根据需求定义需要的输出数据组合方式,根据组合方式参考VideoEncodeCallBack定义回调函数传入编码功能配置项,然后实例化VideoEncoder类,最后调用Encode成员函数完成编码,获取数据。

视频编码接口调用流程参考如下:

图1 视频编码接口调用流程

mxVision提供VideoEncoder类进行视频编码,关键步骤说明如下:

  1. 调用MxInit()接口进行全局初始化。
  2. 定义输出数据组合形式。
    • 输出数据包含视频帧编码后得到的的Image类数据、当前编码帧的“frameId”和通道“channelId”
    • 根据需要选择获取以上哪些数据。
  3. 定义输出回调函数。
    • 根据要获取的数据定义回调函数,在函数内组装自定义数据。
    • 回调函数输入参数固定为VideoEncodeCallBack形式,函数内可选择输出。

      请勿在回调函数内实现过于复杂的操作,建议使用自定义“userData”来接收视频编码回调结果,否则回调线程会发生卡住的现象,导致视频编码速度变慢。

  4. 构造视频编码配置项。

    配置项及各项约束与支持情况请参考VideoEncodeConfig数据结构说明。

  5. 实例化视频编码类。

    将配置好的VideoEncodeConfig传入构造函数接口,实例化视频编码类。

  6. 调用MxDeInit()接口对初始化的全局资源进行去初始化。

示例代码

如下提供关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
// 初始化
MxBase::MxInit();
{
    // 定义要接收的编码数据
    struct FrameImage {
        Image image;                 // Video Image Class
        uint32_t frameId = 0;        // Video Frame Index
        uint32_t channelId = 0;      // Video Channel Index
    };

    // 定义获取编码数据到自定义结构的回调函数
    APP_ERROR CallBackVenc(std::shared_ptr<uint8_t>& outDataPtr, uint32_t& outDataSize, uint32_t& channelId,
                           uint32_t& frameId, void* userData)
    {
        Image image(outDataPtr, outDataSize, -1, Size(1920, 1080));
        FrameImage* encodedVec = static_cast<FrameImage*>(userData);
        FrameImage frameImage;
        encodedVec.image = image;
        encodedVec.channelId = channelId;
        encodedVec.frameId = frameId;
        return APP_ERR_OK;
    }
    // 构造编码配置项
    MxBase::VideoEncodeConfig vEncodeConfig;
    VideoEncodeCallBack cPtr2 = CallBackVenc;
    vEncodeConfig.callbackFunc = cPtr2;
    vEncodeConfig.width = 1920;
    vEncodeConfig.height = 1080;
    vEncodeConfig.keyFrameInterval = 1;
    vEncodeConfig.srcRate = 30;
    vEncodeConfig.rcMode = 1;
    vEncodeConfig.maxBitRate = 30000;
    vEncodeConfig.ipProp = 70;
    vEncodeConfig.displayRate = 40;  // [1, 120]
    vEncodeConfig.rcMode = 0;  // cbr 0或1, vbr 2, avbr 3, qvbr 4, cvbr 5
    vEncodeConfig.sceneMode = 0;  // 0 摄像机不运动或周期性连续运动的场景,支持h.264/h.265, 1, 高码率下运动场景,支持h.265
    vEncodeConfig.shortTermStatsTime = 40; // 码率短期统计时间,以秒为单位 取值范围:[1, 120]。rcMode=5时生效
    vEncodeConfig.longTermStatsTime = 240;  // 码率长期统计时间,默认为分钟。取值范围:[1, 1440]。rcMode=5时生效
    vEncodeConfig.longTermMaxBitRate = 200;  // 编码器输出长期最大码率,以kbps为单位。取值范围:[2, max_bit_rate]。rcMode=5时生效
    vEncodeConfig.longTermMinBitRate = 1;  // 编码器输出长期最小码率,以kbps为单位。取值范围:[0, long_term_max_bit_rate] 。rcMode=5时生效
    vEncodeConfig.statsTime = 1;  // [1, 60]
    vEncodeConfig.thresholdI = {0, 0, 0, 0, 3, 3, 5, 5, 8, 8, 8, 15, 15, 20, 25, 25}; // 长度 16,[0, 255]
    vEncodeConfig.thresholdP = {0, 0, 0, 0, 3, 3, 5, 5, 8, 8, 8, 15, 15, 20, 25, 25}; // 长度 16,[0, 255]
    vEncodeConfig.thresholdB = {0, 0, 0, 0, 3, 3, 5, 5, 8, 8, 8, 15, 15, 20, 25, 25}; // 长度 16,[0, 255]
    vEncodeConfig.direction = 8; // [0, 16]
    vEncodeConfig.rowQpDelta = 1; // [0, 10]
    vEncodeConfig.firstFrameStartQp = 32;
    // 实例化编码类
    MxBase::VideoEncoder videoEncoder(vEncodeConfig, deviceId);
    // 执行编码操作
    FrameImage encodedFrame;

    for (size_t i = 0; i < inputFrameList.size(); i++) {
        ret = videoEncoder.Encode(image, frameId, &encodedFrame);
    }
}
// 去初始化
MxBase::MxDeInit();
搜索结果
找到“0”个结果

当前产品无相关内容

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