我在 OpenWRT 上使用 nginx 来反向代理来自 IP 摄像机的运动 jpeg 提要,但我遇到了长达 10-15 秒的延迟,即使在帧大小和速率非常低的情况下也是如此。从路径中移除 OpenWRT 设备后,可以毫无延迟地访问相机。
由于延迟的长度(以及它随时间增长的事实),这看起来像是某种缓冲/缓存问题。我已经设置好了proxy_buffering off
,但是还有什么我应该注意的吗?
谢谢。
我在 OpenWRT 上使用 nginx 来反向代理来自 IP 摄像机的运动 jpeg 提要,但我遇到了长达 10-15 秒的延迟,即使在帧大小和速率非常低的情况下也是如此。从路径中移除 OpenWRT 设备后,可以毫无延迟地访问相机。
由于延迟的长度(以及它随时间增长的事实),这看起来像是某种缓冲/缓存问题。我已经设置好了proxy_buffering off
,但是还有什么我应该注意的吗?
谢谢。
我在 Arduino Yun 上安装了 mjpg-streamer,然后在我的路由器设置中设置端口转发白名单仅到我的网络服务器。
这是我的 Nginx 配置,它位于启用站点的目录中。
server {
listen 80;
server_name cam.example.com;
error_log /var/log/nginx/error.cam.log;
access_log /var/log/nginx/access.cam.log;
location / {
set $pp_d http://99.99.99.99:9999/stream_simple.html;
if ( $args = 'action=stream' ) {
set $pp_d http://99.99.99.99:9999/$is_args$args;
}
if ( $args = 'action=snapshot' ) {
set $pp_d http://99.99.99.99:9999/$is_args$args;
}
proxy_pass $pp_d;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Request-Start $msec;
}
}
我从来没有让这个工作让我对 nginx 感到满意。根据您的具体需求,两种解决方案可能就足够了:
如果您可以容忍流在不同的端口上,请使用 OpenWRT 内置防火墙的端口转发功能将其通过。
使用 tinyproxy 的反向代理功能。默认包具有被标志禁用的反向代理功能,因此您需要自行检查和构建它。这种方法肯定更繁琐,但也确实有效。
我仍然有兴趣听到有人使用 nginx 进行这项工作。
我在 Openwrt BB (wndr3800) 上有 Nginx 反向代理到 dlink 932LB1 ip cam,它运行良好。即使在我禁用 proxy_buffering 之前,也没有明显的滞后。如果我有很多东西通过网络传输,视频可能会变得断断续续,但不会比浏览器(或我的任何 ip cam 应用程序)直接连接到相机的链接更多。所以……这是可能的。
Nginx 是我要走的路。我尝试使用 tinyproxy 和 lighttpd 进行反向代理,但每个都缺少 OpenWrt 上的功能。tinyproxy 和 lighttpd 都需要针对完整的反向代理功能进行自定义编译,并且 (AFAIK) lighttpd 将不接受代理指令中的 FQDN。
这就是我要做的:
我会在这里包含我的 nginx.conf,除了它没有什么不寻常的地方......只是简单的代理东西。如果流量确实是你的罪魁祸首,你可以试试 tcpdump 或 wireshark 看看是什么让你的 LAN 变得混乱。
但听起来你的路由器是延迟的原因。也许硬件无法处理 CPU/流量负载,或者您的 Openwrt 设置中可能有其他东西占用了高速公路。您的视频是否流畅且只是延迟?还是您看到严重断断续续的视频?您提到的延长延迟听起来确实像缓冲区/缓存的事情......但我不知道会做什么。