Javascript web worker中只读的createElement

Javascript web worker中只读的createElement,javascript,dom,web-worker,Javascript,Dom,Web Worker,我知道从web工作者访问DOM对于线程安全来说是个坏主意,但我相信在我的用例中它应该是完全安全的 我试图在某个特定的时间段从视频中获取图像数据(对于我的用例,一次又一次)。因为这是一个繁重而非关键的过程,所以在工作线程中执行此操作将是理想的。下面是我希望在工作线程中运行的(剥离版本)代码: const video = document.createElement('video') video.src = 'My video src' video.currentTime = desiredT

我知道从web工作者访问DOM对于线程安全来说是个坏主意,但我相信在我的用例中它应该是完全安全的

我试图在某个特定的时间段从视频中获取图像数据(对于我的用例,一次又一次)。因为这是一个繁重而非关键的过程,所以在工作线程中执行此操作将是理想的。下面是我希望在工作线程中运行的(剥离版本)代码:

 const video = document.createElement('video')
 video.src = 'My video src'
 video.currentTime = desiredTimestamp
 const canvas = document.createElement('canvas')
 const context = canvas.getContext('2d')
 context.drawImage(video, 0, 0, w, h) //paints data onto a canvas
 return canvas.toDataURL() //takes data and makes it a string

在worker中运行时,JS会抛出一个错误,说明文档未定义。有没有什么方法可以不用在主线程中执行呢?如果这不是工人的正确用例,那么有没有其他方法“在后台”实现这一点?我希望所有其他进程都优先于此。

答案应该是后台任务API,在这里可以找到:我宁愿在后台线程上执行此加载,所以将其保留,但这是我将使用的,除非出现更好的方法。

不幸的是,在工作者上下文中仍然无法从视频中获取帧。
也许政府会提供,但无论如何,这只是为了未来

目前,您所能做的最好的事情是从视频创建一个ImageBitmap,并将其传递给Worker中的OffscreenCanvas,以便它能够在其他线程中继续处理静态图像

尽管如此,由于您只生成这些静止图像,Web工作者不会有多大帮助,因为抓取视频帧的最大工作已经完成,而且除非您正在绘制一个非常大的视频帧,否则整个过程无论如何都不会对页面造成太大的阻塞,而且如果您只使用异步API

下面是一段注释代码,我认为它提供了从视频中抓取静物的最不优先的方式

异步函数getFrame(url,时间){ const video=document.createElement('video'); video.crossOrigin='匿名'; //获取和查找是并行完成的,不应阻塞主线程 video.src=url; video.currentTime=时间; 等待新的承诺(res=>{video.onseek=res;}); //createImageBitmap仅与Blob真正异步 //因此,如果您真的想确保它不会干扰其他正在运行的脚本 //您可以等待下一个空闲时间 等待新的承诺(res=>requestIdleCallback(res)); const img=等待创建图像位图(视频); //这可以同步完成,所需的计算量非常小 const canvas=document.createElement('canvas'); canvas.width=img.width; canvas.height=img.height; const context=canvas.getContext('bitmaprenderer') 上下文。transferFromImageBitmap(img); //您可能不需要data://URL,因此我们将生成一个blob://URL //即使像素的复制仍然是同步进行的 //压缩很可能是并行进行的 constblob=等待新承诺(res=>canvas.toBlob(res)) 返回URL.createObjectURL(blob); } getFrame('https://upload.wikimedia.org/wikipedia/commons/a/a4/BBH_gravitational_lensing_of_gw150914.webm,2)。然后(url=>{ const img=新图像(); 文件.正文.附加(img); img.src=url; } )
.catch(console.error)webworkers没有DOM访问权限