html5-canvas - 如何将多个 WebRTC 媒体流(屏幕截图 + 网络摄像头)混合/组合成一个流?

标签 html5-canvas webrtc html5-video mediastream get-display-media

我有一个从 getDisplayMedia() 返回的实时屏幕捕获媒体流,
以及从 getUserMedia() 返回的实时网络摄像头媒体流.

我目前在屏幕共享视频的顶部渲染网络摄像头视频,以创建画中画效果:

enter image description here

我想将它们混合/组合成一个视频流,以便在单个 HTML 视频元素中呈现它。
我想让这两个流保持活跃和直播,就像它们是呈现两个不同媒体流的两个独立视频一样。
我还需要保持流位置 - 保持网络摄像头流较小并位于屏幕共享流的顶部。保持原始分辨率和比特率对我来说也非常重要。

我该怎么做?

最佳答案

您可以在 HTMLCanvasElement 上绘制两个视频流,然后从这个 HTMLCanvasElement 调用其 captureStream 创建一个 MediaStream方法。

要绘制两个视频流,您必须在

async function getOverlayedVideoStreams( stream1, stream2 ) {
  // prepare both players
  const vid1 = document.createElement("video");
  const vid2 = document.createElement("video");
  vid1.muted = vid2.muted = true;
  vid1.srcObject = stream1;
  vid2.srcObject = stream2;
  await Promise.all( [
    vid1.play(),
    vid2.play()
  ] );
  // craete the renderer
    const canvas = document.createElement("canvas");
  let w = canvas.width = vid1.videoWidth;
  let h = canvas.height = vid1.videoHeight;
  const ctx = canvas.getContext("2d");

  // MediaStreams can change size while streaming, so we need to handle it
  vid1.onresize = (evt) => {
    w = canvas.width = vid1.videoWidth;
    h = canvas.height = vid1.videoHeight;
  };
  // start the animation loop
  anim();
  
  return canvas.captureStream();
  
  function anim() {
    // draw bg video
        ctx.drawImage( vid1, 0, 0 );
    // caculate size and position of small corner-vid (you may change it as you like)
    const cam_w = vid2.videoWidth;
    const cam_h = vid2.videoHeight;
    const cam_ratio = cam_w / cam_h;
    const out_h = h / 3;
    const out_w = out_h * cam_ratio;
    ctx.drawImage( vid2, w - out_w, h - out_h, out_w, out_h );
    // do the same thing again at next screen paint
    requestAnimationFrame( anim );
  }
}

Live demo as a glitch因为 StackSnippets 不允许捕获 API。

关于html5-canvas - 如何将多个 WebRTC 媒体流(屏幕截图 + 网络摄像头)混合/组合成一个流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65562100/

相关文章:

javascript - 如何仅在视频下载完成后才播放?

javascript - Chrome 中的 HTML5 视频当前时间重绘问题

javascript - 调整窗口大小后 Canvas 动画速度加快

javascript - 在 Fabric.js 中创建 Blob 或条状图案

webrtc - createMediaElementSource 播放但 getByteFrequencyData 返回全 0

node.js - Kurento OneToMany 带房间

javascript - HTML5 视频 : get seek-from position

Javascript 为什么当我在 `mousemove` 中使用 drawImage 时,我得到的图像很差?

html - 奇怪的 HTML5 Canvas drawImage 行为

swift - TokBox视频位置