2017-01-25 4 views
4

Ich versuche, einen Schnappschuss von meiner Webcam mit den navigator.mediaDevices.getUserMedia() und canvas.getContext('2d').drawImage() Funktionen zu machen.Rückruf-Ereignis für getUserMedia()

Wenn ich es so machen, es funktioniert perfekt:

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>

Die Sache ist, ich will nicht auf einen Knopf klicken für die Aufnahme des Snapshots verwenden, aber nehmen die Snapshot, sobald der Kamerastream geladen ist. Ich habe versucht, den Schnappschuss() Funktion direkt aufrufen, nachdem die Videoquelle einstellen:

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); 
 
}

Aber es funktioniert nicht. Meine Leinwand bleibt weiß. Ich nehme an, dass der Kamerastrom zu diesem Zeitpunkt nicht vollständig geladen ist.

Gibt es ein anderes Ereignis, das ausgelöst wird, das ich zum Zeichnen des Snapshots verwenden könnte, sobald der Kamera-Feed geladen ist? Oder bin ich total auf dem Holzweg?

Vielen Dank im Voraus!

+0

können Sie myVideo in Snapshot bitte drucken? –

+0

Wenn ich myVideo in der Funktion snapshot() logge, heißt es: ' ' – xcess

+0

vielleicht ein Blick auf dieses Problem wird helfen: http://StackOverflow.com/Questions/12256668/html5- drawimage-from-video-to-canvas –

Antwort

3

Warten, bis das loadedmetadata Ereignis:

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>

Die oben sollte in allen Browsern (das WebRTC tun).

In Chrome können Sie auch this tun - aber play() gibt kein Versprechen in einem anderen Browser noch.

Beachten Sie auch, dass URL.createObjectURL(stream) veraltet ist. Verwenden Sie srcObject.

+0

* "URL.createObjectURL" ist veraltet "* Es ist mehr * Festlegen der src eines Videos in einen Stream mithilfe von URL.createObjectURL * was veraltet ist, oder? URL.createObjectURL ist immer noch die Möglichkeit, eine URL aus einem Blob zu erstellen. Wenn ich mich nicht irre, unterstützt noch niemand 'srcObject = Blob'. – Kaiido

+0

@Kaiido Das ist richtig. 'srcObject' Unterstützung für Blob und MediaSource fehlt atm. Auch wenn sich dies einmal verbessert, hoffen wir, dass URL.createObjectURL vollständig verschwindet. – jib

+0

Aber wird dann 'srcObject' auf' ','