我已经建立了从 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,直到现在,我都无法开始直播。
三种方式:
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 包装器是如何工作的。
优点:对你来说更容易。
缺点:这对你的朋友来说并不容易。
我最近遇到了类似的情况,貌似原则上是可以的
我已经能够通过以下设置从 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 版本(可能通过从源代码构建它们)——这是可能的,但在实践中它可能具有挑战性。