---
title: 视频编码
description: "通过构造VideoEncoder类实例可实现视频编码功能，编码功能配置项及各项约束与支持情况请参考VideoEncodeConfig数据结构说明。"
url: https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/latest/Application%20Development%20Guide/msadg/mxvisionug_0039.html
sourcePath: /source/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application Development Guide/msadg/mxvisionug_0039.html
indexId: ebc32112309de73022dca5bc2468993c407531ad2f15a21e42de76bc36c91415102
---
# 视频编码

#### 功能介绍

通过构造VideoEncoder类实例可实现视频编码功能，编码功能配置项及各项约束与支持情况请参考VideoEncodeConfig数据结构说明。

视频编码支持自定义输出数据格式，通过自定义回调函数传入编码功能配置项，方便用户使用编码后的数据，详情可参考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;
}
// 构造编码配置项
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;
// 实例化编码类
VideoEncoder
videoEncoder
(vEncodeConfig, deviceId);
// 执行编码操作
FrameImage
encodedFrame
;
for (size_t i = 0; i < inputFrameList.size(); i++) {
ret = videoEncoder.
Encode
(image, frameId, &encodedFrame);
}
}
// 去初始化
MxBase::MxDeInit();
```
