webRTC如何判断是否有音频

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webRTC如何判断是否有音频相关的知识,希望对你有一定的参考价值。

我正在使用Astrisk的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(),你会收到一个音频轨道,因为有一个音频轨道,没有音频通过该轨道。

答案

在最新的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()检查.packetsReceived"inbound-rtp"统计数据,以查看数据包是否正在流动。

前四个是对已经谈判的内容的确定性检查。第五个是只有在其他所有内容都检查出来的情况下,但由于某种原因你还没有收到音频。

所有这些都可以按照您的要求进行,无论音频是否静音(您的问题实际上是关于什么是协商的,而不是听到什么是可听见的)。

有关这方面的更多信息,请查看.kind == "audio"以及Chrome和Firefox中的工作示例。

另一答案

简单的黑客是:

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

如果服务器在第一秒获得它,服务器播放2hz,如果不是,则播放1hz。

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

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

以上是关于webRTC如何判断是否有音频的主要内容,如果未能解决你的问题,请参考以下文章

如何在服务器端录制 WebRTC 视频/音频会话?

如何在 WebRTC 音频通话中控制单声道/立体声?

使用 libjingle 在 android WebRTC 中自定义音频设备

WebRTC:将视频添加到 SDP 中没有 BUNDLE 行的音频呼叫

Android在调用WebRTC时将音频录制到文件控制器

WebRTC[40]- WebRTC 如何在安卓系统上采集音频数据