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()