рдЕрдЪреНрдЫрд╛ рджрд┐рди рд╣реИ, рдкреНрд░рд┐рдп рд╣реИрдмреНрд░рд┐рдЯрд╛рдЯреЗрд▓ред
рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЖрдк HTML5 / JS рдФрд░ NodeJS, рд╕рд╛рде рд╣реА PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдмрдХреИрдо рд╕реЗ рдПрдХ рдЗрдореЗрдЬ рдХрд╛ рд▓рд╛рдЗрд╡ рдкреНрд░рд╕рд╛рд░рдг рдЖрдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдЦ рдХреЛрдб рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЖрд▓реЗрдЦ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╢реБрд░реБрдЖрддреА рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИредрдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рд╡реАрдбрд┐рдпреЛ" рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ
navigator.getUserMedia рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдХреЙрдкреА рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ рдХреИрдирд╡рд╛рд╕ рднреА, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЪрд┐рддреНрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
<video autoplay id="vid" style="display:none;"></video> <canvas id="canvas" width="640" height="480" style="border:1px solid #d3d3d3;"></canvas><br>
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ getUserMedia рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
var video = document.querySelector("#vid"), canvas = document.querySelector('#canvas'), ctx = canvas.getContext('2d'), localMediaStream = null, onCameraFail = function (e) { console.log('Camera did not work.', e);
рдЦреИрд░, рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ "рд╡реАрдбрд┐рдпреЛ" рдЯреИрдЧ рдореЗрдВ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдХреИрдирд╡рд╛рд╕ рдкрд░ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдорд░ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╣реАред
cameraInterval = setInterval(function(){ snapshot();}, 1); function snapshot(){ if(localMediaStream){ ctx.drawImage(video, 0, 0); } }
рдареАрдХ рд╣реИ, рдЕрдм рдЖрдк рд╕реНрд╡рдпрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдЕрднреА рддрдХ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рдХреНрд╖рдо рдФрд░ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрдЯрди рдЬреЛрдбрд╝реЗрдВрдЧреЗред
<button onclick="startBroadcasting()">Start Broadcasting</button> <button onclick="stopBroadcasting()">Stop Broadcasting</button>
рдФрд░ рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдЦреЗрдВрдЧреЗред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдбреЗрдЯрд╛? рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреИрдирд╡рд╛рд╕ рдкрд░ рд╣рд░ рдЪреАрдЬ рдХреЗ рдмреЗрд╕ 64 рд╕рдВрдкреАрдбрд╝рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬреЗрдВред
var isBroadcasting = false, broadcastingTimer; function sendSnapshot(){ if(localMediaStream && !isBroadcasting){ isBroadcasting = true; $.post("/", { p: "new", text: ctx.canvas.toDataURL("image/webp", quality);
рдкреНрд░рд╕рд╛рд░рдг рдХрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣рд┐рд╕реНрд╕рд╛ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред
рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб (рдиреЛрдб рдЬреЗрдПрд╕)
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╖реНрдХрд╛рд░ рдпрд╛ рд╕рд░реНрд╡рд░ рдврд╛рдВрдЪреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд╕рд░реНрд╡рд░ http.createServer рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдЖрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реИред
var qs = require('querystring'); var imageData = ""; var myId = 1; if(req.method == "POST"){ var fullBody = ""; req.on('data', function(chunk){ fullBody += chunk.toString(); }); req.on('end', function(){ res.writeHead(200, {'Content-Type': 'text/html'}); var POST = qs.parse(fullBody); if(POST["p"] == "new"){
рдЗрд╕реА рддрд░рд╣ php рдХреЗ рд╕рд╛рде:
Php рдХреЛрдб if($_GET['p'] == "ajax"){ Header("Cache-Control: no-cache, must-revalidate"); Header("Pragma: no-cache"); Header("Content-Type: text/javascript; charset=windows-1251"); $file = file("monitor_id.txt"); $id = $file[0]; if($id > $_GET['last']){ $text_file = file("monitor_command.txt"); $count = count($text_file); $last = $id; echo "var main = $('#main'); \n"; for($i = 0; $i < 1; $i++){ $s = $text_file[$i]; while(strpos($s, chr(92)) !== false){ $s = str_replace(chr(92), "", $s); } echo $s; } echo "\n"; echo "last_message_id = $id;"; } }elseif((isset($_GET['p']) && $_GET['p'] == "new") || (isset($_POST['p']))){ $file = file("monitor_id.txt"); $id = $file[0]; $fh = fopen("monitor_command.txt", "w+"); $get_text = $_POST['text']; $gt = $get_text; while(strpos($get_text, "\r\n") !== false){ $get_text = str_replace("\r\n", "</br>", $get_text); } fwrite($fh, "document.body.innerHTML = ('<img src=".'"'.".$get_text.'"'."/>);\n"); fclose($fh); $fhn = fopen("monitor_id.txt", "w+"); fwrite($fhn, $id + 1); fclose($fhn); echo $get_text; }
рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ (рдкреНрд░рд╕рд╛рд░рдг рджреЗрдЦреЗрдВ)
рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
var last_message_id = 0, load_in_process = false; function Load() { if(!load_in_process) { load_in_process = true; $.post("/", { p: "ajax", last: last_message_id, version: version }, function (result) { eval(result); load_in_process = false; }); } } var loadInterval = setInterval(Load, 1);
рдирд┐рд╖реНрдХрд░реНрд╖
рдЖрдЬ рд╣рдордиреЗ html5 / js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рддрд░рдлрд╝рд╛ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╕реЗрд╡рд╛ рд▓рд┐рдЦреАред рдпрд╣ рдХреЗрд╡рд▓ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрдм рддрдХ рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкреАрдбрд╝рди рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рдЬрд▓реНрджреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рднреА рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЪрд╛рд▓рди рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд╕реЗ рдлреНрд░реЗрдо рджрд░ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдордирд╛рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ " рд▓рдЯрдХ рдЬрд╛рддрд╛ рд╣реИред "
рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдорд╛рдг рд╣реИ рдХрд┐ рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдлреНрд▓реИрд╢ рд╕реЗ рдЕрдм рддрдХ рджреВрд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рдХрдИ рдЪреАрдЬреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!