5.1. 多媒体接口使用说明

5.1.1. 模块概要介绍

5.1.1.1. 模块名

hobot_vio是python包名,libsrcampy是模块名称,里面包含四个子模块,分别为Camera、Encoder、Decoder、Display。

5.1.1.2. 创建对象的方法

导入模块: from hobot_vio import libsrcampy

对象 = libsrcampy.<模块名>

5.1.1.3. 使用模块对应的方法

<模块名>.<方法>

比如img = cam.get_img(),返回值为具体的对象,可以对该对象进行具体的操作。

5.1.2. 软件接口

5.1.2.1. libsrcampy部分

bind

【函数声明】

int bind(PyObject *src, PyObject *dst);

【功能描述】

绑定两个模块,使其数据流自动流转

【参数描述】

参数名称 描述
src 源数据模块
dst 目标数据模块

【返回值】

返回值 描述
0 成功
非0 失败

【注意事项】无

【参考代码】接口使用示例代码

unbind

【函数声明】

int unbind(PyObject *src, PyObject *dst);

【功能描述】

解绑两个模块

【参数描述】

参数名称 描述
src 源数据模块
dst 目标数据模块

【返回值】

返回值 描述
0 成功
非0 失败

【注意事项】无

【参考代码】接口使用示例代码

5.1.2.2. Camera部分

libsrcampy.Camera:

open_cam

【函数声明】

int open_cam(int pipe_id, int video_index, int fps = 30, int width = 1920, int height = 1080);

【功能描述】

打开camera,打开后内部数据流开始运转

【参数描述】

参数名称 描述
pipe_id 当前pipeline所属pipe_id
video_index video_index 对应camera的索引 1:F37
fps camera输出帧率
width camera输出宽,默认值与具体camera有关
height camera输出高,默认值与具体camera有关

【返回值】

返回值 描述
0 成功
非0 失败

【注意事项】

1.若设置宽高与camera输出宽高不同,则内部会使能两个输出size,一个位原始camera输出size,一个为设置的size;

【参考代码】接口使用示例代码

get_img

【函数声明】

PyObject *get_img(int module = 2, int width, int height);

【功能描述】

获取图像,需要在open_cam之后调用

【参数描述】

参数名称 描述
module 获取对应模块的图像,只能使用 2:IPU
width 可设置为原图或open_cam时指定的宽高
height 同上

【返回值】

返回值 描述
PyBytesObeject 成功
PyNoneType 失败

【注意事项】

1.需要在open_cam之后调用;

【参考代码】接口使用示例代码

close_cam

【函数声明】

PyNoneType close_cam();

【功能描述】

关闭camera

【参数描述】无

【返回值】

返回值 描述
PyNoneType

【注意事项】

1.调用open_cam之后,退出程序时调用;

【参考代码】接口使用示例代码

5.1.2.3. Encode部分

libsrcampy.Encoder:

encode

【函数声明】

int encode(int video_chn, int type, int width, int height, int bits = 8000);

【功能描述】

编码模块的encode方法,用于图像的编码

【参数描述】

参数名称 描述
video_chn 对应的编码器通道(0-31)
type 编码类型 1:H264 2:H265 3:MJPEG
width 编码的图像宽度
height 编码的图像高度
bits 编码速率,默认为8000

【返回值】

返回值 描述
0 成功
非0 失败

【注意事项】无

【参考代码】接口使用示例代码

encode_file

【函数声明】

int encode_file(const char *file);

【功能描述】

编码模块的encode方法,用于图像文件的编码

【参数描述】

参数名称 描述
file 需要编码的YUV文件,需要使用NV12格式

【返回值】

返回值 描述
0 成功
非0 失败

【注意事项】无

【参考代码】接口使用示例代码

get_img

【函数声明】

PyObject *get_img();

【功能描述】

编码模块的get_img方法,返回python对象该接口内部会释放buffer,无需用户释放

【参数描述】无

【返回值】

返回值 描述
PyBytesObeject 成功
PyNoneType 失败

【注意事项】

1.需要在encode之后调用;

【参考代码】接口使用示例代码

close

【函数声明】

int close();

【功能描述】

编码模块的close方法,关闭编码模块

【参数描述】无

【返回值】

返回值 描述
0 成功
非0 失败

【注意事项】

1.调用encode或encode_file之后,退出程序时调用;

【参考代码】接口使用示例代码

5.1.2.4. Decode部分

libsrcampy.Decoder:

decode

【函数声明】

int decode(char *file, int video_chn, int type, int width, int height, int dec_mode = 1);

【功能描述】

解码模块的decode方法,用于图像的解码

【参数描述】

参数名称 描述
file 需要解码的文件名
video_chn 对应的解码器通道(0-31)
type 编码类型 1:H264 2:H265 3:MJPEG
width 解码的图像宽度
height 解码的图像高度
dec_mode 解码的码流形式 0:STREAM 1:FRAME

【返回值】

返回值 描述
0 成功
非0 失败

【注意事项】无

【参考代码】接口使用示例代码

get_img

【函数声明】

PyObject *get_img();

【功能描述】

解码模块的get_img方法,返回python对象,返回python对象该接口内部会释放buffer,无需用户释放

【参数描述】无

【返回值】

返回值 描述
PyBytesObeject 成功
PyNoneType 失败

【注意事项】

1.需要在decode之后调用;

