我正在尝试开发一个Chrome扩展来访问网络摄像头和录制视频,并在停止后下载它。
调用以下代码行时,扩展失败并出现错误:
navigator.mediaDevices.getUserMedia({ audio: false, video: true }).then(handleSuccess).catch(function (err) {alert(err)});".
错误是:
NotAllowedError: Failed due to shutdown
我在Mac上使用Chrome版本80.0.3987.132 (官方版本)(64位)。
我在这里做错了什么?我们不能通过分机访问设备摄像头吗?有什么建议吗?
示例代码如下:
manifest.json
{ "manifest_version": 2, "name": "Video Capture", "version": "0.1", "browser_action": { "default_icon": "logo.png", "default_popup": "popup.html" }
popup.html
<html> <title>Video Capture</title> <script src="videoCapture.js"></script> </head> <button id="start">Start</button> <button id="stop">Stop</button> <a id="download">Download</a> </body> </html>
videoCapture.js
var shouldStop = false; window.addEventListener('load', function showPopup() { alert("Extension started"); startButton = document.getElementById('start'); stopButton = document.getElementById('stop'); downloadLink = document.getElementById('download'); shouldStop = false; startButton.addEventListener('click', function() { if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) { alert("This browser does not support the API yet"); alert("Media Devices Available..Starts recording."); var handleSuccess = function(stream) { alert("handling recording"); const options = {mimeType: 'video/mp4'}; const recordedChunks = []; const mediaRecorder = new MediaRecorder(stream); mediaRecorder.start(5000); //capture video for 5 seconds mediaRecorder.ondataavailable = function(e) { if (e.data.size > 0) { recordedChunks.push(e.data); if(shouldStop === true && stopped === false) { mediaRecorder.stop(); stopped = true; stream.getTracks().forEach(function(track) { track.stop(); mediaRecorder.onstop = function() { downloadLink.href = URL.createObjectURL(new Blob(recordedChunks)); var currentTimestamp = Date.now(); downloadLink.download = 'recording-'+currentTimestamp+'.mp4'; alert("Click Download Link to download captured video"); navigator.mediaDevices.getUserMedia({ audio: false, video: true }) .then(handleSuccess).catch(function (err) {alert(err)});