微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Javascript - imageCapture.takePhoto() 函数拍照

如何解决Javascript - imageCapture.takePhoto() 函数拍照

我正在为我的实验目的构建一个网络应用程序。这里的目标是从网络摄像头每秒捕获约 15-20 帧并将其发送到服务器。捕获帧后,将其转换为 base64 并添加到数组中。一定时间后,它被发送回服务器。目前我正在使用 imageCapture.takePhoto() 来实现此功能。结果我得到 blob,然后更改为 base64。应用程序运行约 5 秒,在此期间,帧被捕获并发送到服务器。

通过网络摄像头捕捉帧的更有效方法是什么?

解决方法

您可以直接从用于预览来自 <video> 的流的 .getUserMedia() 元素捕获静止图像。当然,您可以通过执行此类操作(伪代码)来设置该预览。

const stream = await navigator.getUserMedia(options)
const videoElement = document.querySelector('video#whateverId')
videoElement.srcObject = stream
videoElement.play()

接下来,让自己成为一个画布对象和它的上下文。它不一定是可见的。

const scratchCanvas = document.createElement('canvas')
scratchCanvas.width = video.videoWidth
scratchCanvas.height = video.videoHeight
const scratchContext = scratchCanvas.getContext('2d')

现在你可以让自己成为这样的函数。

function stillCapture(video,canvas,context) {
    context.drawImage( video,video.videoWidth,video.videoHeight)  
    canvas.toBlob(
           function (jpegBlob) {
               /* do something useful with the Blob containing jpeg */
           },'image/jpeg')
}

包含静态捕获的 jpeg 版本的 Blob 显示在回调中。无论您需要做什么,都可以使用它。

然后,每隔一段时间调用该函数。例如,要获得大约 15fps,请执行此操作。

const howOften = 1000.0 / 15.0
setInterval (stillCapture,howOften,videoElement,scratchCanvas,scratchContext)

所有这些都为您节省了使用 .takePhoto() 的额外工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。