Reactjs 将AttachMediaStream与React渲染方法一起使用?
我正在将AttachMediaStream集成到使用React的程序中 我可以将媒体流连接到如下元素:Reactjs 将AttachMediaStream与React渲染方法一起使用?,reactjs,webrtc,skylink,temasys,Reactjs,Webrtc,Skylink,Temasys,我正在将AttachMediaStream集成到使用React的程序中 我可以将媒体流连接到如下元素: var vid = document.getElementById("myVideo"); attachMediaStream(vid, stream); 但这不在React Render方法的范围内,我认为应该发生类似的事情 如果我将它按原样放在React Render方法中,它将在每次Render方法运行时运行 我想到了一种方法: 向组件添加两个变量: 此.MediaStream需要
var vid = document.getElementById("myVideo");
attachMediaStream(vid, stream);
但这不在React Render方法的范围内,我认为应该发生类似的事情
如果我将它按原样放在React Render方法中,它将在每次Render方法运行时运行
我想到了一种方法:
- 向组件添加两个变量:
- 此.MediaStream需要连接
- 这个是.props.mediaStream
- 请注意,
不是this.mediaStreamNeedsToBeAttached
或this.state
的一部分。如果是的话,在Render方法中切换它是不合法的this.props
- 当获得媒体流时,组件:
- 将
设置为true李>this.MediaStreamNeedsToBeatAttached
- 运行
this.setProps({mediaStream:newlyObtainedMediaStream})代码>导致渲染方法运行
- 将
- 渲染方法:
- 检查
是否为真this.mediaStreamNeedsToBeatAttached
- 如果是这样,则运行
并切换attachMediaStream(vid,this.props.mediaStream)
this.mediaStream
- 检查
任何想法或意见将不胜感激 我在这方面也遇到了问题,似乎在访问虚拟dom的方式和
attachMediaStream
的工作方式上存在一些中断
我正在将MediaStream
对象置于状态,并试图对其调用attachMediaStream
。。。但不管出于什么原因,它只是没有连接
(我正在使用redux),但概念是一样的):
componentDidMount=()=>{
setTimeout((函数(){
console.log('附加媒体流')
attachMediaStream(this.props.stream,this.video);
}).bind(this),0);
}
render(){
报税表(
{this.video=video;}}/>
)
}
我使用了一个
ref
()来获取虚拟媒体元素,并在componentDidMount
中调用它,因为它可以访问DOM,但不修改状态。更新2018年10月
据了解,React目前与领先的WebRTC服务提供商100%不兼容。到目前为止,我已经与两个WebRTC服务提供商合作过,它们都需要dom元素的ID,并将视频流附加到其中,不是通过React,而是通过直接dom操作。在“反应”(React)渲染上,完成的渲染中间歇性地缺少这些流
间歇性的原因是因为存在比赛条件。React将运行render函数,您的WebRTC代码将订阅视频流并尝试将其附加到由render创建的元素。如果订阅尝试在渲染函数创建某个元素之前将视频流附加到该元素,则该流将从完成的渲染中丢失
根据同一篇文章,解决方案是通过dom操作插入所有与WebRTC相关的dom元素,从WebRTC完全解构React,例如:
let elDialUIContainer = document.querySelector('#dialComponentUIContainer');
if (!elDialUIContainer) {
elDialUIContainer = document.createElement('div');
elDialUIContainer.setAttribute('id', 'dialComponentUIContainer');
elDialUIContainer.setAttribute('style', this.styleObjectToString(styles.dialComponentUIContainer));
elContentContainer.prepend(elDialUIContainer);
}
[.....]
if (localThis.applicationState.remoteVideoStream) {
console.log('attaching remoteVideoStream to #video' + localThis.applicationState.remoteVideoStream.getId());
let elOtherCallerVideoStream = document.querySelector('#video' + localThis.applicationState.remoteVideoStream.getId());
if (!elOtherCallerVideoStream) {
localThis.applicationState.remoteVideoStream.play('remoteCallerVideo');
}
}
……等等。这些元素添加在dom元素中,该元素位于该组件的React render函数生成的元素之上和之外,因此在该渲染函数运行时它们不会受到影响
我有一个函数,addWebRTCMelements
,它将这些元素添加到dom中。它由ComponentDidMount()
调用,并且在每次WebRTC事件发生时(例如,远程流进入时)也会调用它
过时:2018年9月更新
下面是另一种方法,使用ReactcreateRef()
:
function attachMediaStreamToElement(idToWaitFor, stream){
const elementExists = $(idToWaitFor).length > 0;
if (elementExists) {
const idToWaitForMinusPoundSign = idToWaitFor.replace("#", "");
var vid = document.getElementById(idToWaitForMinusPoundSign);
attachMediaStream(vid, stream);
}
else {
setTimeout(function () {
attachMediaStreamToElement(idToWaitFor, idToWaitFor, stream)
}, 50);
}
}
一旦流可用,我就调用它。例程等待渲染函数渲染目标元素,然后将流附加到它。我尝试了上述方法,但效果不可靠。有时流不会附加到元素。在渲染功能期间,渲染元素可能不是DOM的可靠组成部分。目前我正在使用一个函数,该函数使用
setTimeout
轮询所需元素的存在,然后运行attachMediaStream
。我还不确定这是否100%可靠。
<video ref={this.refToMyVideo}>
</video>
let vidElement = this.refToMyVideo.current;
attachMediaStream(vidElement, stream);
vidElement.onloadedmetadata = function(e) {
vidElement.play();
};
function attachMediaStreamToElement(idToWaitFor, stream){
const elementExists = $(idToWaitFor).length > 0;
if (elementExists) {
const idToWaitForMinusPoundSign = idToWaitFor.replace("#", "");
var vid = document.getElementById(idToWaitForMinusPoundSign);
attachMediaStream(vid, stream);
}
else {
setTimeout(function () {
attachMediaStreamToElement(idToWaitFor, idToWaitFor, stream)
}, 50);
}
}