javascript - 使用 socket io 和 OpenCV 进行屏幕共享
问题描述
所以我发现这段代码可以通过 Socket.IO 发送到 Flask 服务器网络摄像头图像,效果很好:
socket.on('connect', function(){
console.log("Connected...!", socket.connected)
});
const video = document.querySelector("#videoElement");
video.width = 500;
video.height = 375;
if (navigator.mediaDevices.getDisplayMedia()) {
navigator.mediaDevices.getDisplayMedia({ video: true })
.then(function (stream) {
video.srcObject = stream;
video.play();
})
.catch(function (err0r) {
console.log(err0r)
console.log("Something went wrong!");
});
}
let src = new cv.Mat(video.height, video.width, cv.CV_8UC4);
let cap = new cv.VideoCapture(video);
setInterval(() => {
cap.read(src);
const canvas = document.getElementById("canvasOutput")
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
canvas.getContext('2d').drawImage(video, 0, 0);
var type = "image/png"
var data = document.getElementById("canvasOutput").toDataURL(type);
data = data.replace('data:' + type + ';base64,', '');
socket.emit('image', data);
socket.on('response_back', function(image){
const image_id = document.getElementById('image');
image_id.src = image;
});
}, 5000);`
但我的任务是使用屏幕共享,所以我也发现了这个:
async function startCapture(displayMediaOptions) {
let captureStream = null;
try {
captureStream = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
} catch(err) {
console.error("Error: " + err);
}
return captureStream;
}
我只是用 navigator.mediaDevices.getDisplayMedia 替换了 navigator.mediaDevices.getUserMedia 并且它偶尔会起作用。问题是服务器有时会以 500 错误响应,即使之前的帧已成功处理并交付。问题是什么?有了网络摄像头,一切都完美无缺。
解决方案
推荐阅读
- java - 返回 ArrayList Java 中的列表
- javascript - Ajax 调用得到 200 但我没有在函数调用后插入记录
- numpy - 将numpy数组堆栈与自身的hermitian转置相乘而无需循环
- php - PHP,如何显示第二个表
- python - 如何检测闪存驱动器上是否有足够的存储空间来写入文件?
- grails - Aspose:设置页眉时看不到&符号(&)之后的文本
- python - 为什么我的绘图图将 x 轴上的日期时间绘制为指数?
- spring-boot - 在服务器上实施信任库管理器以验证对等 X509 证书
- laravel - 实例化类的关系 - Laravel/Eloquent
- excel - 用户表单执行时间过长