跳到主要内容

AidStream SDK for Python

简介

AidStream 是用来构建流媒体应用的视频框架,其目标是要简化视频+AI应用程序的开发中需要插入算法的程序构建。 AidStream 以 pipeline 为基础,开发者需要为每条 pipeline 配置 输入流输出流 信息。 在一条完整的 pipeline 中,数据从 输入流 流出,开发者可以通过 AidStream 的 api 获取对应的 RGB 数据,并在处理后输入到 输出流 中。

功能说明

目前可用的 输入流

rtsp,h.264 编码或 h.265 编码的 rtsp流。
file,本地的视频文件。
mipi_camera,mipi相机。
usb_camera,usb相机。
null,不配置输入流。

目前可用的 输出流

rtsp,h.264 编码的 rtsp流。
file,本地的视频文件。
screan,设备的显示器。
null,不配置输出流。

目前的 AidStream 仅支持以下类型的工作流程

编码->推送RTSP流
获取RTSP流->解码
获取RTSP流->解码->处理->编码->推送RTSP流
获取RTSP流->解码->处理->编码->保存MPEG-4视频文件
获取RTSP流->解码->处理->显示
获取RTSP流->解码->处理->编码->推送RTSP流 & 保存MPEG-4视频文件
MPEG-4视频文件->处理->推送RTSP流&&保存MPEG-4视频文件
mipi 相机->处理->推送RTSP流
mipi 相机->处理->显示
usb相机->处理->显示

换言之,不同的 输入流 目前仅支持部分 输出流,当且仅当 输入流输出流 的组合在 AidStream 的支持范围内时,才可成功构建 pipeline。目前支持的 输入流输出流 的组合如下

输入 \ 输出nullrtspfilescreanrtsp & file
null✔️
rtsp✔️✔️✔️✔️✔️
file✔️
mipi_camera✔️✔️
usb_camera✔️

导入

import aidstream

快速使用

import cv2
import aidstream

inrtsp = "rtsp://192.168.111.118:554/stream/0" # 此地址仅供参考,请使用你的 rtsp 视频流地址
infile = "test.mp4" # 此文件路径仅供参考,请使用你的文件路径
outrtsp = "rtsp://192.168.111.118:554/stream/1" # 此地址仅供参考,请使用你的流媒体服务器地址
outfile = "save.mp4" # 此文件路径仅供参考,请使用你的文件路径

def example_rtsp_null():
print("拉rtsp流,无输出")
pipelines = aidstream.ast()

pipelines.add(input=inrtsp, inputshape=(640,480))
pipelines.build()

while True:
frame = pipelines.read()
if frame is None:
continue
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
cv2.imshow("a", frame)

def example_rtsp_screan():
print("拉rtsp流,显示到屏幕")
pipelines = aidstream.ast()

pipelines.add(input=inrtsp)
pipelines.build()

while True:
frame = pipelines.read()
if frame is None:
continue
pipelines.show(frame)

def example_rtsp_rtsp():
print("拉rtsp流,输出到rtsp流")
pipelines = aidstream.ast()

pipelines.add(input=inrtsp, inputFormat="video/avc", inputshape=(640,480), outputinfo=[outrtsp, 10, 1920, 1080])
pipelines.build()

while True:
frame = pipelines.read()
if frame is None:
continue
frame = cv2.resize(frame, (1920,1080))
pipelines.push(frame)

def example_rtsp_save():
print("拉rtsp流,输出到本地文件")
pipelines = aidstream.ast()

pipelines.add(input=inrtsp, inputFormat="video/avc", inputshape=(640,480), outputinfo=[outfile, 10, 1920, 1080])
pipelines.build()

while True:
frame = pipelines.read()
if frame is None:
continue
frame = cv2.resize(frame, (1920,1080))
pipelines.push(frame)

def example_rtsp_rtsp_and_save():
print("拉rtsp流,输出到rtsp流与本地文件")
pipelines = aidstream.ast()

pipelines.add(input=inrtsp, inputFormat="video/avc", inputshape=(640,480), outputinfo=[outrtsp, outfile, 10, 1920, 1080])
pipelines.build()

while True:
frame = pipelines.read()
if frame is None:
continue
frame = cv2.resize(frame, (1920,1080))
pipelines.push(frame)

def example_file_rtsp_and_save():
print("读取本地文件,输出到rtsp流与本地文件")
pipelines = aidstream.ast()

pipelines.add(input=infile, inputshape=(640,480), outputinfo=[outrtsp, outfile, 10, 1920, 1080])
pipelines.build()

while True:
frame = pipelines.read()
if frame is None:
continue
frame = cv2.resize(frame, (1920,1080))
pipelines.push(frame)


def example_usb_screan():
print("读取usb相机,显示到屏幕")
pipelines = aidstream.ast()

res = pipelines.getUsbDeviceId()
pipelines.add(input=res[0], utype="usbDeviceId")
pipelines.build()

