如何把 AI 摄像头添加到 BrainFrame

存档自 BrainFrame 论坛。发布于 2020年2月24日。 10 条回复 · 1248 次浏览 由英文原帖翻译成中文。 阅读原文

AOTU support

我正在尝试把 SimCam1s AI 摄像头添加到 VisionCapsules 运行环境中。

我目前已经做了:

  1. 把包含深度学习算法结果的元数据加入 IDR 帧的 SEI 部分,然后封装进 RTP 包。

2. 使用 GStreamer 管道验证元数据和视频数据是否正确

Rtsp 源 --> h264 文件管道,用于验证元数据:
gst-launch-1.0 -e rtspsrc location=rtsp://SIMCAM:****@192.168.1.107/live ! rtph264depay ! ‘video/x-h264, stream-format=(string)byte-stream’ ! filesink location=file.h264

Rtsp 源 --> 解码 --> mp4 文件管道,用于验证视频数据:
gst-launch-1.0 -e rtspsrc location=rtsp://SIMCAM:****@192.168.1.107/live! rtph264depay ! ‘video/x-h264, stream-format=(string)byte-stream’ ! decodebin ! avenc_mpeg4 ! mp4mux ! filesink location=file.mp4

BrainFrame 是否支持添加新的 appsink,比如 sub_sink?
我打算写一个 gstreamer 插件,从 h264 视频流中提取 SEI 数据。

AOTU support

感谢你的提问。目前 BrainFrame 还不支持提取 AI 元数据,但我们有兴趣增加这个功能。

我们的计划是:BrainFrame 默认提取 SEI 数据,并连同 numpy 帧一起传给算法胶囊的“process_frame”方法。

如果你用于提取 SEI 元数据的 GStreamer 插件在整个系统中运行良好,也许可以随 BrainFrame 一起发布?

我会和团队其他成员讨论这件事。

AOTU support

你好 Alex,我是 GStreamer 的新手,花了一周时间学习这个框架。目前我写了一个简单的 H264SeiFilter 来提取我们 SEI 中的元数据。在这个插件里我实现了一个 tcp 服务,把元数据发送给 python tcp 客户端。

  1. 接下来我该怎么做,才能把它传给算法胶囊的“process_frame”方法?
  2. BrainFrame 是如何从 GStreamer 的 appsink 获取数据的?
  3. 能给我一些建议吗?
AOTU support

你好 george,感谢你到目前为止的工作。接下来该我们在 BrainFrame 一侧增加元数据提取了。你愿意分享你的 H264SeiFilter Gst 插件,以及用你的 SEI 元数据示例视频运行它的示例吗?

这样我们就可以把插件加入 BrainFrame 部署,并把该功能加入 OpenVisionCapsule 规范。

AOTU support

当然乐意分享,不过这个插件只是一个简单的演示,目前只能提取我们摄像头的元数据。我正在安装 brainframe,计划在完成整体验证后分享一个更完整的插件。

AOTU support

你好 Alex,谢谢你的帮助,BrainFrame 服务端和客户端已经装好了。我该如何把我的 gstreamer 插件注册到 BrainFrame 客户端?
我试着把插件复制到路径“./v0_23_2_client/lib/gstreamer-1.0”,然后用自定义管道运行 BrainFrame 客户端:
rtspsrc location={url} ! rtph264depay name="buffer_src" ! video/x-h264, stream-format=byte-stream ! h264seifilter ! decodebin ! videoconvert ! appsink name="main_sink"
config

err

顺便说一下,不带自定义插件的管道是可以工作的:

rtspsrc location={url} ! rtph264depay name=“buffer_src” ! video/x-h264, stream-format=byte-stream ! decodebin ! videoconvert ! appsink name=“main_sink”

AOTU support

你好 George!

1:用你的插件制作自定义 BrainFrame 服务端

插件也需要加到 BrainFrame 服务端容器里。为此,我们可以在你本地机器上制作一个自定义镜像来修改服务端容器(用于测试)。

创建一个名为 Dockerfile 的文件,目录结构如下:

.
├── Dockerfile
└── h264seifilter.so

然后,在 Dockerfile 中写入:

FROM dilililabs/brainframe:0.23.2
WORKDIR /usr/local/lib/gstreamer-1.0/
ADD h264seifilter.so .

# Always end the file in the /brainframe directory so that the 
# brainframe_server executable is in the PATH
WORKDIR /brainframe

然后,运行下面的命令构建容器:

docker build --tag custom_brainframe:0.23.2 .

2. 运行自定义 BrainFrame 服务端

现在,我们需要添加一个 docker-compose.override.yml,这样你就可以用自己的自定义镜像,而不是默认的 dilililabs/brainframe:0.23.0 镜像来运行 BrainFrame 服务端。

为此,进入你从我们的下载区下载的 docker-compose.yml 所在位置,按下面的方式建立目录:

.
├── docker-compose.override.yml
├── docker-compose.yml
└── license_file

在 docker-compose.override.yml 中写入:

version: '2.4'
services:
  api:
    image: custom_brainframe:0.23.2

现在,只需在该目录下运行下面的命令,就可以启动 BrainFrame 服务端:

docker-compose down && docker-compose up

常用命令

如果需要在容器内调试,可以用下面的命令进入容器:

docker run -it --entrypoint bash dilililabs/brainframe:0.23.2
AOTU support

你好 Alex,太好了!现在可以用了。

Screenshot from 2020-03-13 11-54-52

我有几个问题:

  1. 为什么自定义插件需要在两侧(服务端和客户端)都添加?
  2. 自定义管道是在哪一侧起作用,服务端还是客户端?
  3. 默认管道似乎不支持带有 SEI 的 H264 NALU,所以我只能从原始视频流中过滤掉 SEI 数据。
AOTU support

你好 George!

为什么自定义插件需要在两侧(服务端和客户端)都添加?

自定义管道是在哪一侧起作用,服务端还是客户端?

服务端和客户端都会使用自定义管道,所以如果你在自定义管道里用了 h264seifilter 插件,两处都必须有这个插件。

默认管道似乎不支持带有 SEI 的 H264 NALU,所以我只能从原始视频流中过滤掉 SEI 数据。

你是在什么情况下发现它不支持的?BrainFrame 目前确实不会自动提取 SEI 数据。你是发现 SEI 数据干扰了视频流解码吗?

AOTU support

你是在什么情况下发现它不支持的?BrainFrame 目前确实不会自动提取 SEI 数据。你是发现 SEI 数据干扰了视频流解码吗?

我用 vlc 播放器可以无错误地打开带 SEI 数据的 rtsp 流,但 brainframe 客户端一直显示“连接中”。
把 SEI 数据过滤掉之后就可以了。

AOTU support

我已经通过微信把源代码发给你了。
希望对你们默认集成 SEI 数据提取的计划有帮助。
如果还有什么我能帮上忙的,请告诉我。

© 2026 Aotu 版权所有 · 网站隐私声明
Built on 2026-10-10 00:24:09 UTC