3.5 VDEC 模块API手册#

前言#

概述#

本文档主要介绍K230_CanMV VDEC模块API的使用。

读者对象#

本文档(本指南)主要适用于以下人员:

  • 技术支持工程师

  • 软件开发工程师

缩略词定义#

简称

说明

VDEC

Video Decoder

修订记录#

文档版本号

修改说明

修改者

日期

V1.0

初版

sxp

2023-10-27

V2.0

增加文件解码示例

sxp

2024-09-11

1. 概述#

此文档介绍K230_CanMV VDEC模块API,可支持264,265解码,并于vo模块绑定,将解码数据输出到vo显示。

2. API描述#

提供Decoder类,该类提供如下方法:

2.1 Decoder.__init__#

【描述】

构造函数

【语法】

decoder = Decoder(K_PT_H264)

【参数】

参数名称

描述

输入/输出

type

编码类型

输入

【返回值】

返回值

描述

0

成功

非 0

失败

【注意】

VDEC最多支持4路解码

【举例】

【相关主题】

2.2 Decoder.Create#

【描述】

创建解码器

【语法】

decoder = Decoder(K_PT_H264)
decoder.create()

【参数】

【返回值】

返回值

描述

0

成功

非 0

失败

【举例】

【相关主题】

2.3 Decoder.destroy#

【描述】

销毁解码器

【语法】

decoder = Decoder(K_PT_H264)
decoder.destroy()

【参数】

【返回值】

返回值

描述

0

成功

非0

失败

【注意】

【举例】

2.4 Decoder.Start#

【描述】

开始编码

【语法】

decoder = Decoder(K_PT_H264)
decoder.Start()

【参数】

【返回值】

返回值

描述

0

成功

非0

失败

【注意】

【举例】

2.5 Decoder.decode#

【描述】

解码一帧数据

【语法】

decoder = Decoder(K_PT_H264)
decoder.decode(stream_data)

【参数】

参数名称

描述

输入/输出

stream_data

编码数据

输入

【返回值】

返回值

描述

0

成功

非0

失败

【注意】

【举例】

2.6 Decoder.stop#

【描述】

释放一帧码流buffer

【语法】

decoder = Decoder(K_PT_H264)
decoder.stop()

【参数】

【返回值】

返回值

描述

0

成功

非0

失败

【注意】

【举例】

2.7 Decoder.bind_info#

【描述】

Display.bind_layer时使用,获取绑定信息

【语法】

vdec.bind_info(width=vdec_width,height=vdec_height,chn=0)

【参数】

参数名称

描述

输入/输出

width

解码帧宽度

输入

height

解码帧高度

输入

chn

编码输出通道号

输入

【返回值】

返回值

描述

【注意】

【举例】


【相关主题】

3. 数据结构描述#

3.1 StreamData#

【说明】

码流结构体

【定义】

class StreamData:
    def __init__(self):
        self.data
        self.pts

【成员】

成员名称

描述

data

码流数据

pts

时间戳

【注意事项】

4. 示例程序#

4.1 例程1#

from media.media import *
from mpp.payload_struct import *
import media.vdecoder as vdecoder
from media.display import *

import time, os

STREAM_SIZE = 40960
def vdec_test(file_name,width=1280,height=720):
    print("vdec_test start")
    vdec_chn = VENC_CHN_ID_0
    vdec_width =  ALIGN_UP(width, 16)
    vdec_height = height
    vdec = None
    vdec_payload_type = K_PT_H264

    #display_type = Display.VIRT
    display_type = Display.ST7701 #使用ST7701 LCD屏作为输出显示,最大分辨率800*480
    #display_type = Display.LT9611 #使用HDMI作为输出显示

    # 判断文件类型
    suffix = file_name.split('.')[-1]
    if suffix == '264':
        vdec_payload_type = K_PT_H264
    elif suffix == '265':
        vdec_payload_type = K_PT_H265
    else:
        print("Unknown file extension")
        return

    # 实例化video decoder
    #vdecoder.Decoder.vb_pool_config(4,6)
    vdec = vdecoder.Decoder(vdec_payload_type)

    # 初始化display
    if (display_type == Display.VIRT):
        Display.init(display_type,width = vdec_width, height = vdec_height,fps=30)
    else:
        Display.init(display_type,to_ide = True)

    #vb buffer初始化
    MediaManager.init()

    # 创建video decoder
    vdec.create()

    # vdec bind display
    bind_info = vdec.bind_info(width=vdec_width,height=vdec_height,chn=vdec.get_vdec_channel())
    Display.bind_layer(**bind_info, layer = Display.LAYER_VIDEO1)

    vdec.start()
    # 打开文件
    with open(file_name, "rb") as fi:
        while True:
            os.exitpoint()
            # 读取视频数据流
            data = fi.read(STREAM_SIZE)
            if not data:
                break
            # 解码数据流
            vdec.decode(data)

    # 停止video decoder
    vdec.stop()
    # 销毁video decoder
    vdec.destroy()
    time.sleep(1)

    # 关闭display
    Display.deinit()
    # 释放vb buffer
    MediaManager.deinit()

    print("vdec_test stop")


if __name__ == "__main__":
    os.exitpoint(os.EXITPOINT_ENABLE)
    vdec_test("/sdcard/examples/test.264",800,480) #解码264/265视频文件