webRTC意味着远程视频音轨静音/启用



几年前,我们已经实现了一种机制,通过数据通道消息向远程用户发出信号,表示远程用户将其本地视频静音(例如,将enable设置为false(,然后在远程侧采取适当的操作(例如,显示远程用户化身而不是黑色视频流(,我一直在对一个非直接相关的函数进行测试,该函数让我查看视频轨道的状态(即对等连接的接收流上的视频轨道(,我注意到远程视频上的静音状态有时在true和false之间波动(尽管远程流本身没有实际变化(。

很难说这是什么时候发生的,但似乎它可能(不知道是否真的是这样(与长时间(例如,10秒(不将媒体连接到对象(例如,用于播放的HTML视频元素(相关,并且如果在短时间内连接,则视频支架在接收侧不会显示静音=真的状态。

W3媒体捕获和流规范(请参阅https://w3c.github.io/mediacapture-main/#track-静音(";当源暂时无法为音轨提供数据时,MediaStreamTrack将被静音。音轨可以由用户静音。通常,此操作超出了应用程序的控制范围。这可能是用户按下硬件开关或在操作系统/浏览器chrome中切换控件的结果。用户代理也可以对曲目进行静音"规范似乎没有解决造成这种情况的原因。

在webRTC的情况下,任何人都能提供一些指示,说明为什么当来自远程的媒体实际流动时,从webRTC对等连接引用的远程视频流可能显示为静音状态。此外,当静音状态实际上不是远程状态的反映,而是一些本地处理的反映时,静音状态在远程视频流上的实际价值或用途是什么。

谢谢你对此有任何想法。

正如文档所说,静音状态因用户操作、网络甚至浏览器本身而异。如果它在数据流动时被静音,可能是因为你或其他用户的浏览器(例如,可能是许多其他实际上并不重要的原因(。

你问,这是干什么用的?其中许多属性仅用于测试目的(当深入研究webrtc开发时(,不适合生产。

正如MDN:中所说

尽可能避免轮询静音以监控曲目的静音地位相反,为静音和取消静音事件添加事件侦听器。

在过去的3天里,我一直在与这个bug作斗争,现在它已经解决了,我可能已经得出了结论。

基本上,我正在编写一个2+对等WebRTC应用程序,需要使用单独的id跟踪不同的RTCPeerConnection对象(就像在js对象中一样(。当第三个对等方加入时,我的代码让它异步初始化多个RTCPeerConnection对象并添加本地MediaStream轨道。这使得恢复端视频的MediaStreamTrack在静音和非静音之间不断波动。

Buggy代码:

peerIDsArray.forEach(async(peerID) => {
// Initialize RTCPeerConnection object and configure it
// Runs in parellel
localMediaStream.getTracks().forEach(track => {
peerConnectionsObject[peerID].addTrack(track, localMediaStream)
})
})

这一直困扰着接收对等端的静音/取消静音MediaStreamTrack对象,我认为要么本地MediaStream不应该被异步(并行(篡改,要么你不应该同时向多个RTCPeerConnection对象添加曲目。在一个简单的循环中运行它为我解决了问题:

工作代码:

for(let i = 0; i < peerIDsArray.length; i++) {
let peerID = peerIDsArray[i]
// Initialize RTCPeerConnection object and configure it
// Runs synchronously
localMediaStream.getTracks().forEach(track => {     
peerConnectionsObject[peerID].addTrack(track, localMediaStream)
})
}

最新更新