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种方法可以检查协商音频接收的时间:
- 追溯:检查
receiver.track.muted
。远程轨道诞生muted,并在数据到达时收到unmute
事件:audioReceiver.track.onunmute = () => console.log("Audio data arriving!");
- 主动:使用
pc.ontrack
。 track事件是由于协商而触发的,但仅适用于将接收数据的曲目。trackEvent.track.kind == "audio"
的活动意味着会有音频。 - 自动:使用
trackEvent.streams[0]
中提供的远程流而不是您自己的(假设另一侧在addTrack
中添加了一个)。 RTCPeerConnection根据仅协商的内容填充此内容(除非收到音频,否则不会出现音轨)。 - 统一计划:检查
transceiver.direction
:"sendrecv"
或"recvonly"
意味着你收到的东西;"sendonly"
或"inactive"
意味着你不是。 - 超越谈判:使用
getStats()
检查.packetsReceived
的"inbound-rtp"
统计数据,以查看数据包是否正在流动。
前四个是对已经谈判的内容的确定性检查。第五个是只有在其他所有内容都检查出来的情况下,但由于某种原因你还没有收到音频。
所有这些都可以按照您的要求进行,无论音频是否静音(您的问题实际上是关于什么是协商的,而不是听到什么是可听见的)。
有关这方面的更多信息,请查看.kind == "audio"
以及Chrome和Firefox中的工作示例。
简单的黑客是:
在第一秒播放服务器1hz音调。
如果服务器在第一秒获得它,服务器播放2hz,如果不是,则播放1hz。
如果客户端没有从服务器返回2hz,则重新启动。
请注意,这样做时你应该静音。
以上是关于webRTC如何判断是否有音频的主要内容,如果未能解决你的问题,请参考以下文章
使用 libjingle 在 android WebRTC 中自定义音频设备