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视频文件