视频解码

功能介绍

通过构造VideoDecoder类实例可实现视频解码功能,解码功能配置项及各项约束与支持情况请参考VideoDecodeConfig类”章节

视频解码支持自定义输出数据格式,通过自定义回调函数传入解码功能配置项,方便用户解码后的数据,详情可参考VdecCallBacker”章节

视频解码接口说明请参考VideoDecoder

接口调用流程

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

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

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

Vision SDK提供VideoDecoder类进行视频解码,关键步骤说明如下:

  1. 调用mx_init()接口进行全局初始化。
  2. 定义输出数据组合形式。
    • 输出数据包含视频帧解码后得到的Image类数据、当前解码帧的“frameId”和通道“channelId”
    • 可根据需要选择获取以上哪些数据。
  3. 定义输出回调函数。
    • 根据要获取的数据定义回调函数,在函数内组装自定义数据。
    • 回调函数输入参数固定为VideoDecodeCallBack形式,函数内可选择输出。
    • 请勿在回调函数内实现过于复杂的操作,建议只进行自定义获取解码数据操作。
  4. 构造视频解码配置项。

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

  5. 实例化视频解码类。

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

  6. 调用decode接口对视频进行解码。
  7. 调用mx_deinit()接口进行去初始化。

示例代码

如下提供关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
 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
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()  # 资源去初始化