视频编码
功能介绍
通过构造VideoEncoder类实例可实现视频编码功能,编码功能配置项及各项约束与支持情况请参考VideoEncodeConfig类数据结构说明。
视频编码支持自定义输出数据格式,通过自定义回调函数传入编码功能配置项,方便用户使用编码后的数据,详情可参考VencCallBacker类。
接口调用流程
首先根据需求定义需要的输出数据组合方式,根据组合方式参考VencCallBacker定义回调函数传入编码功能配置项,然后实例化VideoEncoder类,最后调用encode成员函数完成编码,获取数据。
视频编码接口调用流程参考如下:
图1 视频编码接口调用流程


mxVision提供VideoEncoder类进行视频编码,关键步骤说明如下:
- 调用mx_init()接口进行全局初始化。
- 定义输出数据组合形式。
- 输出数据包含视频帧编码后得到的的Image类数据、当前编码帧的“frameId”和通道“channelId”。
- 根据需要选择获取以上哪些数据。
- 定义输出回调函数。
- 构造视频编码配置项。
配置项及各项约束与支持情况请参考VideoEncodeConfig数据结构说明。
- 实例化视频编码类。
- 调用encode接口对视频进行编码。
- 调用mx_deinit()接口进行去初始化。
示例代码
如下提供关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
import os
import numpy as np
import time
from mindx.sdk import base
from mindx.sdk.base import Image, ImageProcessor
from mindx.sdk.base import VideoEncoder, VideoEncodeConfig, VencCallBacker
# 视频编码回调函数
def venc_callback(pyChar, outDataSize, channelId, frameId):
with open('video_save_data/output.h264', 'ab') as file:
file.write(pyChar)
def process():
# 初始化VencCallBacker类并注册回调函数
vencCallBacker = VencCallBacker()
vencCallBacker.registerVencCallBack(venc_callback)
# 初始化VideoEncodeConfig
venc_conf = VideoEncodeConfig()
venc_conf.keyFrameInterval = 50
venc_conf.srcRate = 30
venc_conf.maxBitRate = 6000
venc_conf.ipProp = 30
# 初始化VideoEncoder
videoEncoder = VideoEncoder(venc_conf, vencCallBacker, device_id)
# 将编码后数据保存为本地视频,若视频文件已存在则删除
venc_save_path = os.path.join(save_path, 'output.h264')
video_encode_exists = os.path.exists(venc_save_path)
if video_encode_exists:
os.remove(venc_save_path)
# 从decoded_data_list中循环取Image类进行编码
for i, img in enumerate(decoded_data_list):
videoEncoder.encode(img, i)
if __name__ == "__main__":
base.mx_init() # 资源初始化
process()
base.mx_deinit() # 资源去初始化
父主题: 媒体数据处理