如何(自动)测试WebRTC MediaStream是否正常工作? 背景:
我正在开发一个系统,其中一部分是WebRTC视频(或音频)呼叫。该解决方案包括构建在和API-s支持之上的相当多的业务逻辑。特别是由于Firefox和Chrome实现某些API-s的方式不同(例如,如何(自动)测试WebRTC MediaStream是否正常工作? 背景:,webrtc,getusermedia,Webrtc,Getusermedia,我正在开发一个系统,其中一部分是WebRTC视频(或音频)呼叫。该解决方案包括构建在和API-s支持之上的相当多的业务逻辑。特别是由于Firefox和Chrome实现某些API-s的方式不同(例如,MediaStream#getAudioTracks总是在Firefox上返回[]) 测试要求的示例: 双方有一个正在运行的音频通话(双方都已被询问并允许音频流(访问麦克风))。一方希望将呼叫升级为视频。发生某些UI交互-与升级发起人对话,以确认其操作,并向接收方提供升级服务,双方均允许摄像头访问。最
MediaStream#getAudioTracks
总是在Firefox上返回[])
测试要求的示例:
双方有一个正在运行的音频通话(双方都已被询问并允许音频流(访问麦克风))。一方希望将呼叫升级为视频。发生某些UI交互-与升级发起人对话,以确认其操作,并向接收方提供升级服务,双方均允许摄像头访问。最终应该建立视频通话
问题:
如何检查MediaStream实例是否处于这样的状态:如果连接到
元素src
,则将播放正确的信号(视频、音频)
迄今为止的想法
最基本的测试是检查rtpeerconnection#onstreamedd
是否被调用。问题是,有时回调会通过MediaStream
实例调用,但当将其附加到
元素时,不会显示任何内容。这很可能是我的错误,这就是测试应该告诉我的
在
rtpeerconnection
或MediaStream
对象上是否有一些好的属性或回调,可以告诉我何时通信设置正确,数据通过流传输?视频元素是否显示黑色背景,并且在src属性中包含一个blob?
如果是这样,请注意视频元素也必须在FF中进行不同的处理。在Chrome中,自动播放标签(例如
)足以启动视频。在FF中,需要调用元素的.play()-方法。此外,视频元素必须在FF中以不同方式创建。它应该是这样的:
var el = document.getElementById('my-video');
if(el.mozSrcObject !== undefined) {
el.mozSrcObject = remoteStream;
el.play();
}
如果您想添加Firefox支持,我建议您使用
要检查连接是否建立,您可以读取ICE状态,即:
con.onaddstream = function(e){
if(e.srcElement.iceConnectionState === 'connected' &&
e.srcElement.iceGatheringState === 'complete') {
// attach to video-element
}
};
另一个原因可能是只发送了视频。要了解远程客户端正在流式传输的媒体类型,您必须检查远程SDP中的此子字符串:“a=recvonly”。如果存在,则只传输音频。例如:
con.onaddstream = function(e){
if (e.target.remoteDescription.sdp.indexOf('a=recvonly') > -1) {
// video and audio
}
else {
// only audio
}
}
注意:我发现这一点是因为我正在尝试做类似的事情。我不确定这是否100%安全,是否适用于所有情况(音频和视频/仅音频/仅视频),但应该值得一试。在FF中调用.play方法很有帮助,因为我在Firefox中体验过“黑盒行为”。我正在为我们的WebRTC相关业务逻辑编写测试。在接下来的一周里,我将在这里汇报我的结果。我采用的第一种方法是在验收测试中断言多个东西(比如,如果在ui中采取了某个步骤,那么必须通过多个标准,其中之一就是必须创建PeerConnection)。通过这样做,我甚至可以在开始检查流对象之前捕获多个bug。请注意,应答包含正确的调用,以确定是否仅音频(
stream.getVideoTracks().length
)