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。目前支持的 输入流 与 输出流 的组合如下
输入 \ 输出 | null | rtsp | file | screan | rtsp & 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)