{"id":233237,"date":"2014-08-13T17:51:03","date_gmt":"2014-08-13T13:51:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=233237"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=233237","title":{"rendered":"<span class=\"post_title\">\u0415\u0449\u0435 \u0440\u0430\u0437 \u043e \u0432\u0438\u0434\u0435\u043e\u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0438, \u043a\u0430\u043c\u0435\u0440\u0430\u0445, RTSP, onvif. \u0418 \u00ab\u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u00bb!<\/span>"},"content":{"rendered":"<div class=\"content html_format\">     \t\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435: <a href=\"http:\/\/habrahabr.ru\/post\/115808\/\">habrahabr.ru\/post\/115808\/<\/a> \u0438 <a href=\"http:\/\/habrahabr.ru\/post\/117735\/\">habrahabr.ru\/post\/117735\/<\/a><br \/>  \u0422\u0430\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f Motion-JPEG (MJPEG).<br \/>  \u041c\u0438\u0440 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0438 \u0432\u0438\u0434\u0435\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 \u0442\u043e\u0436\u0435. \u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u0438 \u0447\u0430\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u0434\u0435\u043a\u0438.<br \/>  \u0422\u0443\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442 \u0432 \u044d\u0442\u043e\u043c \u00ab\u043c\u0438\u0440\u0435\u00bb.<br \/>  \u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043d\u0435 \u0443\u0437\u043d\u0430\u044e\u0442, \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<br \/>  \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0451 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438.<br \/>  \u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e RTP, RTSP, h264, mjpeg, onvif \u0438 \u0432\u0441\u0451\u043c \u0432\u043c\u0435\u0441\u0442\u0435.<br \/>  \u041f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u0430, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 RTSP \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c:  <\/p>\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/115808\/\">habrahabr.ru\/post\/115808\/<\/a><\/li>\n<li><a href=\"http:\/\/ru.wikipedia.org\/wiki\/RTSP\">ru.wikipedia.org\/wiki\/RTSP<\/a><\/li>\n<li><a href=\"http:\/\/www.ietf.org\/rfc\/rfc2326.txt\">www.ietf.org\/rfc\/rfc2326.txt<\/a><\/li>\n<\/ul>\n<p>  \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c RTSP \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0432\u0438\u0434\u0435\u043e \u0434\u0430\u043d\u043d\u044b\u0435. \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0432\u044f\u0437\u0438 \u0432\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 RTP (<a href=\"http:\/\/tools.ietf.org\/html\/rfc3550\">RFC<\/a>).<\/p>\n<p>  \u041f\u043e RTP \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c 2 \u0432\u0438\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438  <\/p>\n<ol>\n<li>Non-Interleaved Mode (UDP)<\/li>\n<li>Interleaved Mode (TCP)<\/li>\n<\/ol>\n<p>  Non-Interleaved Mode.<br \/>  RTSP \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u044c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0432 \u043a\u0430\u043c\u0435\u0440\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c \u00ab\u043a\u0443\u0434\u0430 \u0441\u043b\u0430\u0442\u044c\u00bb \u0434\u0430\u043d\u043d\u044b\u0435 (UDP \u043f\u043e\u0440\u0442\u044b).<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0449\u0435\u043d\u0438\u044f RTSP<\/p>\n<pre><code class=\"html\">\/\/INFO: connect to: rtsp:\/\/10.112.28.231:554\/live1.sdp  OPTIONS rtsp:\/\/10.112.28.231:554\/live1.sdp RTSP\/1.0 CSeq: 1 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21)  RTSP\/1.0 200 OK CSeq: 1 Date: Tue, Jan 15 2013 02:02:56 GMT Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER   DESCRIBE rtsp:\/\/10.112.28.231:554\/live1.sdp RTSP\/1.0 CSeq: 2 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21) Accept: application\/sdp   RTSP\/1.0 200 OK CSeq: 2 Date: Tue, Jan 15 2013 02:02:56 GMT Content-Base: rtsp:\/\/10.112.28.231\/live1.sdp\/ Content-Type: application\/sdp Content-Length: 667 \/\/667 - \u0420\u0430\u0437\u043c\u0435\u0440 SDP \u043f\u0430\u043a\u0435\u0442\u0430, \u043e \u043d\u0435\u043c \u043f\u043e\u0437\u0436\u0435   SETUP rtsp:\/\/10.112.28.231:554\/live1.sdp\/track1 RTSP\/1.0 CSeq: 3 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21) Transport: RTP\/AVP;unicast;client_port=49501-49502   RTSP\/1.0 200 OK CSeq: 3 Date: Tue, Jan 15 2013 02:02:56 GMT Transport: RTP\/AVP;unicast;destination=10.112.28.33;source=10.112.28.231;client_port=49501-49502;server_port=6970-6971 Session: 7BFE9DAA   SETUP rtsp:\/\/10.112.28.231:554\/live1.sdp\/track2 RTSP\/1.0 CSeq: 4 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21) Transport: RTP\/AVP;unicast;client_port=49503-49504 Session: 7BFE9DAA   RTSP\/1.0 200 OK CSeq: 4 Date: Tue, Jan 15 2013 02:02:56 GMT Transport: RTP\/AVP;unicast;destination=10.112.28.33;source=10.112.28.231;client_port=49503-49504;server_port=6972-6973 Session: 7BFE9DAA   PLAY rtsp:\/\/10.112.28.231:554\/live1.sdp RTSP\/1.0 CSeq: 5 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21) Session: 7BFE9DAA Range: npt=0.000-   RTSP\/1.0 200 OK CSeq: 5 Date: Tue, Jan 15 2013 02:02:56 GMT Range: npt=0.000- Session: 7BFE9DAA RTP-Info: url=rtsp:\/\/10.112.28.231\/live1.sdp\/track1;seq=7746;rtptime=0,url=rtsp:\/\/10.112.28.231\/live1.sdp\/track2;seq=13715;rtptime=0 <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c<br \/>  <code>Transport: RTP\/AVP;unicast;destination=10.112.28.33;source=10.112.28.231;client_port=49501-49502;server_port=6970-6971<\/code><\/p>\n<p>  Interleaved Mode.<br \/>  \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0441 Non-Interleaved Mode \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u044b\u043f\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0440\u0442.<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"html\">OPTIONS rtsp:\/\/10.113.151.152:554\/tcp_live\/profile_token_0 RTSP\/1.0 CSeq: 1 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21)   RTSP\/1.0 200 OK CSeq: 1 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21) Public: OPTIONS, DESCRIBE, SETUP, PLAY, TEARDOWN, SET_PARAMETER   DESCRIBE rtsp:\/\/10.113.151.152:554\/tcp_live\/profile_token_0 RTSP\/1.0 CSeq: 2 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21) Accept: application\/sdp   RTSP\/1.0 200 OK CSeq: 2 Content-Type: application\/sdp Content-Length: 316   SETUP rtsp:\/\/10.113.151.152:554\/tcp_live\/profile_token_0\/video\/h264 RTSP\/1.0 CSeq: 3 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21) Transport: RTP\/AVP\/TCP;unicast;interleaved=0-1   RTSP\/1.0 200 OK CSeq: 3 Session: 52cd95de Transport: RTP\/AVP\/TCP;interleaved=0-1;unicast   SETUP rtsp:\/\/10.113.151.152:554\/tcp_live\/profile_token_0\/audio\/pcma RTSP\/1.0 CSeq: 4 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21) Transport: RTP\/AVP\/TCP;unicast;interleaved=2-3 Session: 52cd95de   RTSP\/1.0 200 OK CSeq: 4 Session: 52cd95de Transport: RTP\/AVP\/TCP;interleaved=2-3;unicast   PLAY rtsp:\/\/10.113.151.152:554\/tcp_live\/profile_token_0 RTSP\/1.0 CSeq: 5 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21) Session: 52cd95de Range: npt=0.000-   RTSP\/1.0 200 OK CSeq: 5 Session: 52cd95de <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c<br \/>  <code>Transport: RTP\/AVP\/TCP;unicast;interleaved=0-1<\/code><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u0438 \u043a\u0430\u043a.<br \/>  \u041a\u0430\u043c\u0435\u0440\u044b \u0448\u043b\u044e\u0442 \u0432\u0438\u0434\u0435\u043e \u0438 \u0430\u0443\u0434\u0438\u043e \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 RTP \u043f\u043e\u0442\u043e\u043a\u0438. 2n \u043f\u043e\u0442\u043e\u043a \u2014 \u0434\u0430\u043d\u043d\u044b\u0435, 2n+1 \u043f\u043e\u0442\u043e\u043a \u2014 RTCP.<br \/>  \u041d\u0430 \u0432\u0438\u0434\u0435\u043e \u043d\u0430\u043c \u0438\u0434\u0435\u0442 0 \u0438 1 \u043a\u0430\u043d\u0430\u043b, \u043d\u0430 \u0430\u0443\u0434\u0438\u043e 2 \u0438 3 \u043a\u0430\u043d\u0430\u043b.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u043e\u0442\u0440\u0438\u043c<br \/>  <code>Transport: RTP\/AVP;unicast;destination=10.112.28.33;source=10.112.28.231;client_port=49501-49502;server_port=6970-6971 Transport: RTP\/AVP\/TCP;unicast;interleaved=0-1 <\/code><br \/>  \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043f\u043e\u0440\u0442\u044b, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u043d\u0430\u043b\u044b.<\/p>\n<p>  \u0421 \u0441 Non-Interleaved Mode \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u041f\u0440\u043e\u0441\u0442\u043e RTP \u043f\u0430\u043a\u0435\u0442\u044b \u0441\u044b\u043f\u044f\u0442\u0441\u044f \u0432 \u043f\u043e\u0440\u0442\u044b \u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u0442\u043e \u0442\u0430\u043a:<br \/>  <code>             DatagramPacket packet = new DatagramPacket(buffer, buffer.length);             s.receive(packet); <\/code><\/p>\n<p>  \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 Interleaved mode.<br \/>  \u041f\u043e \u0444\u0430\u043a\u0442\u0443 \u043d\u0438 \u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0431\u044b\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e. \u041f\u043e RFC \u043c\u044b \u0438\u0449\u0435\u043c magic char &quot;$&quot;, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u0430\u0439\u0442 \u2014 \u043a\u0430\u043d\u0430\u043b (\u043e\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 0-4 \u0443 \u043d\u0430\u0441) \u0438 2 \u0431\u0430\u0439\u0442\u0430 Length. \u0412\u0441\u0435\u0433\u043e 4 \u0431\u0430\u0439\u0442\u0430.<br \/>  \u041d\u043e \u0435\u0441\u0442\u044c \u043d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u0430\u043c\u0435\u0440\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 D-ling DCS-2103 \u00ab\u0414\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u00bb \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 rtp \u043f\u0430\u043a\u0435\u0442\u0430. frame \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 1448, <br \/>  \u0448\u043b\u0435\u0442 1448 \u0444\u0440\u0435\u0439\u043c\u0430, \u0438 \u043f\u043e\u0441\u043b\u0435 827 \u0431\u0430\u0439\u0442 \u043a\u0430\u043a\u043e\u0433\u043e \u0442\u043e \u043c\u0443\u0441\u043e\u0440\u0430. (\u0422\u0430\u043a \u0434\u0435\u043b\u0430\u0435\u0442 Dlink DCS-2103 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 1.00 \u0438 1.20)<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/970\/cc7\/da5\/970cc7da542247ccaea16c0c3374fb2b.png\"\/><br \/>  \u0418 \u0442\u0430\u043a\u043e\u0435 \u0443 \u00ab\u043d\u0438\u0445\u00bb \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e. \u042d\u0442\u0438\u043c \u0447\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u0434\u0430\u044e\u0442 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b. Qihan (356) \u044d\u0442\u0438\u043c \u043d\u0435 \u0441\u0442\u0440\u0430\u0434\u0430\u043b\u0438.<br \/>  \u041a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0443\u0441\u043e\u0440 \u0438\u0434\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442.<br \/>  \u0412 RTP \u0441\u044b\u043f\u044f\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u041f\u0440\u0438 DESCRIBE RTSP \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f SDP \u043f\u0430\u043a\u0435\u0442<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440\u044b SDP (h264, mjpeg, mpeg4):  <\/p>\n<pre><code class=\"html\">v=0 o=- 1357245962093293 1 IN IP4 10.112.28.231 s=RTSP\/RTP stream 1 from DCS-2103 i=live1.sdp with v2.0 t=0 0 a=type:broadcast a=control:* a=range:npt=0- a=x-qt-text-nam:RTSP\/RTP stream 1 from DCS-2103 a=x-qt-text-inf:live1.sdp m=video 0 RTP\/AVP 96 c=IN IP4 0.0.0.0 b=AS:1500 a=rtpmap:96 H264\/90000 a=fmtp:96 packetization-mode=1;profile-level-id=640028;sprop-parameter-sets=Z2QAKK2EBUViuKxUdCAqKxXFYqOhAVFYrisVHQgKisVxWKjoQFRWK4rFR0ICorFcVio6ECSFITk8nyfk\/k\/J8nm5s00IEkKQnJ5Pk\/J\/J+T5PNzZprQCgDLSpAAAAwHgAAAu4YEAAPQkAABEqjve+F4RCNQ=,aO48sA== a=control:track1 m=audio 0 RTP\/AVP 97 c=IN IP4 0.0.0.0 b=AS:64 a=rtpmap:97 G726-32\/8000 a=control:track2  v=0 o=- 1357245962095633 1 IN IP4 10.112.28.231 s=RTSP\/RTP stream 3 from DCS-2103 i=live3.sdp with v2.0 t=0 0 a=type:broadcast a=control:* a=range:npt=0- a=x-qt-text-nam:RTSP\/RTP stream 3 from DCS-2103 a=x-qt-text-inf:live3.sdp m=video 0 RTP\/AVP 26 c=IN IP4 0.0.0.0 b=AS:1500 a=x-dimensions:640,360 a=control:track1 m=audio 0 RTP\/AVP 97 c=IN IP4 0.0.0.0 b=AS:64 a=rtpmap:97 G726-32\/8000 a=control:track2  v=0 o=- 1357245962094966 1 IN IP4 10.112.28.231 s=RTSP\/RTP stream 2 from DCS-2103 i=live2.sdp with v2.0 t=0 0 a=type:broadcast a=control:* a=range:npt=0- a=x-qt-text-nam:RTSP\/RTP stream 2 from DCS-2103 a=x-qt-text-inf:live2.sdp m=video 0 RTP\/AVP 96 c=IN IP4 0.0.0.0 b=AS:1500 a=rtpmap:96 MP4V-ES\/90000 a=fmtp:96 profile-level-id=1;config=000001B001000001B509000001010000012000845D4C29402320A21F a=control:track1 m=audio 0 RTP\/AVP 97 c=IN IP4 0.0.0.0 b=AS:64 a=rtpmap:97 G726-32\/8000 a=control:track2 <\/code><\/pre>\n<p>  <a href=\"http:\/\/ru.wikipedia.org\/wiki\/Session_Description_Protocol\">\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e SDP<\/a><br \/>  \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0434\u0430 \u0431\u044b\u043b\u0430 mjpeg \u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043d\u0430 h264, \u0442\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445.<br \/>  \u0421 MJpeg \u0432\u0441\u0451 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u044f\u0441\u043d\u043e. \u0410 \u0432\u043e\u0442 \u0441 H264 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432 \u043a\u0430\u043c\u0435\u0440\u0430\u0445.<br \/>  \u0424\u043e\u0440\u043c\u0430\u0442 h264 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 NAL \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438 (<a href=\"http:\/\/ip.hhi.de\/imagecom_G1\/assets\/pdfs\/h264_iso-iec_14496-10.pdf\">7.4.1 NAL unit semantics<\/a>).<br \/>  \u0427\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c h264 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0430\u043c\u043e\u0433\u043e h264 \u0438\u043c\u0435\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 SPS (Sequence parameter set) \u0438 PPS(Picture parameter set). \u041f\u0435\u0440\u0432\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0430\u043c \u043a\u043e\u0434\u0435\u043a h264 \u0437\u043d\u0430\u044e \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e, \u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. SPS \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f 7, PPS 8. \u0411\u0435\u0437 \u043d\u0438\u0445 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c h264.<br \/>  \u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u2014 Qihan \u0448\u043b\u0435\u0442 SPS \u0438 PPS \u043f\u0440\u044f\u043c \u0432 RTP \u043f\u0430\u043a\u0435\u0442\u0430\u0445, Dlink \u043d\u0435 \u0448\u043b\u0435\u0442 \u0438\u0445 \u0432 RTP \u043f\u0430\u043a\u0435\u0442\u0430\u0445. \u041d\u043e SPS \u0438 PPS \u0448\u043b\u0435\u0442\u0441\u044f \u0432 SDP \u043f\u0430\u043a\u0435\u0442\u0435 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 sprop-parameter-sets \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 base64.<br \/>  <code>sprop-parameter-sets=Z2QAKK2EBUViuKxUdCAqKxXFYqOhAVFYrisVHQgKisVxWKjoQFRWK4rFR0ICorFcVio6ECSFITk8nyfk\/k\/J8nm5s00IEkKQnJ5Pk\/J\/J+T5PNzZprQCgDLSpAAAAwHgAAAu4YEAAPQkAABEqjve+F4RCNQ=,aO48sA==<\/code><br \/>  \u0428\u043b\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e<br \/>  \u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.  <\/p>\n<pre><code class=\"java\">\/\/split \u043f\u043e ',' sps = Base64.decode(props[0].getBytes()); pps = Base64.decode(props[1].getBytes()); <\/code><\/pre>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u043c\u0435\u0440\u044b 720p \u0438\u043b\u0438 1080p, \u0442\u043e \u0432 1 RTP \u043f\u0430\u043a\u0435\u0442 \u043d\u0438 jpeg \u0444\u0440\u0435\u0439\u043c, \u043d\u0438 h264 \u0444\u0440\u0435\u0439\u043c \u043d\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f, \u0442\u043e \u043e\u043d\u0438 \u0440\u0435\u0436\u0443\u0442\u0441\u044f \u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u044b.<br \/>  <a href=\"http:\/\/tools.ietf.org\/html\/rfc2435\">RTP Payload Format for JPEG-compressed Video<\/a><br \/>  <a href=\"http:\/\/tools.ietf.org\/html\/rfc6184\">RTP Payload Format for H.264 Video<\/a><\/p>\n<p>  JPEG<br \/>  RTP \u043f\u0430\u043a\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 main JPEG header  <\/p>\n<pre><code class=\"html\">    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    | Type-specific |              Fragment Offset                  |    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |      Type     |       Q       |     Width     |     Height    |    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <\/code><\/pre>\n<p>  \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 Type \u0438 Q  <\/p>\n<pre><code class=\"java\">if(getType() &lt; 64){             return JPEG_HEADER_SIZE;         } else if(getType() &lt; 128){             \/\/we have 3.1.7.  Restart Marker header             return JPEG_HEADER_SIZE + JPEG_RESTART_MARKER_HEADER_SIZE;         } <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f jpeg \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c quantization tables.<br \/>  \u0412 \u043c\u043e\u0438\u0445 \u043a\u0430\u043c\u0435\u0440\u0430\u0445 quantization tables \u0448\u043b\u0438 \u0432 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435 Jpeg, \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0440\u0430\u043b\u0438\u0441\u044c \u043e\u0442\u0442\u0443\u0434\u0430.<br \/>  \u0412\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0432 RFC.<br \/>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0444\u0440\u0435\u0439\u043c\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e RTP header Marker bit. \u0415\u0441\u043b\u0438 \u043e\u043d 1, \u0442\u043e \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0444\u0440\u0435\u0439\u043c\u0430.<\/p>\n<p>  H264<br \/>  NAL Header  <\/p>\n<pre><code class=\"html\">      +---------------+       |0|1|2|3|4|5|6|7|       +-+-+-+-+-+-+-+-+       |F|NRI|  Type   |       +---------------+ <\/code><\/pre>\n<p>  Single NAL Unit Packet<br \/>  \u042d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 SPS \u0438 PPS. Type=7 \u0438\u043b\u0438 Type=8  <\/p>\n<pre><code class=\"html\">     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |F|NRI|  Type   |                                               |     +-+-+-+-+-+-+-+-+                                               |     |                                                               |     |               Bytes 2..n of a single NAL unit                 |     |                                                               |     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |                               :...OPTIONAL RTP padding        |     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0444\u0440\u0435\u0439\u043c h264 \u043d\u0435 \u0432\u043b\u0435\u0437\u0430\u0435\u0442 \u0432 RTP \u043f\u0430\u043a\u0435\u0442 (1448 \u0431\u0430\u0439\u0442), \u0442\u043e \u0444\u0440\u0435\u0439\u043c \u0440\u0435\u0436\u0435\u0442\u0441\u044f \u043d\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b. (5.8. Fragmentation Units (FUs))<br \/>  Type = 28  <\/p>\n<pre><code class=\"html\">     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     | FU indicator  |   FU header   |                               |     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |     |                                                               |     |                         FU payload                            |     |                                                               |     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |                               :...OPTIONAL RTP padding        |     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <\/code><\/pre>\n<p>  \u042d\u0442\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 RTP \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430  <\/p>\n<pre><code class=\"java\">public int getH264PayloadStart() {         switch(getNAL().getType()){             case NAL.FU_A:                 return rtp.getPayloadStart() + 2;             case NAL.SPS:             case NAL.PPS:                 return rtp.getPayloadStart();             default:                 throw new NotImplementedException(&quot;NAL type &quot; + getNAL().getType() + &quot; not implemented&quot;);         }     } <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 h264 NAL \u2014 \u043d\u0443\u0436\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f. \u0415\u0441\u043b\u0438 \u0438\u0434\u0435\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0444\u0440\u0435\u0439\u043c\u0430, \u0442\u043e NAL \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c. (FU)<br \/>  \u043d\u0443\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 3 \u0431\u0438\u0442\u0430 \u0438\u0437 FU indicator \u0438 \u0441\u043b\u0438\u0442\u044c \u0438\u0445 \u0441 5 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 FU header.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u043e\u0442\u043e\u043a.<br \/>  Jpeg  <\/p>\n<pre><code class=\"java\">public void writeRawJPEGtoStream(OutputStream out) throws IOException {         \/\/if(isMustBeZero()){         if(isStart()){             \/\/first             \/\/System.out.println(&quot;first&quot;);             byte[] headers = new byte[1024];             int length = makeJpeg(headers);             out.write(headers, 0, length);             out.write(rtp.getBuffer(), getJPEGPayloadStart(), getJPEGPayloadLength());         }else         \/\/if(getMarker()){         if(isEnd()){             \/\/end             \/\/System.out.println(&quot;end&quot;);             out.write(rtp.getBuffer(), getJPEGPayloadStart(), getJPEGPayloadLength());             \/\/EOI         } else {           \/\/middle             \/\/System.out.println(&quot;middle&quot;);             out.write(rtp.getBuffer(), getJPEGPayloadStart(), getJPEGPayloadLength());         }     } <\/code><\/pre>\n<p>  h264  <\/p>\n<pre><code class=\"java\">public static final byte[] NON_IDR_PICTURE = {0x00, 0x00, 0x00, 0x01};  public void writeRawH264toStream(OutputStream out) throws IOException, NotImplementedException {         switch (nal.getType()){             case NAL.FU_A:    \/\/FU-A, 5.8.  Fragmentation Units (FUs)\/rfc6184                 FUHeader fu = getFUHeader();                  if(fu.isFirst()){                     \/\/if(debug) System.out.println(&quot;first&quot;);                     out.write(H264RTP.NON_IDR_PICTURE);                     out.write(getReconstructedNal());                     out.write(rtp.getBuffer(), getH264PayloadStart(), getH264PayloadLength());                 } else if(fu.isEnd()){                     \/\/if(debug) System.out.println(&quot;end&quot;);                     out.write(rtp.getBuffer(), getH264PayloadStart(), getH264PayloadLength());                 } else{                     \/\/if(debug) System.out.println(&quot;middle&quot;);                     out.write(rtp.getBuffer(), getH264PayloadStart(), getH264PayloadLength());                 }                 break;             case NAL.SPS: \/\/Sequence parameter set             case NAL.PPS: \/\/Picture parameter set                 \/\/System.out.println(&quot;sps or pps write&quot;);                 out.write(H264RTP.NON_IDR_PICTURE);                 out.write(rtp.getBuffer(), rtp.getPayloadStart(), rtp.getPayloadLength());                 break;             default:                 throw new NotImplementedException(&quot;NAL type &quot; + getNAL().getType() + &quot; not implemented&quot;);         }     } <\/code><\/pre>\n<p>  NON_IDR_PICTURE \u2014 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u00ab\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u00bb \u0444\u0440\u0435\u0439\u043c\u044b. (<a href=\"http:\/\/ip.hhi.de\/imagecom_G1\/assets\/pdfs\/h264_iso-iec_14496-10.pdf\">h264<\/a>)<br \/>  \u0422\u0443\u0442 \u043d\u0443\u0436\u043d\u043e \u043c\u0435\u043d\u044f \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043a\u043e\u0441\u0442\u044b\u043b\u044c\u00bb \u0438 \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442. \u041f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<br \/>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u043e\u043a: 00000001 + SPS + 00000001 + PPS + 00000001 + NAL\u2026<\/p>\n<p>  \u043d\u0443 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u00ab\u0432\u0441\u0435\u0433\u043e\u00bb \u044d\u0442\u043e\u0433\u043e  <\/p>\n<pre><code class=\"java\">while(!stop){                 IRaw raw = rtp;                 \/\/\u0447\u0438\u0442\u0430\u0435\u043c \u0444\u0440\u0435\u0439\u043c                 try {                     while(!frame.fill(in));                      \/\/\u043f\u043e\u043b\u044e\u0431\u043e\u043c\u0443 \u0447\u0438\u0442\u0430\u0435\u043c rtp \u043f\u0430\u043a\u0435\u0442                     rtp.fill(in, frame.getLength());                     try {                         raw = rtp.getByPayload();                     } catch (NotImplementedException e) {                         if(log.isLoggable(Level.FINE)) log.fine(&quot;rtp seq=&quot; + rtp.getSequence() + &quot;: &quot; + e.getMessage());                     }                 } catch (SocketException e) {                     log.warning(e.getMessage()); \/\/socket closed?                     break;                 }                  byte ch = frame.getChannel();                  \/\/RTCP? \/\/\u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 D-link DCS2103 1.00 \u0441\u043b\u0430\u043b\u0430 RTCP \u0438 interleaved                 Source s = sources.get(source(ch));                 if(rtp.getPayloadType() == RTPWrapper.TYPE_RTCP){                     byte[] rb = new byte[frame.getLength()];                     System.arraycopy(buffer, 0, rb, 0, rb.length);                     s.lastRTCP = new RTCP(rb, rb.length);    \/\/save last rtsp                     s.lastRTCPTime = System.currentTimeMillis();                     System.out.println(frame.getLength());                 } else {                     s.calculate(rtp); \/\/\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f source \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (\u0434\u043b\u044f \u043d\u0443\u0436\u0434 RTCP)                 }                  if(os.length &lt;= ch){                     log.warning(&quot;\u041d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 out \u0441\u0442\u0440\u0438\u043c\u043e\u0432: &quot; + ch);                     continue;                 }                  profiler.stop();                 counter.count(profiler.getLast(), frame.getLength() \/ 1000.0);                 \/\/profiler.print(0);                 if(os[ch] == null) continue;                  \/\/\u041d\u0443\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a os[ch] \u043c\u0435\u043d\u044f\u043b\u0441\u044f, \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e rotator                 synchronized (os[ch]){                     raw.writeRawToStream(os[ch]);                 }             } <\/code><\/pre>\n<p>  \u0432 2\u0445 \u0441\u043b\u043e\u0432\u0430\u0445. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c RTSP Interleaved Frame (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Channel: 0x00, 1448 bytes), \u0447\u0438\u0442\u0430\u0435\u043c 1448 \u0431\u0430\u0439\u0442, \u0434\u0435\u043b\u0430\u0435\u043c writeRawToStream, \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0432\u043e\u0435 \u0434\u0435\u043b\u043e.<\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043a\u0430\u0442\u0430\u0442\u044c.<br \/>  \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 RTSP \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c RTCP \u043e\u0442\u0447\u0435\u0442\u044b, \u043d\u043e \u043d\u0435\u0442, \u0432\u0441\u0451 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0449\u0435<br \/>  Dlink, Qihan, VLC \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u0435\u0434\u044f\u0442\u00bb GET_PARAMETER:  <\/p>\n<pre><code class=\"html\">GET_PARAMETER rtsp:\/\/10.112.28.231:554\/live3.sdp RTSP\/1.0 CSeq: 7 User-Agent: LibVLC\/2.1.4 (LIVE555 Streaming Media v2014.01.21) Session: 327B23C6 <\/code><\/pre>\n<p>  \u0448\u043b\u0435\u043c \u0435\u0433\u043e \u0440\u0430\u0437 \u0432 55 \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u0432\u0441\u0451.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434<br \/>  \u041f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043a\u0430\u043c\u0435\u0440\u0443 (http \u0438\u043b\u0438 rtsp) \u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u043e\u0442\u043e\u043a. \u0411\u0430\u0437\u0430 SQLite. \u00ab\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00bb \u043f\u043e\u0442\u043e\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 ffmpeg, \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0447\u0435\u0440\u0435\u0437 Vlc.<br \/>  \u041d\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u043a\u0438\u0445 \u043b\u0438\u0431\u043e \u0440\u0430\u0437\u0440\u044b\u0432\u043e\u0432 \u0441\u0432\u044f\u0437\u0438, \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0438 \u0442.\u0434.<br \/>  \u041d\u0435\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0448\u0442\u0443\u043a.<br \/>  \u041a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442<br \/>  \u041a\u043d\u043e\u043f\u043a\u0438  <\/p>\n<ol>\n<li>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c<\/li>\n<li>\u0423\u0434\u0430\u043b\u0438\u0442\u044c<\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c<\/li>\n<li>\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c<\/li>\n<li>\u0410\u0440\u0445\u0438\u0432<\/li>\n<li>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/li>\n<li>\u0412\u044b\u0445\u043e\u0434<\/li>\n<\/ol>\n<p>  \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \ud83d\ude42<\/p>\n<p>  \u0410\u0440\u0445\u0438\u0432  <\/p>\n<ol>\n<li>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u2014 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Vlc<\/li>\n<li>\u0421\u043a\u043b\u0435\u0438\u0442\u044c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u2014 \u043a\u043b\u0435\u0438\u0442 \u0444\u0430\u0439\u043b\u044b \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Vlc<\/li>\n<li>\u0412\u044b\u0445\u043e\u0434<\/li>\n<\/ol>\n<p>  \u041f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f m3u \u0444\u0430\u0439\u043b \u0438 \u043a\u043e\u0440\u043c\u0438\u0442\u0441\u044f \u0432 VLC<\/p>\n<p>  \u041f\u0440\u0438 \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u043d\u0438\u0438 ffmpeg \u043a\u043b\u0435\u0438\u0442, \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f VLC<\/p>\n<p>  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0440\u0435\u0437\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u043d\u0430 \u0444\u0430\u0439\u043b\u044b, \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445<\/p>\n<p>  \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 ffmpeg:<br \/>  \u041a\u043b\u0435\u0438\u0442  <\/p>\n<pre><code class=\"java\">String command = String.format(&quot;%s -y -f concat -i concat.txt -codec copy concat.mp4&quot;, <\/code><\/pre>\n<p>  \u00ab\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u00bb (\u043f\u0440\u043e\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u0442.\u0434.)  <\/p>\n<pre><code class=\"java\">String command = String.format(&quot;%s -i %s -codec copy %s&quot;,                     settings.getFfmpegPath(),                     settings.getFullTmpPath() + archive,                     settings.getArchivePath() + &quot;\/&quot; + settings.getRecPath() + &quot;\/&quot; + archive + &quot;.mp4&quot;) <\/code><\/pre>\n<p>  \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043a\u0443\u0447\u0430 \u0444\u0430\u0439\u043b\u043e\u0432<\/p>\n<p>  \u041f\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 OutputStream<br \/>  <a href=\"https:\/\/github.com\/Calc86\/camRecorder\">Git hub<\/a><br \/>  \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0436\u0438\u0437\u043d\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u0438\u0448\u0443 \u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u0431\u0443\u0434\u044c RTP \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u043b\u044f \u0437\u0432\u0443\u043a\u0430. (\u0442\u0430\u043a \u043a\u0430\u043a \u0443\u0432\u043b\u0435\u043a\u0430\u044e\u0441\u044c \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 SIP)<\/p>\n<p>  \u041d\u0443 \u0438 \u0441\u0430\u043c\u043e\u0435 \u0432\u043a\u0443\u0441\u043d\u043e\u0435.<br \/>  \u0415\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0432\u0438\u0434\u0435\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f ONVIF<br \/>  \u0415\u0441\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0436\u0435\u043b\u0435\u0437\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441 \u043a\u0430\u043c\u0435\u0440\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043d\u0435\u043c\u0443.<br \/>  \u0415\u0441\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e \u043d\u0435\u043c\u0443 (Qihan, \u043e\u043d \u0436\u0435 Proline), \u0430 \u0441\u0441\u044b\u043b\u043a\u0438 rtsp \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0433\u0443\u0433\u043b\u0438\u0442\u044c.<br \/>  \u0415\u0441\u0442\u044c \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 Onvif device manager \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0436\u0435\u043b\u0435\u0437\u044f\u043a\u0430\u043c\u0438.<br \/>  \u042f \u0436\u0435 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 onvif \u0431\u0435\u0437 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>  <a href=\"https:\/\/github.com\/Calc86\/onvif\">Git hub<\/a><\/p>\n<p>  \u0412 2\u0445 \u0441\u043b\u043e\u0432\u0430\u0445 \u043e\u0431 Onvif: \u042d\u0442\u043e soap.<br \/>  \u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f. 1. \u0428\u043b\u0435\u043c POST-XML, 2. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c XML<br \/>  \u041a\u043e\u0434 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435. \u041a\u043b\u044e\u0447 -s \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b XML.<br \/>  \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:  <\/p>\n<pre><code class=\"xml\">&lt;ns3:Envelope xmlns:xmime=&quot;http:\/\/www.w3.org\/2005\/05\/xmlmime&quot; xmlns:ns2=&quot;http:\/\/schemas.xmlsoap.org\/soap\/envelope\/&quot;  xmlns:ns4=&quot;http:\/\/www.onvif.org\/ver10\/device\/wsdl&quot;  xmlns:ns3=&quot;http:\/\/www.w3.org\/2003\/05\/soap-envelope&quot;  xmlns:ns6=&quot;http:\/\/www.w3.org\/2005\/08\/addressing&quot;  xmlns:ns5=&quot;http:\/\/www.onvif.org\/ver10\/schema&quot;  xmlns:ns8=&quot;http:\/\/docs.oasis-open.org\/wsrf\/bf-2&quot;  xmlns:ns7=&quot;http:\/\/docs.oasis-open.org\/wsn\/b-2&quot;  xmlns:ns13=&quot;http:\/\/docs.oasis-open.org\/wss\/2004\/01\/oasis-200401-wss-wssecurity-utility-1.0.xsd&quot;  xmlns:ns9=&quot;http:\/\/docs.oasis-open.org\/wsn\/t-1&quot;  xmlns:ns12=&quot;http:\/\/www.onvif.org\/ver10\/media\/wsdl&quot;  xmlns:ns11=&quot;http:\/\/www.w3.org\/2004\/08\/xop\/include&quot;  xmlns:ns14=&quot;http:\/\/docs.oasis-open.org\/wss\/2004\/01\/oasis-200401-wss-wssecurity-secext-1.0.xsd&quot;&gt; &lt;ns3:Body&gt;&lt;ns4:GetCapabilities&gt; &lt;ns4:Category&gt;All&lt;\/ns4:Category&gt; &lt;\/ns4:GetCapabilities&gt; &lt;\/ns3:Body&gt; &lt;\/ns3:Envelope&gt; <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c \u0432\u044b\u0448\u0435, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u043e Onvif.<br \/>  \u041e\u0442\u0432\u0435\u0442:  <\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;SOAP-ENV:Envelope  xmlns:SOAP-ENV=&quot;http:\/\/www.w3.org\/2003\/05\/soap-envelope&quot;  xmlns:SOAP-ENC=&quot;http:\/\/www.w3.org\/2003\/05\/soap-encoding&quot;  xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;  xmlns:xsd=&quot;http:\/\/www.w3.org\/2001\/XMLSchema&quot;  xmlns:wsa5=&quot;http:\/\/www.w3.org\/2005\/08\/addressing&quot;  xmlns:xmime5=&quot;http:\/\/www.w3.org\/2005\/05\/xmlmime&quot;  xmlns:xop=&quot;http:\/\/www.w3.org\/2004\/08\/xop\/include&quot;  xmlns:tt=&quot;http:\/\/www.onvif.org\/ver10\/schema&quot;  xmlns:tds=&quot;http:\/\/www.onvif.org\/ver10\/device\/wsdl&quot;  xmlns:tptz=&quot;http:\/\/www.onvif.org\/ver20\/ptz\/wsdl&quot;  xmlns:tev=&quot;http:\/\/www.onvif.org\/ver10\/events\/wsdl&quot;  xmlns:wsnt=&quot;http:\/\/docs.oasis-open.org\/wsn\/b-2&quot;  xmlns:trt=&quot;http:\/\/www.onvif.org\/ver10\/media\/wsdl&quot;  xmlns:timg=&quot;http:\/\/www.onvif.org\/ver20\/imaging\/wsdl&quot;  xmlns:wsse=&quot;http:\/\/docs.oasis-open.org\/wss\/2004\/01\/oasis-200401-wss-wssecurity-secext-1.0.xsd&quot;  xmlns:wsu=&quot;http:\/\/docs.oasis-open.org\/wss\/2004\/01\/oasis-200401-wss-wssecurity-utility-1.0.xsd&quot;  xmlns:ter=&quot;http:\/\/www.onvif.org\/ver10\/error&quot; xmlns:tns1=&quot;http:\/\/www.onvif.org\/ver10\/topics&quot;  xmlns:wstop=&quot;http:\/\/docs.oasis-open.org\/wsn\/t-1&quot;&gt; &lt;SOAP-ENV:Body&gt; &lt;tds:GetCapabilitiesResponse&gt; &lt;tds:Capabilities&gt;&lt;tt:Device&gt;&lt;tt:XAddr&gt;http:\/\/10.112.28.231:80\/onvif\/device_service&lt;\/tt:XAddr&gt; &lt;tt:Network&gt;&lt;tt:IPFilter&gt;false&lt;\/tt:IPFilter&gt; &lt;tt:ZeroConfiguration&gt;false&lt;\/tt:ZeroConfiguration&gt;&lt;tt:IPVersion6&gt;false&lt;\/tt:IPVersion6&gt; &lt;tt:DynDNS&gt;false&lt;\/tt:DynDNS&gt;&lt;\/tt:Network&gt;&lt;tt:System&gt;&lt;tt:DiscoveryResolve&gt;false&lt;\/tt:DiscoveryResolve&gt; &lt;tt:DiscoveryBye&gt;true&lt;\/tt:DiscoveryBye&gt;&lt;tt:RemoteDiscovery&gt;false&lt;\/tt:RemoteDiscovery&gt; &lt;tt:SystemBackup&gt;false&lt;\/tt:SystemBackup&gt;&lt;tt:SystemLogging&gt;false&lt;\/tt:SystemLogging&gt; &lt;tt:FirmwareUpgrade&gt;true&lt;\/tt:FirmwareUpgrade&gt;&lt;tt:SupportedVersions&gt; &lt;tt:Major&gt;1&lt;\/tt:Major&gt;&lt;tt:Minor&gt;2&lt;\/tt:Minor&gt;&lt;\/tt:SupportedVersions&gt; &lt;tt:Extension&gt;&lt;\/tt:Extension&gt;&lt;\/tt:System&gt;&lt;tt:IO&gt;&lt;\/tt:IO&gt;&lt;tt:Security&gt; &lt;tt:TLS1.1&gt;true&lt;\/tt:TLS1.1&gt;&lt;tt:TLS1.2&gt;false&lt;\/tt:TLS1.2&gt; &lt;tt:OnboardKeyGeneration&gt;false&lt;\/tt:OnboardKeyGeneration&gt; &lt;tt:AccessPolicyConfig&gt;false&lt;\/tt:AccessPolicyConfig&gt; &lt;tt:X.509Token&gt;false&lt;\/tt:X.509Token&gt;&lt;tt:SAMLToken&gt;false&lt;\/tt:SAMLToken&gt; &lt;tt:KerberosToken&gt;false&lt;\/tt:KerberosToken&gt;&lt;tt:RELToken&gt;false&lt;\/tt:RELToken&gt; &lt;\/tt:Security&gt;&lt;\/tt:Device&gt;&lt;tt:Events&gt;&lt;tt:XAddr&gt;http:\/\/10.112.28.231:80\/onvif\/device_service&lt;\/tt:XAddr&gt; &lt;tt:WSSubscriptionPolicySupport&gt;false&lt;\/tt:WSSubscriptionPolicySupport&gt; &lt;tt:WSPullPointSupport&gt;true&lt;\/tt:WSPullPointSupport&gt; &lt;tt:WSPausableSubscriptionManagerInterfaceSupport&gt;false&lt;\/tt:WSPausableSubscriptionManagerInterfaceSupport&gt; &lt;\/tt:Events&gt;&lt;tt:Imaging&gt;&lt;tt:XAddr&gt;http:\/\/10.112.28.231:80\/onvif\/device_service&lt;\/tt:XAddr&gt; &lt;\/tt:Imaging&gt;&lt;tt:Media&gt;&lt;tt:XAddr&gt;http:\/\/10.112.28.231:80\/onvif\/device_service&lt;\/tt:XAddr&gt; &lt;tt:StreamingCapabilities&gt;&lt;tt:RTPMulticast&gt;false&lt;\/tt:RTPMulticast&gt;&lt;tt:RTP_TCP&gt;true&lt;\/tt:RTP_TCP&gt; &lt;tt:RTP_RTSP_TCP&gt;true&lt;\/tt:RTP_RTSP_TCP&gt;&lt;\/tt:StreamingCapabilities&gt;&lt;\/tt:Media&gt; &lt;\/tds:Capabilities&gt;&lt;\/tds:GetCapabilitiesResponse&gt;&lt;\/SOAP-ENV:Body&gt;&lt;\/SOAP-ENV:Envelope&gt; <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e onvif \u0431\u0435\u0437 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0434\u0435\u0442 \u0432 \u044d\u0442\u043e\u043c \u0436\u0435 \u043a\u043b\u044e\u0447\u0435.<\/p>\n<p>  \u0410 \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u043e \u0443\u0436\u0435 \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439  <\/p>\n<pre><code class=\"xml\">&lt;ns3:Envelope xmlns:xmime=&quot;http:\/\/www.w3.org\/2005\/05\/xmlmime&quot; xmlns:ns2=&quot;http:\/\/schemas.xmlsoap.org\/soap\/envelope\/&quot;  xmlns:ns4=&quot;http:\/\/www.onvif.org\/ver10\/device\/wsdl&quot; xmlns:ns3=&quot;http:\/\/www.w3.org\/2003\/05\/soap-envelope&quot;  xmlns:ns6=&quot;http:\/\/www.w3.org\/2005\/08\/addressing&quot; xmlns:ns5=&quot;http:\/\/www.onvif.org\/ver10\/schema&quot;  xmlns:ns8=&quot;http:\/\/docs.oasis-open.org\/wsrf\/bf-2&quot; xmlns:ns7=&quot;http:\/\/docs.oasis-open.org\/wsn\/b-2&quot; xmlns:ns13=&quot;http:\/\/docs.oasis-open.org\/wss\/2004\/01\/oasis-200401-wss-wssecurity-utility-1.0.xsd&quot;  xmlns:ns9=&quot;http:\/\/docs.oasis-open.org\/wsn\/t-1&quot; xmlns:ns12=&quot;http:\/\/www.onvif.org\/ver10\/media\/wsdl&quot; xmlns:ns11=&quot;http:\/\/www.w3.org\/2004\/08\/xop\/include&quot; xmlns:ns14=&quot;http:\/\/docs.oasis-open.org\/wss\/2004\/01\/oasis-200401-wss-wssecurity-secext-1.0.xsd&quot;&gt; &lt;ns3:Header&gt; \t&lt;Security xmlns=&quot;http:\/\/docs.oasis-open.org\/wss\/2004\/01\/oasis-200401-wss-wssecurity-secext-1.0.xsd&quot; ns3:mustUnderstand=&quot;1&quot;&gt; \t\t&lt;UsernameToken&gt; \t\t\t&lt;Username&gt;admin&lt;\/Username&gt; \t\t\t&lt;Password Type=&quot;http:\/\/docs.oasis-open.org\/wss\/2004\/01\/oasis-200401-wss-username-token-profile-1.0#PasswordDigest&quot;&gt;KSsJz8Lx0xPJd4pYdMuFblluNac=&lt;\/Password&gt; \t\t\t&lt;Nonce EncodingType=&quot;http:\/\/docs.oasis-open.org\/wss\/2004\/01\/oasis-200401-wss-soap-message-security-1.0#Base64Binary&quot;&gt;Y2FsY09udmlm&lt;\/Nonce&gt; \t\t\t&lt;Created xmlns=&quot;http:\/\/docs.oasis-open.org\/wss\/2004\/01\/oasis-200401-wss-wssecurity-utility-1.0.xsd&quot;&gt;2013-01-15T08:00:57.000Z&lt;\/Created&gt; \t\t&lt;\/UsernameToken&gt; \t&lt;\/Security&gt; &lt;\/ns3:Header&gt; &lt;ns3:Body&gt;&lt;ns12:GetProfiles\/&gt;&lt;\/ns3:Body&gt;&lt;\/ns3:Envelope&gt; <\/code><\/pre>\n<p>  \u0422.\u0435. \u043d\u0443\u0436\u043d\u043e \u0441\u043b\u0430\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a. (\u0442\u0435\u0441\u0442\u0438\u043b\u043e\u0441\u044c \u043d\u0430 D-link DCS-2103, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u0431\u0435\u0437 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438, \u043a\u0438\u0442\u0430\u0439).<\/p>\n<p>  Timestamp (Created)  <\/p>\n<pre><code class=\"java\">public static String getOnvifTimeStamp(DateTime dateTime){         return String.format(&quot;%4d-%02d-%02dT%02d:%02d:%02d.000Z&quot;,                 dateTime.getDate().getYear(),                 dateTime.getDate().getMonth(),                 dateTime.getDate().getDay(),                 dateTime.getTime().getHour(),                 dateTime.getTime().getMinute(),                 dateTime.getTime().getSecond()         );     } <\/code><\/pre>\n<p>  Nonce  <\/p>\n<pre><code class=\"java\">public String getNonceDigest(){         return base64(getNonce().getBytes());     } <\/code><\/pre>\n<p>  \u0438 \u043f\u0430\u0440\u043e\u043b\u044c (Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) ))  <\/p>\n<pre><code class=\"java\">public String getPasswordDigest(){         \/\/Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )         String line = getNonce() + timestamp + password;         try {             line = base64(sha1(line.getBytes()));             return line;         } catch (NoSuchAlgorithmException e) {             e.printStackTrace();         }         return &quot;&quot;;     } <\/code><\/pre>\n<p>  \u0412\u0441\u0451 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445. \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u0432\u0434\u0440\u0443\u0433 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0447\u0435\u0433\u043e \u043b\u0438\u0431\u043e \u2014 \u043f\u0438\u0448\u0438\u0442\u0435.<br \/>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043a\u043e\u043c\u0443 \u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<p>  PS \u041d\u0435 \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043f\u0440\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0431\u0443\u043a\u0432\u0443 \u00abI\u00bb. \u0418\u0445 Server \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 SQLite, SSL, avcodec (ffmpeg), \u0430 \u0432 \u043f\u0430\u043f\u043a\u0435 \\Resources \u0435\u0441\u0442\u044c \u0431\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\u0438\u043a \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c camera_list.json, \u043d\u043e \u043c\u043e\u044f \u043d\u0430\u0433\u043b\u043e\u0441\u0442\u044c \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0430 \u0435\u0433\u043e \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u043a \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \ud83d\ude42 \u041d\u043e \u044f \u043d\u0435 \u0432\u0438\u0434\u0435\u043b \u0443 \u043d\u0438\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Onvif, \u0432\u0438\u0434\u0438\u043c\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u00ab\u0441\u0432\u043e\u0438\u00bb \u043a\u0430\u043c\u0435\u0440\u044b.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 OpenVPN \u0438 OpenCV, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u0430\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u00ab\u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u00bb<br \/>  \u041d\u0443 \u0438 \u0432\u043e\u0442 \u0432\u0430\u043c <a href=\"http:\/\/www.ispyconnect.com\/sources.aspx\">\u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0431\u0430\u0437\u0443 \u0441\u0441\u044b\u043b\u043e\u043a \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043a\u0430\u043c\u0435\u0440<\/a><\/p>\n<p>  Git hub:  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Calc86\/camRecorder\">camRecorder<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Calc86\/onvif\">onvif<\/a><\/li>\n<\/ul>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/233237\/\"> http:\/\/habrahabr.ru\/post\/233237\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">     \t\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435: <a href=\"http:\/\/habrahabr.ru\/post\/115808\/\">habrahabr.ru\/post\/115808\/<\/a> \u0438 <a href=\"http:\/\/habrahabr.ru\/post\/117735\/\">habrahabr.ru\/post\/117735\/<\/a><br \/>  \u0422\u0430\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f Motion-JPEG (MJPEG).<br \/>  \u041c\u0438\u0440 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0438 \u0432\u0438\u0434\u0435\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 \u0442\u043e\u0436\u0435. \u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u0438 \u0447\u0430\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u0434\u0435\u043a\u0438.<br \/>  \u0422\u0443\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442 \u0432 \u044d\u0442\u043e\u043c \u00ab\u043c\u0438\u0440\u0435\u00bb.<br \/>  \u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043d\u0435 \u0443\u0437\u043d\u0430\u044e\u0442, \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<br \/>  \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0451 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438.<br \/>  \u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e RTP, RTSP, h264, mjpeg, onvif \u0438 \u0432\u0441\u0451\u043c \u0432\u043c\u0435\u0441\u0442\u0435.<br \/>  \u041f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u0430, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-233237","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/233237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=233237"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/233237\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=233237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=233237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=233237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}