Ниже приведен фрагмент кода HTML и JS, который пытается захватить изображение с веб-камеры через определенный интервал и сохранить его в виде отдельных файлов на сервере:
<video id="player" controls autoplay></video>
<canvas id="canvas" width=320 height=240></canvas>
<script>
const player = document.getElementById('player');
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
const captureButton = document.getElementById('capture');
const constraints = {video: true,};
navigator.mediaDevices.getUserMedia(constraints)
.then((stream) => {
player.srcObject = stream;
});
setInterval(drawevery, 350);
function drawevery(){
$(document).ready(function() {
var image = canvas.toDataURL("image/png");
$.post("server.php", { pimg: image } );
});
context.drawImage(player, 0, 0, canvas.width, canvas.height);
}
PHP Код:
<?php
define('UPLOAD_DIR', 'path/');
$img = $_POST['pimg'];
$img = str_replace('data:image/png;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
$file = UPLOAD_DIR . uniqid() . '.png';
$success = file_put_contents($file, $data);
?>
Но это приводит только к пустым изображениям. Может ли быть проблема в том, что холст не был полностью загружен перед сохранением, и если да, то как его можно решить?
Редактировать: Лучшая реализация была бы такой, но она все еще не работает:
function drawevery(){
context.drawImage(player, 0, 0, canvas.width, canvas.height);
var img = new Image();
img.onload=function(){
var image = canvas.toDataURL("image/png");
$.post("savePic.php", { pimg: image } );
}
img.src=canvas.toDataURL();
setTimeout(drawevery, 400);
}