【参考代码】接口使用示例代码

close

【函数声明】

int close();

【功能描述】

解码模块的close方法,关闭解码模块

【参数描述】无

【返回值】

返回值 描述
0 成功
非0 失败

【注意事项】

1.调用decode之后,退出程序时调用;

【参考代码】接口使用示例代码

5.1.2.5. Display部分

libsrcampy.Display:

display

【函数声明】

int display(int chn = 0, int width = 1920, int height = 1080, int vot_intf = 0, int vot_out_mode = 1);

【功能描述】

显示模块的display方法,用于图像显示初始化

【参数描述】

参数名称 描述
chn chn 显示输出层,0~1为video层,2~3为图形层
width 显示的图像宽度
height 显示的图像高度
vot_intf 默认0为VOT_OUTPUT_1920x1080,表示硬件层输出分辨率
vot_out_mode 默认输出模式1为HDMI输出,表示硬件层的输出接口

【返回值】

返回值 描述
0 成功
非0 失败

【注意事项】无

【参考代码】接口使用示例代码

set_img

【函数声明】

PyObject *set_img(PyObject *img);

【功能描述】

显示模块的set_img方法,设置PyBytesObject对象

【参数描述】无

【返回值】

返回值 描述
0 成功
非0 失败

【注意事项】

1.需要在display之后调用;

【参考代码】接口使用示例代码

close

【函数声明】

int close();

【功能描述】

显示模块的close方法,关闭显示模块

【参数描述】无

【返回值】

返回值 描述
0 成功
非0 失败

【注意事项】

1.调用display之后,退出程序时调用;

【参考代码】接口使用示例代码

5.1.3. 接口使用示例代码

import sys, os, time
from hobot_vio import libsrcampy

def test_camera():
    cam = libsrcampy.Camera()
    cam.open_cam(0, 1, 30, 1920, 1080)
    # wait for isp tuning
    time.sleep(1)
    img = cam.get_img(2)
    if img is not None:
        #save file
        fo = open("output.img", "wb")
        fo.write(img)
        fo.close()
        print("camera save img file success")
    else:
        print("camera save img file failed")
    cam.close_cam()
    print("test_camera done!!!")

def test_encode():
    #encode file
    enc = libsrcampy.Encoder()
    enc.encode(0, 1, 1920, 1080)

    #save file
    fo = open("encode.h264", "wb+")
    a = 0
    fin = open("output.img", "rb")
    input_img = fin.read()
    fin.close()
    while a < 100:
        enc.encode_file(input_img)
        img = enc.get_img()
        if img is not None:
            fo.write(img)
            print("encode write image success count: %d" % a)
        else:
            print("encode write image failed count: %d" % a)
        a = a + 1

    enc.close()
    print("test_encode done!!!")

def test_decode():
    #decode start
    dec = libsrcampy.Decoder()

    ret = dec.decode("encode.h264", 0, 1, 1920, 1080)
    print ("frame count: %d" % ret[1])

    img = dec.get_img()
    if img is not None:
        #save file
        fo = open("output.img", "wb")
        fo.write(img)
        fo.close()
        print("decode save img file success")
    else:
        print("decode save img file failed")

    dec.close()
    print("test_decode done!!!")
    
def test_display():
    disp = libsrcampy.Display()
    disp.display(0, 1920, 1080, 0, 1)
    
    fo = open("output.img", "rb")
    img = fo.read()
    fo.close()
    disp.set_img(img)
    time.sleep(1)

    disp.close()
    print("test_display done!!!")

def test_camera_bind_encode():
    #camera start
    cam = libsrcampy.Camera()
    cam.open_cam(0, 1, 30, 1920, 1080)

    #encode start
    enc = libsrcampy.Encoder()
    enc.encode(0, 1, 1920, 1080)
    libsrcampy.bind(cam, enc)

    #save file
    fo = open("encode.h264", "wb+")
    a = 0
    while a < 100:
        img = enc.get_img()
        if img is not None:
            fo.write(img)
            print("encode write image success count: %d" % a)
        else:
            print("encode write image failed count: %d" % a)
        a = a + 1
    fo.close()

    print("save encode file success")
    libsrcampy.unbind(cam, enc)
    enc.close()
    cam.close_cam()
    print("test_camera_bind_encode done!!!")

def test_camera_bind_display():
    #camera start
    cam = libsrcampy.Camera()
    cam.open_cam(0, 1, 30, 1920, 1080)

    #display start
    disp = libsrcampy.Display()
    disp.display(0, 1920, 1080, 0, 1)
    libsrcampy.bind(cam, disp)
    
    time.sleep(5)

    libsrcampy.unbind(cam, disp)
    disp.close()
    cam.close_cam()
    print("test_camera_bind_display done!!!")

def test_decode_bind_display():
    #decode start
    dec = libsrcampy.Decoder()

    dec.decode("encode.h264", 0, 1, 1920, 1080)

    #display start
    disp = libsrcampy.Display()
    disp.display(0, 1920, 1080, 0, 1)
    libsrcampy.bind(dec, disp)
    
    time.sleep(5)

    libsrcampy.unbind(dec, disp)
    disp.close()
    dec.close()
    print("test_decode_bind_display done!!!")


test_camera()
test_encode()
test_decode()
test_display()
test_camera_bind_encode()
test_camera_bind_display()
test_decode_bind_display()