如何(自动)测试WebRTC MediaStream是否正常工作? 背景:

如何(自动)测试WebRTC MediaStream是否正常工作? 背景:,webrtc,getusermedia,Webrtc,Getusermedia,我正在开发一个系统,其中一部分是WebRTC视频(或音频)呼叫。该解决方案包括构建在和API-s支持之上的相当多的业务逻辑。特别是由于Firefox和Chrome实现某些API-s的方式不同(例如,MediaStream#getAudioTracks总是在Firefox上返回[]) 测试要求的示例: 双方有一个正在运行的音频通话(双方都已被询问并允许音频流(访问麦克风))。一方希望将呼叫升级为视频。发生某些UI交互-与升级发起人对话,以确认其操作,并向接收方提供升级服务,双方均允许摄像头访问。最

我正在开发一个系统,其中一部分是WebRTC视频(或音频)呼叫。该解决方案包括构建在和API-s支持之上的相当多的业务逻辑。特别是由于Firefox和Chrome实现某些API-s的方式不同(例如,
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