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

Twilio-Video JavaScript SDK中trackPublished事件无法触发问题求助

排查Twilio Video 1.6.1中trackPublished/trackPublicationFailed事件未触发的问题

我来帮你梳理这个问题,结合你使用的twilio-video 1.6.1版本,核心问题出在事件绑定时机和旧版本的行为差异上,下面给你具体的分析和解决方案:

1. 事件绑定时机滞后

你当前的代码是在roomJoined函数里才给localParticipant绑定事件,但当你通过Video.connect的tracks参数传入媒体轨道时,Twilio会在房间连接成功前就自动开始发布这些轨道。等你进入roomJoined绑定事件时,发布流程已经完成,自然不会触发后续的事件回调。

解决方法:改用手动发布轨道,先绑定事件再发布

调整代码流程,先连接房间,绑定事件后再手动发布轨道,这样就能确保事件回调能捕获到发布动作:

$.getJSON('/video/getToken', function (data, status) {
  identity = data.identity;
  navigator.mediaDevices.getUserMedia({ audio: true, video: {width: 320, height: 240} })
    .then(function (mediaStream) {
      console.log("Obtained " + mediaStream.getTracks() +" from local and joining room" + roomName);
      var connectOptions = {
        name: roomName,
        logLevel: 'off',
        // 移除自动发布的tracks参数
        preferredVideoCodecs: ['VP9', 'VP8']
      };
      return Video.connect(data.token, connectOptions);
    })
    .then(function(room) {
      const localParticipant = room.localParticipant;
      // 先绑定事件
      localParticipant.on('trackPublicationFailed', function(error, localTrack){
        console.log('Failed to publish track %s to room "%s": %s', localTrack,roomName, error.message);
      });
      localParticipant.on('trackPublished', function(localTrackPublication){
        console.log('Succesfully published track %s with name %s to room "%s"', localTrackPublication.trackSid, localTrackPublication.trackName, roomName);
      });
      // 手动发布轨道
      return localParticipant.publishTracks(mediaStream.getTracks());
    })
    .catch(function (error) {
      log('Could not connect to Twilio: ' + error.message);
    });
});

2. 旧版本的行为差异

twilio-video 1.6.1是比较早期的版本,这个版本中trackPublished和trackPublicationFailed事件仅在手动调用publishTrack/publishTracks时触发,通过Video.connect的tracks参数自动发布轨道的场景不会触发这两个事件。你参考的官方文档可能是针对后续新版本的描述,旧版本的行为逻辑有区别。

3. 额外验证方案

如果你需要快速确认轨道是否成功发布,可以直接检查本地参与者的已发布轨道列表,或监听远程参与者的轨道接收事件:

function roomJoined(room) {
  const localParticipant = room.localParticipant;
  // 直接检查已发布的轨道
  localParticipant.tracks.forEach(function(trackPublication) {
    console.log('已发布轨道:%s', trackPublication.trackSid);
  });
  // 监听远程参与者的轨道接收事件,确认轨道能正常传输
  room.on('participantConnected', function(participant) {
    participant.on('trackAdded', function(track) {
      console.log('远程参与者收到轨道:%s', track.sid);
    });
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:53:35