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;