diff --git a/src/extensions/scratch3_video_sensing/library.js b/src/extensions/scratch3_video_sensing/library.js index 51a7deef5..04abc20ea 100644 --- a/src/extensions/scratch3_video_sensing/library.js +++ b/src/extensions/scratch3_video_sensing/library.js @@ -162,7 +162,7 @@ class VideoMotion { this.prev = this.curr; // Create a clone of the array so any modifications made to the source // array do not affect the work done in here. - this.curr = new Uint32Array(source.buffer.slice()); + this.curr = new Uint32Array(source.buffer.slice(0)); // Swap _prev and _curr. Copy one of the color components of the new // array into _curr overwriting what was the old _prev data. diff --git a/src/io/video.js b/src/io/video.js index 6c72be885..ba05ff244 100644 --- a/src/io/video.js +++ b/src/io/video.js @@ -240,23 +240,27 @@ class Video { return this._singleSetup; } - this._singleSetup = new Promise((resolve, reject) => { - navigator.getUserMedia({ - audio: false, - video: { - width: {min: 480, ideal: 640}, - height: {min: 360, ideal: 480} - } - }, resolve, reject); + this._singleSetup = navigator.mediaDevices.getUserMedia({ + audio: false, + video: { + width: {min: 480, ideal: 640}, + height: {min: 360, ideal: 480} + } }) .then(stream => { this._video = document.createElement('video'); - this._video.src = window.URL.createObjectURL(stream); + // Use the new srcObject API, falling back to createObjectURL + try { + this._video.srcObject = stream; + } catch (error) { + this._video.src = window.URL.createObjectURL(stream); + } // Hint to the stream that it should load. A standard way to do this // is add the video tag to the DOM. Since this extension wants to // hide the video tag and instead render a sample of the stream into // the webgl rendered Scratch canvas, another hint like this one is // needed. + this._video.play(); // Needed for Safari/Firefox, Chrome auto-plays. this._track = stream.getTracks()[0]; this._setupPreview(); return this;