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

NextJS项目中LiveKit房间创建者音频无法被收听问题求助

问题:LiveKit创建通话用户音频无法被其他用户听到(本地正常)

在NextJS项目中基于LiveKit(WebRTC)实现视频通话/直播功能时,出现以下异常:创建视频通话的用户本地音频轨道运行正常,但其他用户无法听到该用户的音频。

相关代码参考

LiveKit组件代码

<LiveKitRoom
    url={url}
    token={token}
    onConnected={handleOnConnected}
    roomOptions={{
        adaptiveStream: true,
        dynacast: true,
        publishDefaults: {
            simulcast: true,
        },
        videoCaptureDefaults: {
            resolution: VideoPresets.h720.resolution,
        },
        audioCaptureDefaults: {
            autoGainControl: true,
            echoCancellation: true,
            noiseSuppression: true,
         },
     }}
     connectOptions={{
         autoSubscribe: true,
     }}
     controlRenderer={({ room }) => {
          return (
               <>     
                  <ControlsView
                      room={room}
                      enableScreenShare={true}
                      enableAudio={true}
                      enableVideo={true}
                      onLeave={() => {
                         room.disconnect()
                         setEnd(true)
                         props.setIsEndParent(true)
                       }}
                   />
               </>
           );
      }}
    onLeave={onLeave}
/>

Token生成函数代码

createToken(createTokenDTO) {
    try {
      const roomName = createTokenDTO.roomName;
      const participantName = createTokenDTO.participant;

      const at = new AccessToken(
        process.env.LIVEKIT_API_KEY,
        process.env.LIVEKIT_SECRET,
        {
          identity: participantName,
        },
      );
      const grantPermission = {
        ...createTokenDTO,
        room: roomName,
        roomJoin: true,
      };
      delete grantPermission.roomName;
      delete grantPermission.participant;
      at.addGrant(grantPermission);

      const token = at.toJwt();
      return token;
    } catch (err) {
      throw new HttpException(err, err.status || HttpStatus.BAD_REQUEST);
    }
  }

可能的问题原因及排查步骤

  • Token缺少音频发布权限:
    LiveKit的AccessToken需要明确授予publishAudio权限才能发布音频轨道。当前代码中grantPermission依赖createTokenDTO的传入值,如果createTokenDTO中没有包含publishAudio: true,生成的token将没有音频发布权限,导致其他用户无法接收该用户的音频。
    解决:在grantPermission中明确添加音频发布权限:

    const grantPermission = {
      ...createTokenDTO,
      room: roomName,
      roomJoin: true,
      publishAudio: true, // 明确添加音频发布权限
      publishVideo: true, // 可选,确保视频权限
    };
    
  • 音频轨道未成功发布:
    本地音频正常但未成功发布到房间。可以在handleOnConnected回调中检查当前参与者的已发布轨道:

    const handleOnConnected = (room) => {
      const localParticipant = room.localParticipant;
      console.log('已发布的轨道:', localParticipant.publishedTracks);
      // 监听轨道发布事件
      localParticipant.on('trackPublished', (trackPublication) => {
        console.log('轨道发布成功:', trackPublication.kind);
      });
    };
    

    如果没有音频轨道的发布记录,说明发布过程出现异常,可进一步检查LiveKit客户端日志。

  • 组件配置未明确启用音频发布:
    虽然ControlsView设置了enableAudio: true,但可在publishDefaults中明确添加音频启用配置,确保发布逻辑正确:

    publishDefaults: {
        simulcast: true,
        audioEnabled: true, // 明确启用音频发布
    },
    
  • 浏览器权限异常(低概率):
    尽管本地音频正常,但仍需确认浏览器是否正确授予麦克风权限。可通过浏览器控制台执行navigator.permissions.query({ name: 'microphone' })检查权限状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:52:41