webRTC如何判断是否有音频



我使用带有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种方法可以检查何时协商音频接收:

  1. 回溯:检查receiver.track.muted。远程轨道天生静音,如果/一旦数据到达,则接收unmute事件:

    audioReceiver.track.onunmute = () => console.log("Audio data arriving!");
    
  2. 主动:使用pc.ontrack。协商后会触发跟踪事件,但仅针对将接收数据的跟踪。trackEvent.track.kind == "audio"的事件意味着将有音频
  3. 自动:使用trackEvent.streams[0]中提供的远程流,而不是您自己的流(假设对方在addTrack中添加了一个)RTCPeerConnection仅根据协商内容填充此连接(除非接收到音频,否则不存在音轨)
  4. 统一计划:勾选transceiver.direction:"sendrecv""recvonly"表示你收到了什么;"sendonly""inactive"表示您不是
  5. 超越协商:使用getStats()检查.kind == "audio""inbound-rtp"统计中的.packetsReceived,以查看数据包是否在流动

前四项是对协商内容的确定性检查。第五种情况是,如果其他一切都正常,但由于某种原因,你仍然没有收到音频。

所有这些都能起作用,无论音频是否静音,正如你所要求的那样(你的问题实际上是关于协商过的内容,而不是关于可以听到的内容)。

有关这方面的更多信息,请查看我的博客,其中包含Chrome和Firefox中的工作示例。

简单的破解方法是:

在第一秒播放到服务器1赫兹的音调。

若服务器在第一秒得到它,服务器播放2赫兹,若没有,播放1赫兹。

若客户端并没有从服务器返回2hz,它会重新启动。

请注意,在进行此操作时,您应该静音。

相关内容

  • 没有找到相关文章

最新更新