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


mxVision提供VideoDecoder类进行视频解码,关键步骤说明如下:
- 调用mx_init()接口进行全局初始化。
- 定义输出数据组合形式。
- 输出数据包含视频帧解码后得到的的Image类数据、当前解码帧的“frameId”和通道“channelId”。
- 可根据需要选择获取以上哪些数据。
- 定义输出回调函数。
- 根据要获取的数据定义回调函数,在函数内组装自定义数据。
- 回调函数输入参数固定为VideoDecodeCallBack形式,函数内可选择输出。
- 请勿在回调函数内实现过于复杂的操作,建议只进行自定义获取解码数据操作。
- 构造视频解码配置项。
配置项及各项约束与支持情况请参考VideoDecodeConfig数据结构说明。
- 实例化视频解码类。
- 调用decode接口对视频进行解码。
- 调用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 VideoDecoder, VideoDecodeConfig, VdecCallBacker
decoded_data_list = []
# 视频解码回调函数
def vdec_callback(decodedImage, channelId, frameId):
# 解码完成的Image类存入列表中
decoded_data_list.append(decodedImage)
def process():
# 初始化VdecCallBacker类并注册回调函数
vdecCallBacker = VdecCallBacker()
vdecCallBacker.registerVdecCallBack(vdec_callback)
# 初始化VideoDecodeConfig类并设置参数
vdecConfig = VideoDecodeConfig()
vdecConfig.skipInterval = 0
vdecConfig.inputVideoFormat = base.h264_main_level
vdecConfig.outputImageFormat = base.nv12
vdecConfig.width = 1920
vdecConfig.height = 1080
# 初始化VideoDecoder
videoDecoder = VideoDecoder(vdecConfig, vdecCallBacker, device_id, channel_id)
# 获取需解码视频帧文件名
srcDataList = ["frame-{}.data".format(i) for i in range(100)]
# 循环取帧解码
for i, fileName in enumerate(srcDataList):
# 读取视频帧数据存入file
file = np.fromfile(fileName, dtype='uint8')
# 视频帧数据解码
videoDecoder.decode(file, i)
if __name__ == "__main__":
base.mx_init() # 资源初始化
process()
base.mx_deinit() # 资源去初始化
父主题: 媒体数据处理