2017-01-25 5 views
4

Я пытаюсь сделать снимок с моей веб-камеры с помощью функций navigator.mediaDevices.getUserMedia() и canvas.getContext('2d').drawImage().Событие обратного вызова для getUserMedia()

Когда я делаю это так, он отлично работает:

function init(){ 
 
    myVideo = document.getElementById("myVideo") 
 
    myCanvas = document.getElementById("myCanvas"); 
 
    videoWidth = myCanvas.width; 
 
    videoHeight = myCanvas.height; 
 
    
 
    startVideoStream(); 
 
} 
 

 
function startVideoStream(){ 
 
    navigator.mediaDevices.getUserMedia({audio: false, video: { width: videoWidth, height: videoHeight }}).then(function(stream) { 
 
    myVideo.src = URL.createObjectURL(stream); 
 
    }).catch(function(err) { 
 
     console.log("Unable to get video stream: " + err); 
 
    }); 
 
} 
 

 
function snapshot(){ 
 
    myCanvas.getContext('2d').drawImage(myVideo, 0, 0, videoWidth, videoHeight); 
 
}
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
 
    <script src="debug.js"></script> 
 
</head> 
 
<body onload="init()"> 
 
    <div id="mainContainer"> 
 
     <video id="myVideo" width="640" height="480" autoplay style="display: inline;"></video> 
 
     <canvas id="myCanvas" width="640" height="480" style="display: inline;"></canvas> 
 
     <input type="button" id="snapshotButton" value="Snapshot" onclick="snapshot()"/> 
 
    </div> 
 
</body> 
 
</html>

Дело в том, я не хочу использовать нажатие кнопки для моментального снимка, но взять моментальный снимок, как только загрузится поток камеры. Я пытался вызвать функцию моментального снимка() непосредственно после установки источника видеосигнала:

function init(){ 
 
    myVideo = document.getElementById("myVideo") 
 
    myCanvas = document.getElementById("myCanvas"); 
 
    videoWidth = myCanvas.width; 
 
    videoHeight = myCanvas.height; 
 
    
 
    startVideoStream(); 
 
} 
 

 
function startVideoStream(){ 
 
    navigator.mediaDevices.getUserMedia({audio: false, video: { width: videoWidth, height: videoHeight }}).then(function(stream) { 
 
    myVideo.src = URL.createObjectURL(stream); 
 
    snapshot(); 
 
    }).catch(function(err) { 
 
     console.log("Unable to get video stream: " + err); 
 
    }); 
 
} 
 

 
function snapshot(){ 
 
    myCanvas.getContext('2d').drawImage(myVideo, 0, 0, videoWidth, videoHeight); 
 
}

Но это не работает. Мое полотно остается белым. Наверное, это потому, что поток камеры в данный момент не полностью загружен.

Итак, есть ли какие-либо другие события, которые можно использовать для рисования моментального снимка, как только загрузится питание камеры? Или я полностью ошибаюсь?

Заранее благодарен!

+0

Вы можете распечатать myVideo в снимке, пожалуйста? –

+0

Когда я регистрирую myVideo в функции моментального снимка(), он говорит: ' ' – xcess

+0

Возможно, посмотрите на эту проблему: http://stackoverflow.com/questions/12256668/html5- Drawimage-from-video-to-canvas –

ответ

3

Подождите, loadedmetadata события:

navigator.mediaDevices.getUserMedia({video: true}) 
 
    .then(stream => video.srcObject = stream) 
 
    .then(() => new Promise(resolve => video.onloadedmetadata = resolve)) 
 
    .then(() => canvas.getContext('2d').drawImage(video, 0, 0, 160, 120)) 
 
    .catch(e => console.log(e));
<video id="video" width="160" height="120" autoplay></video> 
 
<canvas id="canvas" width="160" height="120"></canvas>

выше должен работать во всех браузерах (что делать WebRTC).

В Chrome вы также можете сделать this - но play() не возвращает обещание в любом другом браузере.

Также обратите внимание, что URL.createObjectURL(stream) устарел. Используйте srcObject.

+0

* «URL.createObjectURL' устарел» * Это больше * установка src видео в поток с помощью URL.createObjectURL *, который устарел, не так ли? URL.createObjectURL по-прежнему является способом создания URL-адреса из Blob. Если я не ошибаюсь, никто еще не поддерживает 'srcObject = Blob'. – Kaiido

+0

@ Kaiido Это правильно. Поддержка 'srcObject' для blob и mediaSource отсутствует. Хотя как только это улучшится, мы надеемся, что 'URL.createObjectURL' полностью исчезнет. – jib

+0

Но тогда будет применен 'srcObject' к' ','