我希望捕获 rtsp 流并使用 ffmpeg 将其转换为 mjpeg(通过 http)流。我运行的是 Ubuntu 20。我已经搜索了很多解决方案,主要发现:
a) 需要 ffserver 的解决方案(已弃用)
b) 从 mjpeg 转换为 rtsp 的解决方案
c) 从 rtsp 转换为 hls(nginx、wowza 等)的解决方案,这在我的应用程序中不起作用。我需要 http 输出为 mjpeg。
d) vlc - 确实可以工作,但需要太多的可用处理器(80%)
e) rtsp2mjpg - 我安装的 github 项目,但无法开始工作,也无法获得任何支持。
我不是 ffmpeg 专家,所以如果有人可以指导我解决这个问题(如果存在),我将非常感激。
小智 5
在发现与您完全相同的事情后,我最近自己解决了这个问题。您需要的两个部分是(1)脚本中的 ffmpeg 转换,以及(2)类似 lighttpd+cgibin 或 nginix+fastcgi 的东西来通过 http/https 提供服务。不过,我不认为您在 CPU 使用方面能够比 vlc 做得更好。
此 bash 脚本会将 ffmpeg 转换为 MJPEG,并将输出发送到 stdout。将其放入 lighttpd 的 cgi-bin 文件夹中(对我来说是 /var/www/cgi-bin )。将其命名为“webcamstream”,然后调整 rtsp:// URL 以适合您的相机:
#!/bin/bash
echo "Content-Type: multipart/x-mixed-replace;boundary=ffmpeg"
echo "Cache-Control: no-cache"
echo ""
ffmpeg -i "rtsp://192.168.60.13:554/user=admin&password=SECRET&channel=1&stream=0.sdp" -c:v mjpeg -q:v 1 -f mpjpeg -an -
Run Code Online (Sandbox Code Playgroud)
为lighttpd启用cgi-bin:
ln -s /etc/lighttpd/conf-available/10-cgi.conf /etc/lighttpd/conf-enabled/10-cgi.conf
Run Code Online (Sandbox Code Playgroud)
..然后调整lighttpd的cgi-bin配置(/etc/lighttpd/conf-enabled/10-cgi.conf),如下所示。Stream-response-body 设置很重要,因为它会在客户端断开连接时停止流,并且避免 lighttpd 在向客户端发送任何内容之前尝试缓冲整个无限流。
server.modules += ( "mod_cgi" )
$HTTP["url"] =~ "^/cgi-bin/" {
server.stream-response-body = 2
cgi.assign = ( "" => "" )
alias.url += ( "/cgi-bin/" => "/var/www/cgi-bin/" )
}
Run Code Online (Sandbox Code Playgroud)
使 cgi-bin 脚本可执行并重新启动 lighttpd:
chmod +x /var/www/cgi-bin/webcamstream
systemctl restart lighttpd
Run Code Online (Sandbox Code Playgroud)
...应该就是这样。然后,您可以通过如下 URL 访问 MJPEG 流,其中最后一部分是脚本的名称:
http://serveraddress/cgi-bin/webcamstream
Run Code Online (Sandbox Code Playgroud)
我在这里更详细地写了它:Converting RTSP to HTTP on Demand
据我所知,您无法避免转换对 CPU 的影响 - RTSP 与 MJPEG 帧的格式/编码是不同的。我通过配置相机来降低源的帧速率和分辨率来减少 CPU 负载,直到它在 ffmpeg 上达到可接受的负载。您也可以使用 ffmpeg 参数更改分辨率和帧速率,但它仍然必须首先解码完整帧并完成调整大小的工作。
上面的路径是在 Debian 上的,因此您可能需要调整它们以适合您的 Ubuntu 系统。
归档时间: |
|
查看次数: |
12965 次 |
最近记录: |