webRTC如何判断是否有音频

时间:2019-02-01 23:12:27

标签: javascript audio webrtc asterisk

我正在将WebRTC与Asterisk一起使用,并且由于信令错误而导致在无音频的情况下,大约有5%的时间出现错误。简单的解决方法是,如果没有音频未来通过,则停止连接,然后再试一次。我知道在解决实际问题时这是一个创可贴。不过,现在,我要对我的代码进行创编。

要获取音频,我需要执行以下操作:

var remoteStream = new MediaStream();
peerConnection.getReceivers().forEach((receiver) => {
  remoteStream.addTrack(receiver.track);
});
callaudio.srcObject = remoteStream;
callaudio.play();

这里的问题是,即使没有声音从扬声器发出,远程流也总是添加曲目。

如果您检查chrome://webrtc-internals可以看到没有音频被发送,但仍有一个接收器。您可以查看媒体流,并查看确实存在音频轨道。还有就是一切支持,我应该听的东西的事实,但我什么都没听到的5%的时间。

我的解决方案是从接收器轨道中获取数据,并检查那里是否有任何东西,但是我不知道如何读取该数据。我有web audio API工作,但只有在当前正在播放某些声音的情况下,它才能工作。有时另一端的人在10秒钟内不说话。我需要一种读取原始数据并查看正在发生什么的方法。我只想知道MediaStream上是否有任何数据!

如果您执行remoteStream.getAudioTracks(),则会返回一个音轨,因为有一个音轨,则该音轨上没有音频。

2 个答案:

答案 0 :(得分:3)

在最新的API中,receiver.track在建立连接之前就已经存在,即使未使用也是如此,因此您不应从其存在中推断出任何东西。

至少有5种方法可以检查何时协商了音频接收:

  1. 追溯:选中receiver.track.muted。远程轨道是muted天生的,一旦/一旦数据到达,就会接收到unmute事件:

    audioReceiver.track.onunmute = () => console.log("Audio data arriving!");
    
  2. 主动:使用pc.ontrack。协商会触发track事件,但仅针对将接收数据的轨道。 trackEvent.track.kind == "audio"的事件表示将有音频。
  3. 自动:使用在所提供的远程流trackEvent.streams[0],而不是自己的(假设的另一侧增加了一个在addTrack)。 RTCPeerConnection 填充该一个基于什么协商只(无音频轨道本除非接收音频)。
  4. 统一计划:检查transceiver.direction"sendrecv""recvonly"表示您收到的东西; "sendonly""inactive"表示您不是。
  5. 超越谈判:使用getStats(),检查.packetsReceived的{​​{1}}的统计信息的"inbound-rtp",以查看是否数据包流

前四个是对协商内容的确定性检查。第五种情况是,如果其他所有条件都无法解决,但由于某种原因您仍然没有收到音频。

所有这些工作都与您要求的音频是否静音无关(您的问题实际上是有关协商的内容,而不是有关可听的内容)。

有关更多信息,请查看my blog,并附带Chrome和Firefox中的可用示例。

答案 1 :(得分:0)

简单的破解方法是:

在第一秒播放服务器1hz音调。

如果服务器在第一秒获得它,则服务器播放2hz,如果否,则播放1hz。

如果客户端没有从服务器获得2hz,它将重新启动。

请注意,在执行此操作时您应该保持静音状态。