【问题标题】:webRTC how to tell if there is audiowebRTC如何判断是否有音频
【发布时间】:2019-02-01 23:12:27
【问题描述】:

我正在使用带有 Asterisk 的 WebRTC,并且由于信号错误导致没有音频的时间大约有 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(),您会返回一个音轨,因为有一个音轨,只是没有音频穿过该音轨。

【问题讨论】:

  • 只是建议:将这个“callaudio.play()”放在回调函数中:oncanplay、oncanplaythrough 或 onloadeddata。此外,您必须在发送邀请/候选人时初始设置音频:true。然后,您甚至可以在远程控制静音、暂停或播放,而不仅仅是本地。
  • 你最终为此做了什么?
  • 我真的没有发现什么太好的东西。我最终解决了信号问题。知道音频的进展情况很难,但在对等连接上使用 getStats() 效果很好。

标签: javascript audio webrtc asterisk


【解决方案1】:

在最新的 API 中,receiver.track 在建立连接之前就存在,即使它没有被使用,所以你不应该从它的存在中推断出任何东西。

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

  1. 追溯:检查receiver.track.muted。远程轨道诞生muted,如果/一旦数据到达,就会收到unmute 事件:

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

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

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

如需了解更多信息,请查看 my blog 以及 Chrome 和 Firefox 中的工作示例。

【讨论】:

  • 一些防火墙会发送 3-4 个数据包,然后丢弃所有其他数据包
  • @arthops 我认为问题更多是关于协商的内容,以及 OP 对未使用轨道的存在感到困惑,但我添加了第五个选项,讨论验证数据包到达。谢谢!
【解决方案2】:

简单的技巧是:

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

如果服务器在第一秒得到它,服务器播放2hz,如果没有,播放1hz。

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

请注意,这样做时您应该被静音。

【讨论】:

  • 这实际上是可能的。我可以在连接到桥梁时发出噪音。
猜你喜欢
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多