gpt4 book ai didi

javascript - 如何使用 HTML5 将网络摄像头拍摄的 jpg 图像/视频保存在本地硬盘中

转载 作者:搜寻专家 更新时间:2023-10-31 02:25:36 25 4
gpt4 key购买 nike

问题看起来很简单,虽然我找不到合适的解决方案因为我缺乏 HTML 和 Javascript 知识。

任务只是设计一个网页,其中一个按钮将激活网络摄像头并在本地硬盘驱动器中存储静止图像或视频(最好)。暂时不需要上传/下载。

经过一些尝试,我能够使用 getusermedia() api 激活网络摄像头并在浏览器窗口中呈现视频,但无法保存它。这就是我的代码的样子。

if (navigator.getUserMedia) {       
navigator.getUserMedia({video: true}, handleVideo, videoError);
}

function handleVideo(stream) {
video.src = window.URL.createObjectURL(stream);
}

关于如何在硬盘驱动器中保存以相同方式捕获的静态图像或视频,您有什么想法吗?

最佳答案

首先,navigator.getUserMedia API 已被弃用,您现在应该使用 navigator.mediaDevices.getUserMedia方法。

然后要拍摄静止图像,您确实可以使用可以 draw 的 Canvas 一个视频元素。

const vid = document.querySelector('video');
navigator.mediaDevices.getUserMedia({video: true}) // request cam
.then(stream => {
vid.srcObject = stream; // don't use createObjectURL(MediaStream)
return vid.play(); // returns a Promise
})
.then(()=>{ // enable the button
const btn = document.querySelector('button');
btn.disabled = false;
btn.onclick = e => {
takeASnap()
.then(download);
};
})
.catch(e=>console.log('please use the fiddle instead'));

function takeASnap(){
const canvas = document.createElement('canvas'); // create a canvas
const ctx = canvas.getContext('2d'); // get its context
canvas.width = vid.videoWidth; // set its size to the one of the video
canvas.height = vid.videoHeight;
ctx.drawImage(vid, 0,0); // the video
return new Promise((res, rej)=>{
canvas.toBlob(res, 'image/jpeg'); // request a Blob from the canvas
});
}
function download(blob){
// uses the <a download> to download a Blob
let a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'screenshot.jpg';
document.body.appendChild(a);
a.click();
}
<button>take a snapshot</button>
<video id="vid"></video>

As a fiddle因为 Stacksnippets 可能会阻止 gUM 请求...

要保存为视频,您可以使用 [MediaRecorder API]( https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorderà ,它允许您将 MediaStream 保存为 webm:

const vid = document.querySelector('video');
navigator.mediaDevices.getUserMedia({video: true}) // request cam
.then(stream => {
vid.srcObject = stream; // don't use createObjectURL(MediaStream)
return vid.play(); // returns a Promise
})
.then(()=>{ // enable the button
const btn = document.querySelector('button');
btn.disabled = false;
btn.onclick = startRecording;
})
.catch(e=>console.log('please use the fiddle instead'));

function startRecording(){
// switch button's behavior
const btn = this;
btn.textContent = 'stop recording';
btn.onclick = stopRecording;

const chunks = []; // here we will save all video data
const rec = new MediaRecorder(vid.srcObject);
// this event contains our data
rec.ondataavailable = e => chunks.push(e.data);
// when done, concatenate our chunks in a single Blob
rec.onstop = e => download(new Blob(chunks));
rec.start();
function stopRecording(){
rec.stop();
// switch button's behavior
btn.textContent = 'start recording';
btn.onclick = startRecording;
}
}
function download(blob){
// uses the <a download> to download a Blob
let a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'recorded.webm';
document.body.appendChild(a);
a.click();
}
<button disabled>start recording</button>
<video></video>

作为a fiddle


注意事项:

MediaRecorder API 仍然是一个相当新的 API,并且[浏览器实现的小集合中仍然存在一些错误。

关于javascript - 如何使用 HTML5 将网络摄像头拍摄的 jpg 图像/视频保存在本地硬盘中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46882550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com