Трансляция удаленной ip-камеры dlink DSC-2102 через сайт: java-plugin или +ActiveX

По долгу службы совсем недавно пришлось еще раз столкнуться с этим замечательным устройством.

DCS-2102.jpg

Настраивать конечно не настраивал (хотя мега-сложного в этом нет) — этим занимался другой человек, в руках тоже не держал — к камере был доступ удаленно, ей был выделена 100мбитная линия и статический ip-адрес.

А задача встала следующая (в первом приближении):

Сделать вещание с камеры на сайт.

Ну, сказано — сделано…

С чего начать?

Можно конечно почитать мануал. Но это не путь русского дровосека. Перед тем, как заглядывать в мануал, нужно сначала головой «свалить пару сосен». Хотя конечно поставленная задача нигде ни в каком официальном мануале не описывается. Но это ладно, это пусть. Но вот почему так тяжело найти url, по которым происходит вещание?

В общем рыская по статьям и форумам, я наткнулся (нет-нет, вовсе не на сайте dlinka конечно, это было бы слишком легко) на хорошую статейку по захвату с сетевых камер. Оттуда я извлек кое что полезное для себя:

Новые модели:
DCS-930,
DCS-1100, DCS-1130,
DCS-2102, DCS-2121,
DCS-3110, DCS-3410, DCS-3411, DCS-3415, DCS-3430, DCS-3710
DCS-5230,DCS-5605, DCS-5635
DCS-6111, DCS-6410, DCS-6510, DCS-6511, DCS-6817, DCS-6818
DCS-7110, DCS-7410, DCS-7510, DCS-7510
DVS-210-1, DVS-310-1

(mjpeg) /video/mjpg.cgi или /video/mjpg.cgi?profileid=НОМЕР_ПРОФИЛЯ
номер профиля см. в веб-интерфейсе настройки камеры «Setup -> Audio and Video», обычно 3 (MJPEG)
(snapshot jpeg) /image/jpeg.cgi

DCS-910/920
(mjpeg) /mjpeg.cgi ( прим.: только AVReg )
(snapshot jpeg) /image.jpg
возможны запросы в верхнем регистре, например /MJPEG.CGI и /IMAGE.JPG.

DCS-3110, DCS-5610, DCS-6110
(mjpeg) /video.mjpg или /video2.mjpg
(snapshot jpeg) /cgi-bin/viewer/video.jpg

DCS-900
/video.cgi?resolution=640×480
или
/video.jpg?resolution=640×480
см. также http://forum.linuxdvr.ru/viewtopic.php?t=100

DCS-2000+, DCS-2100, DCS-2120, DCS-3230, DCS-5220, DCS-5300, DCS-6620(G)
(snapshot jpeg) /cgi-bin/video.jpg

MJPEG видеошлюзы DVS-104, DVS-301
/cgi-bin/video.cgi?cam=N&quality=Q&size=S
или
/cgi-bin/video.jpg?cam=N&quality=Q&size=S
где
N — номер канала (камеры),
Q=1,2,3,4,5 — чем больше цифра тем выше качество изображения и больше размер кадра,
S=1(176х144), 2 и 4 (352х288), 3 и 5 (704х576) (прим: для стандарта PAL)

Приятная находка, из которой я извлек для себя, что мне нужно ломиться по адресу:

http://[ЛОГИН:ПАРОЛЬ@]IP-АДРЕС[:ПОРТ]/video/mjpg.cgi?profileid=НОМЕР_ПРОФИЛЯ(1,2,3)

В частности первое, что я сделал, засунул этот адрес в тег <img> и получил довольно сносную картинку в браузерах Firefox, Chrome и Safari. Картинка конечно подергивалась, но частота обновления все же была выше чем у web-камеры. Но основной недостаток был все же в том, что это была картинка, к тому же работающая не во всех браузерах.

Решено было включить в список поддерживаемых браузеров IE, для этого был использован позаимствованный на просторах сети код для плагина ActiveX:


