建立实时视频流管道并非易事。它需要多个组件协调工作,以无缝捕获、处理和传输视频数据。在本文中,我将向您介绍我所构建的架构,该架构用于将交通摄像头源转换为 RTSP 流,使用人工智能对其进行分析,并通过 WebRTC 将其传输到 Web 应用程序。虽然我不会深入探讨专有细节,但我会与大家分享我在使用过程中遇到的工具、技术和挑战。
问题:实时视频流和分析
目标是创建一个系统,以便:
- 捕捉交通摄像头的实时视频流。
- 将视频转换为 RTSP 流进行处理。
- 使用人工智能模型分析视频,以获得实时洞察。
- 将视频传输到 Web 应用程序,以供实时查看。
这就需要一个强大的架构,能够以最小的延迟处理视频摄取、转换、分析和交付。
架构
以下是架构的高级概览:
- 交通摄像头源:实时视频源。
- FFmpeg:用于处理视频并将其转换为 RTSP 流。
- MediaMTX:充当 RTSP 服务器和 WebRTC 网关。
- 人工智能模型:分析视频流以获得洞察力。
- Web 应用:通过 WebRTC 显示实时视频流。
让我们分解每个组件。
1. 捕捉交通摄像头的图像
交通摄像头一般以 H.264 或 H.265 等格式输出视频,通常通过 RTSP 或 HTTP 等协议进行流式传输。然而,要找到与我的具体要求相匹配的免费视频源具有挑战性。经过一番搜索,我偶然发现了一个使用 MJPG 格式的交通摄像头视频源。虽然这不是我的首选,但我知道 FFmpeg 可以处理转换,所以这并不是一个大问题。
视频流 URL 示例:
http://64.191.148.57/mjpg/video.mjpg
如果你的摄像机原生不支持 RTSP,FFmpeg 就是你的救星。它能让你捕捉视频并将其转换为 RTSP 流,使其与你的流媒体管道兼容。
2. 使用 FFmpeg 处理视频
FFmpeg是一款功能强大的视频处理工具。我用它来:
- 将视频转码为适合流媒体的格式。
- 将视频打包成RTSP流。
FFmpeg 命令示例:
ffmpeg -re -i <http://64.191.148.57/mjpg/video.mjpg> -c:v libx264 -preset ultrafast -tune zerolatency -g 30 -r 30 -f rtsp -rtsp_transport tcp rtsp://localhost:8554/[PATH_FOR_VIDEO_ON_MEDIA_MTX]
该命令的作用
此 FFmpeg 命令:
- 将 MJPEG 视频流作为输入。
- 使用 libx264 编解码器将其转换为 H.264 格式。
- 通过
ultrafast
预设和zerolatency
调整优化编码,以实现低延迟。 - 通过 TCP 将视频输出为 RTSP 流。
- 将视频流发布到指定的 RTSP URL。
3. 使用 MediaMTX 进行流式传输
MediaMTX是一款轻量级服务器,支持 RTSP、RTMP 和 WebRTC。我用它来:
- 充当转换后的视频流的RTSP服务器。
- 将 RTSP 流转换为 WebRTC 以进行基于浏览器的流式传输。
MediaMTX 配置:下面使用 MediaMTX 配置文件:
authMethod: jwt
authJWTClaimKey: mediamtx_permissions
authJWTJWKS: https://example.com/api/auth/fetch-public-key
logLevel: debug
logDestinations:
- stdout
api: true
apiAddress: ':9997'
rtsp: true
protocols:
- udp
- multicast
- tcp
encryption: 'no'
rtspAddress: ':8554'
paths:
all:
source: publisher
webrtc: true
webrtcAddress: ':8889'
webrtcAllowOrigin: '*'
webrtcHandshakeTimeout: 100s
主要特点
1. JWT 身份验证:
- 使用 JWT 进行安全访问控制。
- 使用从 JWKS 端点获取的公钥验证令牌。
- 权限在声明中定义
mediamtx_permissions
。
2. 记录:
- 用于故障排除的调试级别日志。
- 日志输出到控制台(
stdout
)。
3. API:
- 在端口
9997
上启用 MediaMTX API以进行编程控制。
4. RTSP 流媒体:
- 支持通过 UDP、多播和 TCP 的 RTSP。
- 端口
8554
上有可用的流。
5. WebRTC流媒体:
- 启用 WebRTC 实现低延迟浏览器流式传输。
- 端口
8889
上有可用的流。 - 允许来自任何来源的连接()且握手超时时间为 100 秒。
这个配置只是冰山一角!比如还有 JWT 身份验证、RTSP 与 WebRTC 的设置以及安全最佳实践。
4. 使用人工智能分析视频
RTSP 流被输入到 AI 模型中进行实时分析。该模型处理每一帧以检测物体、计数车辆或识别异常。
5. 使用 WebRTC 将视频传送到 Web 应用程序
为了将视频流式传输到 Web 应用程序,我使用了 WebRTC,它是低延迟、点对点通信的理想选择。MediaMTX 通过充当 WebRTC 网关使此过程变得简单。
WebRTC 设置:
- MediaMTX 在 公开了一个 WebRTC 端点
http://localhost:8889/stream/webrtc
- 您可以使用 WebRTC 库连接到此端点。像 PeerJS 或 SimpleWebRTC 这样的库。
挑战和潜在解决方案
1. 延迟
实现低延迟对于实时流式传输至关重要。以下是我解决此问题的方法:
- FFmpeg 优化:使用
ultrafast
预设来最大限度地减少编码延迟。 - MediaMTX 配置:微调 MediaMTX 设置,实现低延迟流式传输。
2. 可扩展性
最初,我的重点是让单个流正常工作。现在,我正在探索扩展系统以处理多个流的方法。主要考虑因素包括:
- 多个 FFmpeg 实例:运行多个 FFmpeg 进程来处理并发流并测试 MediaMTX 在可支持的流数量方面的限制。
- 负载平衡:根据压力测试的结果,可能使用负载平衡器在多个 MediaMTX 实例之间分配流量。
- AI 可扩展性:虽然不是当前的优先事项,但扩展 AI 分析组件以有效处理多个流在未来将至关重要。
3. 可靠性
可靠性尚未成为主要关注点。提高可靠性的关键步骤包括:
- 监控系统:实施监控解决方案来跟踪流媒体管道的健康状况。
- 自动恢复:添加逻辑以自动重新启动失败的组件(例如,FFmpeg 或 MediaMTX)并在发生中断时重试连接。
工具和资源
以下是我认为非常有价值的工具和文档:
结论
构建实时视频流管道是一项复杂但有益的任务。通过利用 FFmpeg、MediaMTX 和 WebRTC 等工具,我能够创建一个以最小延迟捕获、处理、分析和交付实时视频的系统。无论您使用的是交通摄像头还是任何其他视频源,此架构都为实时流式传输应用程序提供了坚实的基础。
作者:SAMUEL OLAMIDE
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/webrtc/55819.html