我使用带有Asterisk的WebRTC,由于信号错误,在没有音频的情况下,大约5%的时间会出现错误。简单的解决方法是,如果没有音频通过,请停止连接并重试。我知道这是一个创可贴,而我解决了真正的问题。不过,现在,我会把我的代码绑起来。
要获得音频,我正在做以下操作:
var remoteStream = new MediaStream();
peerConnection.getReceivers().forEach((receiver) => {
remoteStream.addTrack(receiver.track);
});
callaudio.srcObject = remoteStream;
callaudio.play();
这里的问题是,即使扬声器没有音频,远程流也总是会添加曲目。
如果你检查chrome://webrtc-internals你可以看到没有音频被发送,但仍然有一个接收器。你可以看看媒体流,看到确实有一个音轨。一切都支持我应该听到一些东西,但5%的时间我什么也没听到。
我的解决方案是从接收器轨迹中获取数据,并检查是否有任何东西穿过,但我不知道如何读取这些数据。我有网络音频API工作,但只有当有一些声音正在播放时,它才工作。有时另一端的人有10秒钟不说话。我需要一种方法来读取原始数据,并查看其中的内容。我只想知道MediaStream上有没有数据!
如果你做remoteStream.getAudioTracks()
,你会得到一个音轨,因为有一个,没有音频穿过那个音轨。
在最新的API中,receiver.track
在建立连接之前就已经存在,即使它未使用,因此您不应该从它的存在中推断出任何东西。
至少有5种方法可以检查何时协商音频接收:
-
回溯:检查
receiver.track.muted
。远程轨道天生静音,如果/一旦数据到达,则接收unmute
事件:audioReceiver.track.onunmute = () => console.log("Audio data arriving!");
- 主动:使用
pc.ontrack
。协商后会触发跟踪事件,但仅针对将接收数据的跟踪。trackEvent.track.kind == "audio"
的事件意味着将有音频 - 自动:使用
trackEvent.streams[0]
中提供的远程流,而不是您自己的流(假设对方在addTrack
中添加了一个)RTCPeerConnection仅根据协商内容填充此连接(除非接收到音频,否则不存在音轨) - 统一计划:勾选
transceiver.direction
:"sendrecv"
或"recvonly"
表示你收到了什么;"sendonly"
或"inactive"
表示您不是 - 超越协商:使用
getStats()
检查.kind == "audio"
的"inbound-rtp"
统计中的.packetsReceived
,以查看数据包是否在流动
前四项是对协商内容的确定性检查。第五种情况是,如果其他一切都正常,但由于某种原因,你仍然没有收到音频。
所有这些都能起作用,无论音频是否静音,正如你所要求的那样(你的问题实际上是关于协商过的内容,而不是关于可以听到的内容)。
有关这方面的更多信息,请查看我的博客,其中包含Chrome和Firefox中的工作示例。
简单的破解方法是:
在第一秒播放到服务器1赫兹的音调。
若服务器在第一秒得到它,服务器播放2赫兹,若没有,播放1赫兹。
若客户端并没有从服务器返回2hz,它会重新启动。
请注意,在进行此操作时,您应该静音。