如何在同一页面上渲染6个或更多mjpeg流?

时间:2014-05-26 07:42:22

标签: php http mjpeg

我有一个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标记中。

有没有人知道这样做的方法?

1 个答案:

答案 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,这适用于大多数现代浏览器。