问题描述
我在尝试创建自定义 Jitsi UI 时遇到问题。当我在我的 React 应用程序中加载我的会议时,我只收到一个视频和一个音频轨道(总共两个轨道)。当我尝试加入同一个会议时,我仍然只收到一个视频。我尝试按照本指南了解如何在 Vue 中构建自定义 Jitsi UI,并尝试将其转换为 React。该指南将视频和音频轨道添加到视频和音频 HTML5 元素列表中。但是,当使用同一个 Jitsi 会议时,指南作者的实现有效,而我的无法加载多个轨道。由于 Vue 实现有效(并且除了将轨道添加到视频/音频元素之外,React 代码具有相同的所有内容),我得出结论,问题一定是我的 React 实现。下面是作者如何渲染多条轨道(在 Vue 中):
<template>
<div id="app">
<h1>Performance</h1>
<button @click="connect">Connect</button>
<video
v-for="track in videoTracks"
:key="`track-${track.getId()}`"
:ref="track.getId()"
autoplay
/>
<audio
v-for="track in audioTracks"
:key="`track-${track.getId()}`"
:ref="track.getId()"
autoplay
/>
</div>
</template>
以下是作者用于向视频元素添加轨道的逻辑:
addTrack(track) {
if (track.getType() === "video") {
this.videoTracks.push(track);
} else if (track.getType() === "audio") {
this.audioTracks.push(track);
}
this.$nextTick().then(() => {
track.attach(this.$refs[track.getId()][0]);
});
},
这是我在 React 中实现相同逻辑的尝试:
const videoRefs = React.useRef([]);
const addTrack = (track) => {
console.log(`addTrack's track: ${track}`);
if (track.getType() === 'video') {
setVideoTracks(videoTracks.concat(track));
videoRefs.current[videoRefs.current.length - 1].current.srcObject =
track.stream;
} else if (track.getType() === 'audio') {
setAudioTracks(audioTracks.concat(track));
}
};
if (videoRefs.current.length !== videoTracks.length) {
videoRefs.current = Array(videoTracks.length)
.fill()
.map((_,i) => videoRefs.current[i] || createRef());
}
这是我尝试渲染多个轨道的方式:
{videoTracks.map((track,i) => (
<video
key={track.getId()}
ref={videoRefs.current[i]}
autoplay
muted
></video>
))}
任何帮助将不胜感激,谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)