【问题标题】:Render multiple videos in seperate canvas在单独的画布中渲染多个视频
【发布时间】:2018-07-11 06:30:06
【问题描述】:

我正在制作一个视频聊天应用程序,我想在其中显示连接到房间的每个用户的图像。最初,我想在应用程序底部显示画布,一旦用户单击特定画布,相应的画布就会拉伸并在浏览器窗口中打开。 连接的用户:

在上图中,可以看到多个用户已连接,但当我关闭显示用户已连接的相应 div 时,画布中仅显示 1 个用户。

我想为每个连接的用户创建一个单独的画布,并在底部的栏中显示他的图像。

感谢任何帮助。

提前致谢。

【问题讨论】:

  • 你有任何代码吗?
  • 我正在使用 webrtc 和 twilio。这是将视频作为图像发布到画布的代码。 setInterval(function() { let video=document.querySelector('#remote-media video'); let canvas=document.querySelector('canvas'); let context=canvas.getContext('2d'); canvas.width = 320; canvas.height = 200; context.fillRect(0, 0, canvas.width, canvas.height); context.drawImage(video, 0, 0, canvas.width, canvas.height); }, 100);
  • @ImeshChandrasiri 上面是代码

标签: javascript html5-canvas html5-video twilio webrtc


【解决方案1】:

这里是 Twilio 开发者宣传员。

您评论中的代码似乎表明您只选择了其中一个视频(因为您使用的是querySelector),这就是为什么只有一个视频出现。

顺便说一句,我建议不要将setInterval 用于此类事情,requestAnimationFrame 会更好,因为它专门用于动画和显示运动图像。

我会尝试这样的:

function drawVideos() {
  const videoContainer = document.querySelector('#remote-media');
  const canvas = document.querySelector('canvas');
  const context = canvas.getContext('2d');
  const height = 200;
  const width = 320;
  canvas.height = height;

  function drawFrame() {
    const videos = videoContainer.querySelectorAll('video');
    canvas.width = videos.length * width;
    context.fillRect(0, 0, canvas.width, canvas.height);
    for (let i = 0, len = videos.length; i < len; i++) {
      const video = videos[i];
      context.drawImage(video, i * width, 0, width, height);
    }
    requestAnimationFrame(drawFrame);
  }

  requestAnimationFrame(drawFrame);
}

这是未经测试的,我担心范围问题,但这可能是一个开始。

另一件值得检查的事情是,您只在 #remote-media 元素内查看,并且可能您的一个视频是本地媒体。

不管怎样,试一试,告诉我进展如何。

【讨论】:

  • 我想为收到的每个视频创建一个单独的画布。但我认为上面的代码并没有做到这一点。我还在学习js,所以请帮帮我。
  • 好的,当然,那么您需要创建与视频一样多的画布,然后像上面一样在它们上绘制。试一试,告诉我你的进展如何。
  • 这是我尝试过的:function x() { let canv, context, vids; let vid = document.querySelector('#remote-media video'); for(let i=0; i&lt;vid.length; i++) { let c = 'c'+i; canv = document.querySelector(c); } context = canv.getContext('2d'); canv.width = 300; canv.height = 200; for(let j=0; j&lt; vid.length; j++) { vids = vid[i]; context.drawImage(0,0,canv.width,canv.height); } } 这里 c 是创建的每个画布的 id,s 是即将到来的每个视频的 id。
  • 好的,那行得通吗?顺便说一句,我认为您不需要使用 j 的内部循环。
  • 我以代码为起点,努力解决问题,能够在不同的画布中显示多个流。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2015-08-27
相关资源
最近更新 更多