You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebRTC PeerConnection的getRemoteStreams在Safari/iOS移动端未定义,求替代方案

替代getRemoteStreams()和getLocalStreams()的WebRTC流获取方法

1. 用ontrack事件实时获取远程流

不要等连接建立后再去PeerConnection里找远程流,直接在初始化PeerConnection时监听ontrack事件,一旦远程有媒体轨道过来就能拿到对应的流:

peerConnection.ontrack = (event) => {
  const remoteStream = event.streams[0];
  // 把流绑定到视频标签
  document.getElementById('remote-video').srcObject = remoteStream;
};

远程端调用addTrack添加音视频轨道时,本地就会触发这个事件,事件对象里的streams数组包含对应流,这是目前标准且兼容性最好的方式。

2. 通过getReceivers()提取已存在的远程流

如果一定要从已建立的PeerConnection里获取远程流,可以用getReceivers()拿到所有远程媒体接收器,再从接收器的轨道关联到流:

const remoteReceivers = peerConnection.getReceivers();
// 去重后得到所有远程流(一个流可能包含音轨和视频轨)
const remoteStreams = [...new Set(remoteReceivers.map(r => r.track?.stream)).filter(Boolean)];

3. 本地流直接保存引用,不用从PeerConnection取

本地流都是通过getUserMedia获取的,直接存好这个引用就行,没必要调用getLocalStreams():

// 获取本地流时直接保存
const localStream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
// 绑定到本地视频标签
document.getElementById('local-video').srcObject = localStream;
// 添加到PeerConnection时用这个保存好的流
localStream.getTracks().forEach(track => peerConnection.addTrack(track, localStream));

要是非得从PeerConnection里获取本地流,就用getSenders():

const localSenders = peerConnection.getSenders();
const localStreams = [...new Set(localSenders.map(s => s.track?.stream)).filter(Boolean)];

兼容性说明

getSenders()、getReceivers()和ontrack是WebRTC的标准API,Mac Safari、iOS Chrome这些浏览器都支持,完全可以替代旧的getRemoteStreams()和getLocalStreams()解决兼容性问题。

内容的提问来源于stack exchange,提问作者agam theos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:42:50