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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:35:14