<?php
$URL=«http://».$login_pass.«@».$ip.«:».$port.«/activex/AMC.cab#version=4,0,16,0»;
$WIDTH=‘800’;
$HEIGHT=‘600’;
$HTML=
<script language=»JavaScript» type=»text/javascript»>
function InitActiveX(dcscontrol1)
{
var dcscontrol1 = document.getElementById(«dcscontrol1»);
dcscontrol1.RemoteHost=»‘.$ip.‘»;
dcscontrol1.RemotePort=»‘.$port.‘»;
dcscontrol1.SetAuthentication(«Basic ‘.base64_encode($login_pass).‘»); // авторизация, закодирована методом base64
dcscontrol1.ProfileID = «‘.$profileId.‘»; //номер профиля
dcscontrol1.LiveStreamIn (1); //включить видео
dcscontrol1.LiveStreamIn (2); //включить звук
}
function initForm()
{
var dcscontrol1 = document.getElementById(«dcscontrol1»);
InitActiveX(dcscontrol1);
dcscontrol1.width = «‘.$WIDTH.‘»; //размер окна
dcscontrol1.height = «‘.$HEIGHT.‘»;
}
window.onload = function ()
{
initForm();
};
</script>
<div>
<object classid=»clsid:721700FE-7F0E-49C5-BDED-CA92B7CB1245″ id=»dcscontrol1″>
<param name=»RemoteHost» value=»‘.$ip.‘»/>
<param name=»RemotePort» value=»‘.$port.‘»/>
</object>
</div>
;
?>

Метод работает, напомню, использует ActiveX и работает только в internet explorer. При первой загрузке браузер должен выдать предложение загрузки соответствующего плагина. Но как показывает практика, ведет он себя не всегда так (IE вообще всегда ведет себя НЕ ТАК, как можно ожидать, хотя это тоже зависит от кривизны собственных рук) и панель бывает не выезжает. Пользователь при этом видит белый лист, секунд пять может еще ждет и уходит, что не есть гуд.

Альтернативу я обнаружил копаясь в страничке самой камеры в виде подключения плагина, но на сей раз java:


<object width="640" height="480" java_codebase="http://'.$ip.':'.$port.'/?profileid='.$profileid.'" classid="java:xplug.class" type="application/x-java-applet" archive="xplug.jar" name="xplugApplet" id="xplugApplet"><!--адрес, порт, профиль-->
<param name=«archive» value=«xplug.jar»>
<param name=«code» value=«xplug»>
<param name=«codebase» value=«http://’.$ip.’/dcsclictrl.cab#version=1,0,0,2609»><!—ip—>
<param name=«scriptable» value=«true»>
<param name=«name» value=«cvcs»>
<param name=«type» value=«application/x-java-applet;version=1.4»><!—версия java—>
<param name=«menuheight» value=«40»>
<param name=«RemotePort» value=«‘.$port.'»/><!—удаленный порт—>
<param name=«Timeout» value=«5000»>
<param name=«mayscript» value=«true»>
<param name=«xmode» value=«preview»>
<param name=«productID» value=«DCS-2102»>
<param name=«profileid» value=«‘.$profileId.'»><!—шифрованный пароль—>
<param name=«bg» value=«0xd5dfea»>
<param name=«inittrigger» value=«1»>
<param name=«imageWidth» value=«640»><!—размеры—>
<param name=«imageHeight» value=«480»>
<param name=«webEvent» value=«1»>
<param name=«pageContext» value=«Basic ‘.base64_encode($login_pass).'»> <!—шифрованный пароль—>
<param name=«microphone» value=«1»> <!—включить звук с камеры —>
<param name=«speaker» value=«0»> <!—включить передачу голоса на камеру—>
</object>

Да, этот плагин требует установленной java-машины на компьютере клиента, зато почти гарантирует работу в браузерах: Firefox, Opera, Internet Explorer. В Chrome (и, смею предположить в Safari) данный метод не работает.

К минусам можно отнести:

  • серьезную нагрузку на процессор, ~ +50% к текущей загрузке на процессоре DualCore 2.2 GHz
  • ожидание чуть меньше 5 секунд на то, пока плагин подаст первые признаки жизни
  • необходимость участия пользователя — необходимо один раз разрешить плагину загрузиться, чтобы использовать его для просмотра (казалось бы мелочь, но все же)

В любом случае java-плагин в данном случае универсальнее, кроме того через него отлично передается аудио вещание.

Конечно максимальной универсальности можно было бы добиться перекодировав rtsp-поток с камеры через видео-сервер и выдавая наружу уже перекодированным, пригодным для скармливания flash-плееру, но rtsp у нас почему-то не завелся, так что пришлось довольствоваться тем, что есть.

Полезно(3)Бесполезно(3)
Комментарии закрыты.