while True:
frame = pipelines.read()
if frame is None:
continue
pipelines.show(frame)

def example_mipi_screan():
print("读取mipi相机,显示到屏幕")
pipelines = aidstream.ast()

pipelines.add(input=0)
pipelines.build()

while True:
frame = pipelines.read()
if frame is None:
continue
pipelines.show(frame)

def example_mipi_rtsp():
print("读取mipi相机,输出到rtsp流")
pipelines = aidstream.ast()

pipelines.add(input=0, inputshape=(640,480), outputinfo=[outrtsp, 10, 1920, 1080])
pipelines.build()

while True:
frame = pipelines.read()
if frame is None:
continue
frame = cv2.resize(frame, (1920,1080))
pipelines.push(frame)

核心类 ast

类 ast 为 AidStream 的唯一核心,用于配置和启动一条或多条 pipeline,每条 pipeline 内部的数据处理也需要通过 ast 的成员函数来实现。

初始化

初始化 ast()
参数
返回值 一个完成了初始化的 ast 实例。

使用例

import aidstream

pipelines = aidstream.ast()

获取可用usb相机列表 getUsbDeviceId

成员函数 ast().getUsbDeviceId() -> list
参数
返回值 list类型的常量,list中的元素为可用的 usb相机 对应的id。

获取可用的 usb相机 设备对应的id。

⚠️注意: 并非所有类型的 usb相机 均可用。

使用例

import aidstream

pipelines = aidstream.ast()

usable_usb_camera_list = pipelines.getUsbDeviceId()
print(usable_usb_camera_list)

添加配置信息 add

成员函数 ast().add(input=None, utype=None, inputFormat=None, inputshape=None, outputinfo=None) -> dict
参数 参数名 类型 默认值 说明
input int 或 str None 输入流。
str类型:rtsp流地址或本地视频文件路径。
int类型:mipi相机索引或usb相机索引。mipi相机索引从0开始计数,usb相机索引通过 getUsbDeviceId 函数获取。
utype str None 输入流类型,可用值有:"inputUrl", "file_path","camera_id", "usbDeviceId"。
"inputUrl":rtsp流地址。
"file_path":本地视频文件路径。
"camera_id":mipi相机索引。
"usbDeviceId":usb相机索引。
当该参数设置为 None 时,基于该规则自动解析输入流类型:当传入的 input 参数为 str 类型时,依据该参数的内容格式,自动设置为 "inputUrl" 或 "file_path";当传入的 input 参数为 int 类型时,自动设置为 "camera_id"。
inputFormat str None rtsp流编码格式,可用值有:"video/avc","video/hevc"。
"video/avc":h.264 编码。
"video/hevc":h.265编码。
该参数当且仅当 utype == "inputUrl" 时有效。当该参数有效且设置为 None 时,会自动设置为"video/avc"。
inputshape tuple None 设置获取到的三维图形数组的尺寸,标准格式为 (width, height)。
width:int类型的常量,图形数组的宽。
height:int类型的常量,图形数组的高。
输出流 为显示器时该参数无效。
outputinfo list None 设置输出流信息,标准格式为 [output, outFrameRate, outWidth, outHeight] 或 [outputUrl, save_path, outFrameRate, outWidth, outHeight]。
output:str类型的常量,输出源,可以是输出的 rtsp流地址或保存的本地文件路径。
outputUrl:str类型的常量,表示输出的 rtsp流 的地址。
save_path:str类型的常量,表示保存的本地文件路径。
outFrameRate:int类型的常量,表示输出的帧率。
outWidth:int类型的常量,表示输出的 rtsp流 或 保持的视频文件的宽。
outHeight:int类型的常量,表示输出的 rtsp流 或 保持的视频文件的高。
当 outputinfo 设置为 None 时,若 utype == "inputUrl" 且 inputshape 未设置为 None ,则无输出流,否则输出到显示器中。
返回值 dict 类型的常量,表示基于开发者输入的参数构建的pipeline配置信息。

⚠️注意: AidLux需获取访问相机权限后才可使用 mipi 相机。

add 函数用于添加一组 输入流输出流 的配置信息,该函数可多次调用,以添加多组配置信息,但每组配置信息需保持相同的 输入流输出流 组合(可用的组合见此处)。

使用例

import aidstream
inrtsp0 = "rtsp://127.0.0.1:554/instream/0" # 此地址仅供参考,请使用你的 rtsp 视频流地址
inrtsp1 = "rtsp://127.0.0.1:554/instream/1" # 此地址仅供参考,请使用你的 rtsp 视频流地址
outrtsp0 = "rtsp://127.0.0.1:554/outstream/0" # 此地址仅供参考,请使用你的流媒体服务器地址
outrtsp1 = "rtsp://127.0.0.1:554/outstream/1" # 此地址仅供参考,请使用你的流媒体服务器地址

