webRTC如何判断是否有音频

Sam*_*son 4 javascript audio asterisk webrtc

我正在使用带有 Asterisk 的 WebRTC,并且在由于信号错误而没有音频的情况下,大约有 5% 的时间会出现错误。简单的解决方法是,如果没有音频通过,则停止连接并重试。我知道这是一个创可贴,而我正在解决真正的问题。不过现在,我将使用我的代码。

要获取音频,我正在执行以下操作:

var remoteStream = new MediaStream();
peerConnection.getReceivers().forEach((receiver) => {
  remoteStream.addTrack(receiver.track);
});
callaudio.srcObject = remoteStream;
callaudio.play();
Run Code Online (Sandbox Code Playgroud)

这里的问题是远程流总是添加一个音轨,即使扬声器没有音频输出。

如果您检查chrome://webrtc-internals,您可以看到没有发送音频,但仍有接收器。您可以查看媒体流,并看到确实有一个音轨。一切都支持我应该听到什么的事实,但我有 5% 的时间什么也没听到。

我的解决方案是从接收器轨道获取数据并检查那里是否有任何东西,但我不知道如何读取该数据。我有网络音频 API工作,但它只有在当前正在播放一些声音时才有效。有时,另一端的人有 10 秒钟不说话。我需要一种方法来读取原始数据并查看其中发生了什么。我只想知道MediaStream上是否有任何数据!

如果你这样做,remoteStream.getAudioTracks()你会得到一个音轨,因为有一个音轨,那条音轨上没有音频。

jib*_*jib 6

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

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

  1. 追溯:检查receiver.track.muted. 远程轨道天生静音,并unmute在数据到达时接收事件:

    audioReceiver.track.onunmute = () => console.log("Audio data arriving!");
    
    Run Code Online (Sandbox Code Playgroud)
  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 中的工作示例。