如何在一个HTMLMediaElement中显示来自两个不同流的视频流轨道(来自相机和WebGL流)

时间:2019-05-11 17:39:23

标签: javascript video stream webrtc mediastream

我需要在单个html元素(可能是<canvas><video>中,将来自用户相机的视频和使用WebGL创建的虚拟对象显示在单个html元素中。

我可以从导航器的媒体设备成功获取用户视频流,并将其显示为<video>元素。

通过使用此处的其他示例代码(来自MDN),我可以使用WebGL成功创建虚拟视觉对象并将其显示在<canvas>元素中。

我需要将它们混合在单个html元素上。我该怎么做到。

我的进一步研究表明,存在captureStream()接口的HTMLMediaElement方法。 <video>和canvas都具有此方法。我可以捕获来自此类元素的流并将其用于其他用途,例如附加到另一个 html元素(但可能不附加到canvas元素)或 WebRTC对等连接来源,记录下来。但这会覆盖之前的流。

然后,我发现名为MediaStream中具有音轨,例如视频音轨,< em>音频轨道甚至是文本轨道。可以通过addTrack的{​​{1}}方法添加更多内容,并且可以通过MediaStream方法获得它们。我已将getTracks元素流中的视频轨道添加到<canvas>元素流中,但是,我只能从以下位置查看原始的视频轨道<video>元素中的用户媒体

要实现这一目标,我缺少什么?

<video>

Complete gist

1 个答案:

答案 0 :(得分:0)

一个视频元素一次只能播放一个视频轨道。

对此的支持可在MediaCapture spec中找到:

  

由于MediaStreamtrack set中的顺序未定义,因此对AudioTrackListVideoTrackList的排序方式没有要求

HTML中:

  

选择零个或一个视频轨道;在选择上一个曲目的同时选择一个新曲目将取消选择上一个曲目。

听起来像您希望图形覆盖视频,例如黑色透明。

当前,网络平台上没有好的视频合成工具。唯一的选择是将视频元素中的帧重复绘制到画布中,并使用canvas.captureStream,但这是资源密集且速度慢的问题。

如果仅是为了播放而进行此操作(而不是记录或传输结果),则可以通过使用CSS将具有透明性的画布放置在视频元素的顶部,从而更廉价地实现此效果。这种方法还避免了跨域限制。