我有一个复杂的react应用程序来处理视频流,但这个问题可以归结为简单得多的问题.基本上,我需要使用隐藏的迪夫(不要问我为什么)"在后台"缓冲视频,同时显示当前视频.然后每隔几秒循环浏览n个视频,在当前视频播放时缓冲下一个视频.

我正在使用React,由于某种原因,这样做不起作用:

const BufferedVideoRenderer = () => {
  return (
    <>
      <VideoPlayer streamId={bufferedStreamId} style={{ display: 'none' }} />
      <VideoPlayer streamId={currentStreamId} />
    </>
  )
}

然后你会有一个useEffect挂钩,它循环并基本上将流ID设置为ii + 1(并在结束时循环回0).这不起作用,因为ID会向前循环!你最终会得到这些状态:

// stream IDs
[123, 456, 789]

// state 1
currentStreamId === 123
bufferedStreamId === 456

// state 2
currentStreamId === 456
bufferedStreamId === 789

// state 3
currentStreamId === 789
bufferedStreamId === 123

因此,缓冲的456在状态1的第一个组件插槽中呈现,但在状态2,它在第二个组件插槽中呈现!因此系统不会重复使用缓冲组件插槽.

你如何实现这一目标?您可能可以在没有React的情况下模拟它,只需使用多姆或简单的函数即可.

我甚至不确定各州会是什么样子,似乎你会以某种方式这样做:

// stream IDs
[123, 456, 789]

// state 1, show current
currentStreamId === 123
bufferedStreamId === 456

// state 2, show buffered now
currentStreamId === 789
bufferedStreamId === 456 // keep this one in its slot

// state 2, show current now
currentStreamId === 789
bufferedStreamId === 123 // update this one now

所以看起来您需要在显示的插槽之间来回切换,同时一次只更新one个ID..

你将如何实现这一目标?

我try 了两种状态并来回切换,结果显示了这一点.

推荐答案

当您在可见播放器中更改流ID时,它不会神奇地从不可见播放器传输预缓冲的数据.

您需要将偶数索引的streamIds一致性分配给一个播放器,将奇数索引的streamIds一致性分配给另一个播放器,然后切换可见性以确定用户看到的播放器. 如果您想在谷歌上搜索,该技术通常被称为"双缓冲".

假设您有一个useState变量i,它是当前播放的视频的索引. 然后您可以这样做:

if ((i&1) == 0) {
    // even-numbered video playing
    return (
       <>
           <VideoPlayer streamId={streams[i]}/>
           <VideoPlayer streamId={streams[i+1]}  style={{ display: 'none' }}/>
       </>
    );
} else {
    // odd-numbered video playing
    return (
       <>
           <VideoPlayer streamId={streams[i+1]}  style={{ display: 'none' }}/>
           <VideoPlayer streamId={streams[i]}/>
       </>
    );
}

请注意,由于新元素与旧元素的匹配方式,第一个播放器始终是同一个视频播放器实例,而第二个播放器始终是同一个第二个播放器实例,即使我们切换了返回它们的代码分支.

Reactjs相关问答推荐

useLazyQuery不会更新所有组件之间的数据

每个都有重复元素的嵌套组件

NextJs Form不允许我输入任何输入,

避风港访问端口以包含Reaction应用程序

在Reaction中测试条件组件

如何将图像(在代码中称为自己)定位在蓝色圈内的点上?我正在使用material UI和Reaction

react 挂钩-使用有效澄清

MUiv5和TSS-Reaction SSR问题:无法可靠地处理样式定义.CSSprops 中的ArrowFunctionExpression

滚动视图样式高度没有任何区别

react :输入失go 焦点,输入一个字符,

Next.js 和理智 | npm run build 时预渲染页面/时发生错误

如何根据用户在react.js中的 Select , Select 多个心形图标?

CORS策略:对预检请求的响应未通过访问控制判断:没有Access-Control-Allow-Origin

redux 工具包使用中间件构建器函数时,必须返回一个中间件数组

使用 MuiCssBaseline 在所有 MUI v5 标签上设置边距 0

使用带有搜索字符串的全局过滤器时如何在 React-Table 中进行精确匹配?

如何使用 React 更改 Material UI 中 ButtonGroup 的 colored颜色 ?

在 React 的父级中多次调用子级时从子级获取数据到父级

vdom 最终更新了 dom(在比较之后)任何 dom 更改实际上应该触发整个树的重绘和回流,那么 vdom 有什么用?

如何实现两个 SVG 形状相互叠加的 XOR 操作?