繁体   English   中英

webRTC如何判断是否有音频

[英]webRTC how to tell if there is audio

我将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 "recvonly""sendrecv""recvonly"表示您正在接收东西; "sendonly""inactive"表示您不是。
  5. 协商之外:使用getStats()检查.packetsReceived.kind == "audio""inbound-rtp"统计信息,以查看数据包是否在流动。

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

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

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

简单的技巧是:

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

如果服务器在第一秒获得它,则服务器回放2hz,如果否,则回放1hz。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM