我有一个php页面,作为某些IP摄像机的mjpeg流的代理
....
header('Content-Type: multipart/x-mixed-replace; boundary=myboundary');
readfile('http://<local_server_ip>:<port>/'.$camId."/mjpg";
ob_end_flush();
....
和一个html / javascript页面,我在img标签中显示mjpeg,以及相机功能(向左,向右,向上,向下移动)。
在同一页面上少于6台摄像机,一切都很好;一旦我添加第6个摄像头,其他一切都停止工作:我可以看到6个摄像头流,但我不能再在页面上做任何其他事情 - 按下退出按钮或按相机移动按钮不做任何事,Dev工具将操作显示为待处理。
我已经读过,域(https://stackoverflow.com/a/985704/3668883)和Chrome(我正在使用)的最大持久性http连接数有限制,限制为6。
我无法从等式中删除php代理 - 此页面也必须可以从外部访问,所以我不能将本地ip放在img标记中。
有没有人知道这样做的方法?
答案 0 :(得分:0)
为相机代理创建子域。这些子域都可以指向同一个服务器。
基本上,这将是设置:
NAME TYPE VALUE
--------------------------------------------------
camproxy.example.com. A 127.0.0.1
cam1.example.com. CNAME camproxy.example.com.
cam2.example.com. CNAME camproxy.example.com.
cam3.example.com. CNAME camproxy.example.com.
cam4.example.com. CNAME camproxy.example.com.
...
然后,在您的控制页面中,或者只使用每个子域一次,或者跟踪您使用过的子域数。例如:
function getCamUrl($file) {
static $subdomain = 1;
static $uses = 0;
$uses++;
if($uses > 6) {
$uses = 0;
$subdomain++;
}
return "cam" . $subdomain . ".example.com/" . $file;
}
echo '<img src="'. getCamUrl('video1.mjpeg') .'">';
echo '<img src="'. getCamUrl('video2.mjpeg') .'">';
echo '<img src="'. getCamUrl('video3.mjpeg') .'">';
echo '<img src="'. getCamUrl('video4.mjpeg') .'">';
根据规范,浏览器应该只使用2个连接。您可以将其设置为6,这适用于大多数现代浏览器。