javascript - 将网络摄像头视频渲染到 Canvas 时超出最大调用堆栈大小

标签 javascript reactjs canvas webrtc

我正在开发一个应用程序,其中 session 中有两个参与者,他们可以进行视频通话。基本上会有3个视频流。其中两名参与者和一名将共享屏幕。这部分已经可以工作,但是当用户单击录制按钮时,这 3 个视频应该输入到 Canvas 中,并且在暂停时应该暂停。我试图在 Canvas 中仅渲染一个视频以测试它是否有效“RangeError:绘制函数超出了最大调用堆栈大小”。

const draw = (canva, context) => {
    console.log('localVideoRef', localVideoRef)
    context.drawImage(localVideoRef.current, 0, 0, canva.clientWidth, canva.clientHeight);
    console.log('context draw', context)
    requestAnimationFrame(draw(canva, context))
  }
  const handleRecord = () => {
    const canva = document.createElement('canvas');
    canva.id = "canvas";
    const context = canva.getContext("2d");
    canva.width = canva.clientWidth;
    canva.width = canva.clientHeight;
    console.log('canva', context, canva);
    console.log('room', room);
    draw(canva, context);
    requestAnimationFrame(draw(canva, context)) # above error is shown here
    console.log('canva after drawing image', canva);
  }

错误在这一行requestAnimationFrame(draw(canva, context))

更新(停止记录后仍持续运行)

let canva, context = null;

function App(props) {
  const [record, setRecord] = React.useState('');
  React.useEffect(() => {
    canva = document.createElement('canvas');
    canva.id = "canvas";
    context = canva.getContext("2d");
    canva.width = canva.clientWidth;
    canva.width = canva.clientHeight;
  }, [])
  React.useEffect(() => {
    console.log('record', record);
    if (record === 'start' || record === 'resume') {
      requestAnimationFrame(() => draw(canva, context));
      console.log('canva after paint video', canva);
    } else {
      // when pausing or stoping recording, the painting should not be done. 
      console.log('this is the canva after paused or stopped', canva)
    }

  }, [record])
  const draw = (canva, context) => {
    context.drawImage(localMediaRef.current, 0, 0, canva.clientWidth, canva.clientHeight);
    console.log('painting');
    requestAnimationFrame(() => draw(canva, context));
  }
  const handleRecord = (type) => {
    setRecord(type)
  }
  render {
    return (

    )
  }
}

最佳答案

requestAnimationFrame(draw(canva, context))

这段代码将立即调用draw,然后无论draw的返回值是什么,都将被传递到requestAnimationFrame中。在绘制内部,您重复此过程,立即调用绘制,绘制立即调用绘制等。

相反,您希望将函数传递到请求动画帧中,如下所示:

requestAnimationFrame(() => draw(canva, context));

关于javascript - 将网络摄像头视频渲染到 Canvas 时超出最大调用堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54818861/

相关文章:

reactjs - typescript 错误 : TS2339: Property 'span' does not exist on type 'JSX.IntrinsicElements'

javascript - 为 javascript 游戏创建计时器会产生不良结果

javascript - 没有 Jquery 的 Canvas 上的鼠标坐标

javascript - 在 javascript 对象数组中查找其中一个属性与另一个数组中的项目不匹配的项目

javascript - 如何禁用 element.style?

javascript - 如何阻止 HTML 表格调整大小?

reactjs - React 如何更新 ref?

javascript - 如何使用 jquery 在 HTML Canvas 中的选定图像对象中添加渐变效果

javascript - 如何使用 React 根据屏幕尺寸更改布局

JavaScript canvas : when clearing with context. clearRect,一切都在下一次绘制时重现