3

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

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

W3 媒体捕获和流规范(参见https://w3c.github.io/mediacapture-main/#track-muted)“当源暂时无法为轨道提供数据时,MediaStreamTrack 被静音。轨道可以被用户静音。通常此操作不在应用程序的控制范围内。这可能是由于用户点击硬件开关或切换操作系统/浏览器 chrome 中的控件。用户也可以将轨道静音代理人。” 该规范似乎没有说明造成这种情况的原因是什么或可能是什么。

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

感谢您对此的任何想法。

4

2 回答 2

1

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

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

正如MDN中所说:

如果可能,请避免轮询静音以监控轨道的静音状态。相反,为静音和取消静音事件添加事件侦听器。

于 2020-08-13T04:00:27.427 回答
1

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

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

错误代码:

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)
    })
}
于 2021-10-02T20:26:23.547 回答