Javascript 由于createObjectURL已弃用,如何将画布流传递到另一个窗口?

Javascript 由于createObjectURL已弃用,如何将画布流传递到另一个窗口?,javascript,canvas,websocket,stream,blob,Javascript,Canvas,Websocket,Stream,Blob,我正在构建一个非常具体的项目,该项目包括以下内容: 带有画布元素的主窗口 从主窗口(window.open(…)打开的第二个窗口获取网络摄像头流并将其绘制在画布上 我需要在主窗口的画布上实时绘制相同的画布。我现在做的是在我的第二个窗口中,我做window.URL.createObjectURL(canvasStream),它提供了一个blob URL,我可以在主窗口中使用它来获取提要并将其绘制回主画布 这一切都很好(阅读效果很好),但现在URL.createObjectURLfonction

我正在构建一个非常具体的项目,该项目包括以下内容:

  • 带有画布元素的主窗口

  • 从主窗口(window.open(…)打开的第二个窗口获取网络摄像头流并将其绘制在画布上

我需要在主窗口的画布上实时绘制相同的画布。我现在做的是在我的第二个窗口中,我做
window.URL.createObjectURL(canvasStream)
,它提供了一个blob URL,我可以在主窗口中使用它来获取提要并将其绘制回主画布

这一切都很好(阅读效果很好),但现在
URL.createObjectURL
fonction已被弃用,不能再使用了。这意味着我再也无法获得blob url来传递到我的主窗口

如果不使用此函数,我如何将画布流传递到主窗口?我知道我可以使用Websocket将帧从一个画布发送到另一个画布,但我发现它不那么可靠,也不太一致。它还增加了另一层可能失败的复杂性

注意:项目将在
nw.js
捆绑包中运行,因此启用标志和类似的东西不会有问题

注2:我知道我可以继续使用较旧版本的
nw.js
,该版本的
URL.createObjectURL
未被弃用,但对未来来说不是一个好的解决方案


非常感谢您的帮助。

根据收到的评论,我成功地完成了这项工作

我不知道您可以直接从父窗口中打开的窗口访问变量

// In the parent
var myWindow = window.open(url);

// In the child window
var myVar = "test";

// In the parent
console.log(myWindow.myVar); // => "test"
从父窗口中打开的窗口访问变量的基本代码示例

// In the parent
var myWindow = window.open(url);

// In the child window
var myVar = "test";

// In the parent
console.log(myWindow.myVar); // => "test"
这意味着您只需要在子窗口中创建画布/视频流,然后通过执行以下操作将其应用于主窗口中的元素:

// In the child window
var canvasEl = document.querySelector("canvas");
var canvasStream = canvasEl.captureStream(30);

// In the parent
var videoEl = document.querySelector("video");
videoEl.srcObject = myWindow.canvasStream;

然后,主窗口中的画布将显示与子窗口中的画布相同的内容。

您为什么认为
URL.createObjectURL
已被弃用?我看不出有任何迹象表明这一点。在
nw.js
文档中,我没有看到关于该函数的任何信息(如果弃用是特定于
nw.js
),只需调用该函数,您就可以在控制台中看到它<代码>[Deprecation]URL.createObjectURL和媒体流已被弃用,将于2018年7月左右在M68中删除。请改用HTMLMediaElement.srcObject。看见https://www.chromestatus.com/features/5618491470118912 有关更多详细信息。如果您查看链接:
此功能在2013年已被弃用,并被为srcObject分配流所取代。
哦,我的天哪,您说得对。。。我完全忘记了我可以通过使用
myWindow直接访问打开的窗口变量。(这里的变量名)
。。。我甚至不需要使用postMessage或something@T.J.CrowderT.J不推荐使用的是将其传递给MediaStream。将blobURL设置为MediaElement仍然非常有效,但仅当指向MSE或Blob时才有效,因为在MediaStream的情况下,尤其是从设备(getUserMedia)提交MS时,createObjectURL将在blobURI的整个生命周期内锁定设备。如果需要支持旧浏览器,或者,即使只是为了避免视频瑕疵,您也可以在rAF循环中将主线程中的画布绘制到弹出窗口中的另一个画布上。@kaido很好,我想我最终会这么做。这样它也有更好的性能。