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
相关产品推荐
相关产品推荐

