Как я могу отображать 6 или более потоков mjpeg на одной странице?

У меня есть php-страница, которая действует как прокси для потока mjpeg для некоторых IP-камер.

....
header('Content-Type: multipart/x-mixed-replace; boundary=myboundary');
readfile('http://<local_server_ip>:<port>/'.$camId."/mjpg";
ob_end_flush();
....

и страница html/javascript, где я отображаю mjpeg в теге img вместе с функциями камеры (перемещение влево, вправо, вверх, вниз).

Все отлично работает с менее чем 6 камерами на одной странице; как только я добавляю 6-ю камеру, все остальное перестает работать: я вижу потоки 6-ти камер, но больше ничего не могу делать на странице — нажатие кнопки выхода из системы или нажатие кнопок перемещения камеры ничего не делает, как показывает Dev Tools действия в ожидании.

Я читал, что существует ограничение на максимальное количество постоянных http-подключений к домену (https://stackoverflow.com/a/985704/3668883), а в Chrome (который я использую) ограничение равно 6.

Я не могу удалить php-прокси из уравнения - эта страница также должна быть доступна извне, поэтому я не могу указать локальный ip в теге img.

Кто-нибудь знает способ сделать это?


person user3668883    schedule 26.05.2014    source источник


Ответы (1)


Создайте поддомены для прокси камеры. Все эти поддомены могут указывать на один и тот же сервер.

В принципе, это будет установка:

    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, это работает в большинстве современных браузеров.

person RickN    schedule 27.05.2014
comment
Спасибо за ваш ответ. К сожалению, мне не разрешено создавать поддомены. Я нашел способ сделать это, не создавая их. Я добавил 2 новых виртуальных хоста в httpd.conf с тем же доменом, только с разными портами, затем на моей странице отображения использовался другой порт для каждых 3 тегов изображения. - person user3668883; 27.05.2014