我正在将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()
,则会返回一个音轨,因为有一个音轨,则该音轨上没有音频。
答案 0 :(得分:3)
在最新的API中,receiver.track
在建立连接之前就已经存在,即使未使用也是如此,因此您不应从其存在中推断出任何东西。
至少有5种方法可以检查何时协商了音频接收:
追溯:选中receiver.track.muted
。远程轨道是muted天生的,一旦/一旦数据到达,就会接收到unmute
事件:
audioReceiver.track.onunmute = () => console.log("Audio data arriving!");
pc.ontrack
。协商会触发track事件,但仅针对将接收数据的轨道。 trackEvent.track.kind == "audio"
的事件表示将有音频。trackEvent.streams[0]
,而不是自己的(假设的另一侧增加了一个在addTrack
)。 RTCPeerConnection 填充该一个基于什么协商只(无音频轨道本除非接收音频)。transceiver.direction
:"sendrecv"
或"recvonly"
表示您收到的东西; "sendonly"
或"inactive"
表示您不是。getStats()
,检查.packetsReceived
的{{1}}的统计信息的"inbound-rtp"
,以查看是否数据包流前四个是对协商内容的确定性检查。第五种情况是,如果其他所有条件都无法解决,但由于某种原因您仍然没有收到音频。
所有这些工作都与您要求的音频是否静音无关(您的问题实际上是有关协商的内容,而不是有关可听的内容)。
有关更多信息,请查看my blog,并附带Chrome和Firefox中的可用示例。
答案 1 :(得分:0)
简单的破解方法是:
在第一秒播放服务器1hz音调。
如果服务器在第一秒获得它,则服务器播放2hz,如果否,则播放1hz。
如果客户端没有从服务器获得2hz,它将重新启动。
请注意,在执行此操作时您应该保持静音状态。