首页 > 解决方案 > 合并2个html5画布的捕获视频流

问题描述

我正在为网络会议应用程序构建一个白板应用程序。我研究过的所有库都使用 2 个 canvas ,顶部的 1 个用于绘图,底部的 1 个用于保存较旧的绘图(为了获得更好的性能,因为每次绘制时上部的画布都会被清除)。

现在我需要流式传输这些画布的内容以供其他用途,以便他们可以实时查看内容。

选项1 :

captureStream从每个画布并将视频轨道合并到一个流中,new MediaStream([...bottomTracks, ...topTracks])使用 webrtc 传输流,然后从流中提取轨道,为每个轨道创建一个新流,new MediaStream([stream.getVideoTracks()[0]]) 并在绝对定位的视频元素上播放流。它有效,但我的老板不喜欢它,不知道为什么?然而!
这有缺点吗?

选项2:

创建第三个屏幕外画布,并定期drawImage在屏幕外画布上创建两个画布,然后captureStream从该画布!

那么有没有更好的方法或另一种方法来实现这一目标?

更新:为什么我使用 2 个画布?

只有一个原因,如果我想改变已经绘制的东西,不要重新绘制所有东西,你可能会问什么会改变?
对我来说有两种情况:

  1. 通过鼠标拖动、触摸移动或钢笔平滑已完成绘制的线条(使其感觉更像自然书写,结帐http://fabricjs.com/freedrawing
  2. 通过鼠标拖动、触摸移动或笔绘制形状

我知道我可以在每次更改时重新绘制所有内容,但我相信它在低端设备上的性能会很低。

2 个画布绝对位于彼此之上,实际的用户绘图在上部画布上完成,当完成并对其应用任何所需的增强时,线条/形状将绘制在底部画布上并清除上部画布.

标签: javascriptcanvaswebrtcmediastream

解决方案


正如 kaiido 在评论中指出的那样,您只需要在屏幕上放置一个画布。

record.a.video 中,我将 2 个视频流(屏幕视频和摄像头视频)叠加到一个画布上。然后我使用另一个媒体流从画布中提取视频并作为 VOD 共享或直播。

请注意,音频必须以不同方式处理,因为它在画布中播放。


推荐阅读