Laravel Echo是否支持MediaStream数据?发送视频流返回空对象求助
Laravel Echo 不支持直接传输 MediaStream 数据的原因及解决方案
你遇到的问题很典型:Laravel Echo 的 whisper 方法无法直接发送 MediaStream 对象,因为它底层依赖的 WebSocket 传输要求数据必须是可 JSON 序列化的,而 MediaStream 是包含二进制数据和内部对象引用的复杂浏览器对象,序列化后就会变成空对象 {}。
正确的思路:用 Echo 传递 WebRTC 信令,而非直接传输媒体流
WebRTC 的媒体流(视频/音频)是客户端之间直接点对点传输的,不需要经过服务器中转。Laravel Echo 这类工具的作用是帮你传递 WebRTC 所需的"信令信息"(比如 Peer ID、会话描述 SDP、ICE 候选),用来让两个客户端建立直接连接,之后流就会在它们之间直接传输。
修改后的代码示例
下面是调整后的代码,用 Echo 传递 Peer ID 来完成信令交换,而不是直接发送 MediaStream:
let channel = Echo.join(`consultation`) .listenForWhisper('connectNewUserEvent',(data)=>{ console.log('收到信令数据:', data) // 拿到对方的 Peer ID 后,发起呼叫 const call = myPeer.call(data.peerId, localStream) const video = document.createElement('video') call.on('stream', userVideoStream => { addVideoStream(video, userVideoStream) }) }) var myPeer = new Peer(); let localStream; // 保存本地流,方便后续使用 myPeer.on('open', function(peer_id) { navigator.mediaDevices.getUserMedia({ video:true, audio:true }).then(stream=>{ localStream = stream; addVideoStream(myVideo, stream) // 处理 incoming 呼叫 myPeer.on('call', call => { call.answer(localStream) const video = document.createElement('video') call.on('stream', userVideoStream => { addVideoStream(video, userVideoStream) }) }) // 发送信令:传递自己的 Peer ID,而非 MediaStream channel.whisper('connectNewUserEvent', { peerId: peer_id, // 可以额外加一些用户标识,比如 userId 之类的 }) console.log('本地流:', stream) }) });
关键改动说明
- 不再直接发送
stream对象,而是发送你的 Peer ID(peer_id),这个是字符串,完全可以被 JSON 序列化传输。 - 接收端拿到 Peer ID 后,直接用
myPeer.call发起 WebRTC 呼叫,此时才会把本地流传递给对方。 - 本地流需要保存到变量中,方便在处理呼叫和发起呼叫时复用。
这样就能解决你遇到的接收端拿到空对象的问题,同时也符合 WebRTC + 信令服务器的标准架构。
内容的提问来源于stack exchange,提问作者stalwart1014
相关产品推荐
相关产品推荐

