webRTC如何判断是否有音频

塞缪尔·汤普森

我将WebRTC与Asterisk一起使用,并且由于信令错误而导致无音频的情况大约有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()检查.packetsReceived的的"inbound-rtp"统计信息.kind == "audio",看是否包流。

前四个是对协商内容的确定性检查。第五种情况是,仅当其他所有内容都检查完了,但由于某种原因您仍然没有收到音频时。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章