通过构造VideoEncoder类实例可实现视频编码功能,编码功能配置项及各项约束与支持情况请参考“VideoEncodeConfig”章节中的数据结构说明。
视频编码支持自定义输出数据格式,通过自定义回调函数传入编码功能配置项,方便用户使用编码后的数据,详情可参考“VideoEncodeCallBack”章节。
视频编码的接口说明请参考VideoEncoder。
首先根据需求定义需要的输出数据组合方式,根据组合方式参考VideoEncodeCallBack定义回调函数传入编码功能配置项,然后实例化VideoEncoder类,最后调用Encode成员函数完成编码,获取数据。
视频编码接口调用流程参考如下:
Vision SDK提供VideoEncoder类进行视频编码,关键步骤说明如下:
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 | // 初始化 MxBase::MxInit(); { // 定义要接收的编码数据 struct FrameImage { Image image; // 视频帧类对象 uint32_t frameId = 0; // 视频帧索引 uint32_t channelId = 0; // 视频处理通道资源索引 }; // 定义获取编码数据到自定义结构的回调函数 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; #I帧间隔 vEncodeConfig.srcRate = 30; #输入码流帧率 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] #行级码率控制调节幅度是一帧内行级调节的最大范围,其中行级以宏块行为单位。调节幅度越大,允许行级调整的QP范围越大,码率越平稳 vEncodeConfig.firstFrameStartQp = 32; #设置第一帧的起始Qp值 // 实例化编码类 MxBase::VideoEncoder videoEncoder(vEncodeConfig, deviceId); // 执行编码操作 FrameImage encodedFrame; for (size_t i = 0; i < inputFrameList.size(); i++) { ret = videoEncoder.Encode(image, frameId, &encodedFrame); } } // 去初始化 MxBase::MxDeInit(); |