如何捕获 SRT 流?

问题描述 投票:0回答:2

我已经建立了从 Raspberry Pi 到我的 PC 的 SRT 流。 一切正常。我也可以用 VLC 观看流。 现在我想用 Python 捕获流。

使用 RTMP 和 HTTP 命令

cap = cv2.VideoCapture("srt://IP:PORT")
frame = cap.read()

工作没有任何问题。

但是对于 SRT,OpenCV 甚至不会尝试捕获流。

我能做什么?

编辑:

关于我的项目的更多信息: 我有一个 USB 摄像头与我的 Raspberry Pi 相连,并通过 SRT 流式传输此实时视频。我从 Haivision 安装了 SRT 并使用以下命令创建了流:

./srt-live-transmit udp://:1234 srt://:4201 -v 

UDP路径是USB摄像头的输入。 通过 ffplay 在 Raspberry Pi 上本地观看流。 正如我之前所说,在我的 PC 上播放视频也有效。 有了OBS,直到现在,我都无法开始直播。

python stream vlc capture
2个回答
0
投票

三种方式:

1。使用 RTSP 而不是 SRT
我找不到任何关于如何在 python 中解码 SRT 的数据,并且在他们的 GitHub 存储库 中只有一个官方库和 Haivision 中 C 的示例代码,所以最简单的方法是更改 RPI 的视频流协议。
关于如何从 RPI 相机以 RTSP 流式传输视频的很好的示例说明。.
优点:容易做。
缺点:如果需要,则不是 SRT。

2。使用 SRT 而不是 Python
有创建 SRT 客户端脚本的代码示例,但它们是 C 语言的,我没有找到任何关于 python 库或 SRT 示例代码的数据。但是在 C 中有一个很好的例子:来自 Git Haivision 的例子
另一方面,OpenCV 也是一个基于 C 的库。因此,您可能会开始学习 C 语言。
优点:Haivision 的 OpenCV 和 SRT 都是基于 C 的,所以用 C 更好
缺点:C 很难学。

3。为 Python 开发 C 包装器
如果你有一个可以用 C 开发的朋友,那么可以为 python 创建一个客户端库甚至客户端 API。
C 包装器是如何工作的。

优点:对你来说更容易。
缺点:这对你的朋友来说并不容易。


0
投票

我最近遇到了类似的情况,貌似原则上是可以的

我已经能够通过以下设置从 Python 使用 OpenCV 从本地 SRT 流中读取帧:

Python代码(关键部分是

?mode=listener
在端口之后)

cap = cv2.VideoCapture("srt://:4200?mode=listener")

# read frames as usual

通过 ffmpeg 从文件流式传输

ffmpeg -re -i video.mp4 -f mpegts "srt://127.0.0.1:4200"

为什么说“原则上”?那是因为它需要在流媒体和接收端都有一个与 SRT 兼容的 ffmpeg 版本(afaik 它应该 >= 4.4)(在我的例子中,OpenCV 在引擎盖下使用 ffmpeg 进行视频捕获)。

幸运的是,在 M1 Mac Air 上的初始测试期间,我的管道的两个部分都符合要求:

ffmpeg version 5.0.1 Copyright (c) 2000-2022 the FFmpeg developers
opencv-python      4.7.0.72

当我尝试在 Ubuntu 18.04 机器上运行相同的程序时——流媒体和接收都不可能:

流媒体端

srt://127.0.0.1:4200: Protocol not found

接收方

创建视频捕获后立即返回(不像“正确”的情况,它阻塞直到建立与流媒体端的连接),并尝试从中读取()返回

ret=False

结论
如果你能确保这两个部分都有最新的 ffmpeg 版本(可能通过从源代码构建它们)——这是可能的,但在实践中它可能具有挑战性。

© www.soinside.com 2019 - 2024. All rights reserved.