如何在没有第三方代码的情况下使用 PiCam 创建符合 ONVIF 标准的界面?

How to create an ONVIF compliant interface using PiCam without third party codes?

我浏览了很多关于 raspberry pi 的 ONVIF 兼容解决方案的问题和答案,但其中大多数都为我的问题提供了不完整的解决方案。我正在寻找一种方法,使 Raspberry Pi 相机(不是 USB 相机)成为符合 ONVIF 标准的相机,需要时在 RTSP 中流出。

Here 是一个类似的问题,关于如何实现我已经尝试回答的 ONVIF 兼容接口,但因为在这种情况下,我猜你只想要视频流并使用 gSoap 或任何会违反第三方软件限制,这是我会做的:

1) 为了使 ONVIF 客户端能够检索您的流 URL,您需要实施对 GetStreamUri ONVIF 请求的响应 - 通过它您可以 return实际的 RTSP link,如果你有某种 RTSP 服务器 运行(我想 live555 是这些天最常见的选择)那么客户端将继续连接到 RTSP 服务器并获得流。我假设 Raspberry Pi 有一些 out-of-the-box RTSP 流媒体解决方案,所以我不会谈论如何设置 live555。

2) 要使 GetStreamUri 正常工作,客户端需要知道此特定流的配置文件令牌。这就是您需要实施 GetProfiles 请求的原因。我假设因为您正在为一个确切的用例编写解决方案,所以只需预定义 xml 对此请求的响应并使用单个配置文件和硬编码令牌。 GetProfiles 请求本身不依赖于任何输入参数,因此您在这里应该是安全的。 ONVIF 客户端也可以发送一些授权 headers,但您也可以在开始时忽略它们并在实际流式传输 运行 时实施授权。 ONVIF 客户端也可能会发送许多其他请求,例如功能等,但您现在可以忽略这些请求。一个重要的请求是 GetSystemDateAndTime - ONVIF 客户端查询此请求,因为授权令牌中使用了时间戳。

我会做的是创建一个简单的 C/C++ 网络服务器,为这 3 个请求预定义 xml 答案,采用通用的 ONVIF 客户端,如 ODM(Onvif 设备管理器)并尝试从它连接到相机,看看会发生什么,如果发出任何其他请求阻止流量。我的猜测是它实际上可以按以下顺序与这三个一起使用:GetSystemDateAndTime -> GetProfiles -> GetStreamUri。我可能是错的,客户端可能会查询其他内容并且没有收到答案可能会导致它停止采取任何进一步的行动,但我不确定这一点。