pipeline = aidstream.ast()

pipelines.add(input = inrtsp0, utype = "inputUrl", inputFormat = "video/avc",
inputshape = (640,480), outputinfo = [outrtsp0, 10, 1920, 1080])

pipelines.add(input = inrtsp1, utype = "inputUrl", inputFormat = "video/avc",
inputshape = (480,360), outputinfo = [outrtsp1, 10, 720, 480])

构建 build

成员函数 ast().build() -> list
参数
返回值 list类型的常量,分别为每组配置实际获取的图形的尺寸。

基于已通过 add 添加的 输入流输出流 配置信息 构建pipeline,当 pipeline 的 输入流输出流 组合 存在冲突或错误时会抛出对应的 ERROR。构建成功后,会返回由每组 pipeline 实际获取的图形尺寸组成的列表。

使用例

import aidstream
inrtsp = "rtsp://127.0.0.1:554/instream/0" # 此地址仅供参考,请使用你的 rtsp 视频流地址
outrtsp = "rtsp://127.0.0.1:554/outstream/0" # 此地址仅供参考,请使用你的流媒体服务器地址

pipelines = aidstream.ast()

pipelines.add(input = inrtsp, utype = "inputUrl", inputFormat = "video/avc",
inputshape = (640,480), outputinfo = [outrtsp, 10, 1920, 1080])

pipelines.build()

获取图形数据 read

成员函数 ast().read(index=0) -> numpy.array
参数 参数名 类型 默认值 说明
index int 0 pipeline 索引,索引的第一位为0。
返回值 成功则返回 numpy.array 类型的常量,为获取到的 图形数据。
失败则返回 None。

获取第 index 组 pipeline 的输入流数据,成功会返回 RGB 色彩的 numpy.array 数组,失败返回 None。

使用例

import aidstream
inrtsp = "rtsp://127.0.0.1:554/instream/0" # 此地址仅供参考,请使用你的 rtsp 视频流地址
outrtsp = "rtsp://127.0.0.1:554/outstream/0" # 此地址仅供参考,请使用你的流媒体服务器地址

pipelines = aidstream.ast()
pipelines.add(input = inrtsp, utype = "inputUrl", inputFormat = "video/avc",
inputshape = (640,480), outputinfo = [outrtsp, 10, 1920, 1080])

pipelines.build()

while True:
frame = pipelines.read()
if frame is None:
continue
print(frame.shape)

显示图形数据 show

成员函数 ast().show(frame, index=0) -> None
参数 参数名 类型 默认值 说明
frame numpy.array 无默认值 待添加到 输出流 的图形数据,其尺寸、类型、格式与对应的 输入流 数据保持一致。
index int 0 应用的 pipeline 索引,索引的第一位为0。
返回值 无。

输出流 为设备的显示器时,使用该函数为指定的 pipeline 的 输出流 添加数据。

使用例

import aidstream
inrtsp = "rtsp://127.0.0.1:554/instream/0" # 此地址仅供参考,请使用你的 rtsp 视频流地址

pipelines = aidstream.ast()
pipelines.add(input = inrtsp)

pipelines.build()

while True:
frame = pipelines.read()
if frame is None:
continue
pipelines.show(frame)

推送图形数据 push

成员函数 ast().push(frame, index=0) -> None
参数 参数名 类型 默认值 说明
frame numpy.array 无默认值 待添加到 输出流 的图形数据,使用 RGB色彩,其尺寸与对应的 输出流 配置参数保持一致。
index int 0 应用的 pipeline 索引,索引的第一位为0。
返回值 无。

输出流 为 rtsp流 或 本地的视频文件 时,使用该函数为指定的 pipeline 的 输出流 添加数据。

import aidstream
inrtsp0 = "rtsp://127.0.0.1:554/instream/0" # 此地址仅供参考,请使用你的 rtsp 视频流地址
inrtsp1 = "rtsp://127.0.0.1:554/instream/1" # 此地址仅供参考,请使用你的 rtsp 视频流地址
outrtsp0 = "rtsp://127.0.0.1:554/outstream/0" # 此地址仅供参考,请使用你的流媒体服务器地址
outrtsp1 = "rtsp://127.0.0.1:554/outstream/1" # 此地址仅供参考,请使用你的流媒体服务器地址

pipelines = aidstream.ast()
pipelines.add(input = inrtsp0, utype = "inputUrl", inputFormat = "video/avc",
inputshape = (640,480), outputinfo = [outrtsp0, 10, 720, 480])

pipelines.add(input = inrtsp1, utype = "inputUrl", inputFormat = "video/avc",
inputshape = (480,360), outputinfo = [outrtsp1, 10, 720, 480])

pipelines.build()

index = 0
while True:
frame = pipelines.read(index)
index = -1 * index + 1
if frame is None:
continue
frame = cv2.resize(frame, (720,480))
pipelines.push(frame, index = index)