google-chrome - 如何规避 Chrome/Chromium 中 RTCRtpTransceiver 缺失的 .stop() 实现

标签 google-chrome webrtc

我目前尝试构建一个使用 WebRTC 标准的 RTCRtpTransceiver-Objects 的 webrtc 应用程序。我将视频和音轨添加到连接中,然后一段时间后,我尝试将它们删除。 我用以下几行来做到这一点:

// part of a method, that searches the transceiver to stop and assigned it to the 'transceiver' variable
peerconnection.removeTrack(transceiver.sender);
if (transceiver.direction === "sendrecv") transceiver.direction = "recvonly";
else transceiver.direction = "inactive";

我知道这会将远程轨道设置为静音状态,就像用 null 替换收发器发送器轨道一样,但 Chrome 尚未实现 direction="stopped"transceiver.stop()然而,see Issue 980879 .
那么该怎么办呢?
远程对等方只会看到接收器的当前方向变得不活动,并且接收器轨道被静音。
因此,它不会删除我的应用程序中远程对等点的轨道,并且静音轨道会随着时间的推移而累积,对于视频轨道甚至更糟:它们会像正常的静音轨道一样显示。
我也无法删除每个静音轨道,因为我的应用程序需要允许静音和取消静音轨道(- 由用户静音,而不是由于停止而静音)。
通过完全删除轨道来静音将导致另一次报价-答案交换,这需要一些时间。我更愿意通过用 null 替换轨道来静音(无需来回发送 sdp),因为 WebRTC 标准似乎允许并且 Chrome 已经实现了。
下一个选择是关联两端的收发器,并从停止对等点向远程收发器发送消息,以使远程收发器停止接收到的轨道。这也许是可能的(我相信根据规范,收发器中频应该是相同的),但在我看来这也是一种丑陋的方式。
我不能做的只是发送媒体轨道 ID,因为这对于停止对等点和远程对等点来说是不同的,所以我不能只发送一条消息,例如“请使用 id xyz 停止你的轨道” (这会让事情变得简单,但是,它只是不能像这样工作)。
所以,现在我有以下问题:

  1. 您和其他 webrtc 开发人员解决此问题的当前“标准”方式是什么,因为长时间停止收发器无法在每个浏览器中工作? (chrome 针对当前版本修复此问题可能需要一些时间,但作为最常用的浏览器,我们不能忽视它)
  2. 是否有人以某种方式(通过滥用 DTFM、使用魔法或其他方式……)将一个 Polyfill 碰在一起? (我相信 Adapter.js 并没有以某种方式使这成为可能)
  3. 除了静音=删除和通过信号器发送远程轨道停止消息之外,还有其他方法吗?如果没有,更好的选择是什么?

最佳答案

我最终所做的是选择信号解决方案。 我基本上是这样的

// part of a method, that searches the transceiver to stop and assigned it to the 'transceiver' variable
peerconnection.removeTrack(transceiver.sender);
if (transceiver.direction === "sendrecv") transceiver.direction = "recvonly";
else transceiver.direction = "inactive";
signaler.send({type: 'transceiver:stop', data: transceiver.mid});

另一边

// received sent message and called this method with message.data
onTransceiverStopMessage(mid){
   const transceiverToStop = peerconnection.getTransceivers().filter(transceiver => transceiver.mid === mid);
   transceiverToStop.receiver.track.stop()
   transceiverToStop.receiver.track.dispatchEvent(new Event('ended'));
}

dispatchEvent-Call 是必要的,因为在轨道上调用 stop 不会触发 ending-Event。 它非常适合我的目的,但我仍在等待堆积不活动收发器的解决方案(因为它们仍然影响性能,正如 chrome 问题所述)

关于google-chrome - 如何规避 Chrome/Chromium 中 RTCRtpTransceiver 缺失的 .stop() 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59650954/

相关文章:

ffmpeg - 如何在 GStreamer webrtcbin 的 H264 视频解码期间丢弃上下文重新初始化

mysql - 使用 Google Chrome 扩展连接 MySQL 数据库?

javascript - event.preventDefault() 在 mozilla 上不起作用

google-chrome - Google Chrome 中的溢出隐藏和输入文本滚动

Google Chrome 的 CSS 对齐问题

java - Android 的信令服务器的实现,它将使用 java 的 webRTC

android - 无法访问 android webview 上的本地媒体

html - CSS:链接悬停在 Chrome 和 Safari 中不起作用

javascript - Navigator.MediaDevices.getUserMedia() 使用什么相机通信标准?

html5-canvas - 来自 Canvas 的 webrtc captureStream 并从视频中捕获音频