Livekit) 접속은 했지만 비디오 안나온 문제

Wonjun Lee·2025년 7월 29일

문제

스프링 서버와 livekit 도커 컨테이너를 실행시키고, 스프링 서버에서 받아온 토큰으로 livekit에에 접속하는 과정을 테스트했다.

livekit에 정상적으로 접속했지만, 카메라, 마이크에 대한 권한 요청 메시지도 안뜨고, 화면도 안나왔다.

토큰 기반 인증을 위해 헤더도 정의했지만 인증 과정에서 틀린것 같지는 않았다.

고민 과정

위 그림은 클라이언트에서 라이브 서버로 접속하는 과정을 그린 시퀀스 다이어그램이다.

스프링 서버의 로그를 토대로 분석해보면, 위 과정은 정상적으로 동작했다. 또한 도커 컨테이너의 로그를 살펴봐도 토큰을 사용하여 웹소켓 접근이 성공한 것으로 보였다.

문제는 프론트엔드의 코드에서 문제가 생긴 것으로 판단되었다.

문제가 생긴 코드는 다음의 부분이었다.

// Get a token from your application server with the room name and participant name
const token = await getToken(roomName, participantName);

// Connect to the room with the LiveKit URL and the token
await room.connect(LIVEKIT_URL, token);

// Publish your camera and microphone
await room.localParticipant.enableCameraAndMicrophone();
setLocalTrack(room.localParticipant.videoTrackPublications.values().next().value.videoTrack);

위 코드에서 room.localParticipant.enableCameraAndMicrophone(); 부분에서 권한 문제로 막힌 것으로 보인다.

해결

위 과정에서 connect 를 수행하기 전 커메라, 마이크 권한을 요청하도록 수정했다.

// 1. 사용자 권한 요청
await navigator.mediaDevices.getUserMedia({ video: true, audio: true });

// 2. 토큰 가져오기
const token = await getToken(roomName, participantName);

// 3. 방 연결
await room.connect(LIVEKIT_URL, token);

// 4. 카메라, 마이크 enable
await room.localParticipant.enableCameraAndMicrophone();

// 5. 첫 videoTrack 추출
const publication = Array.from(room.localParticipant.videoTrackPublications.values())[0];
if (publication?.videoTrack) {
    setLocalTrack(publication.videoTrack);
}

정상적으로 동작하는 것을 확인했다.


추가 사항

관리하던 파일들에 몇 가지 Secret 값들이 있었다.
JWT에 적용하던 KEY와 SECRET, 그리고 livekit.yaml에 있던 keys.mykey 였다.

secret과 keys의 키 값은 일치시켜야 하는 것 같다. 인증 오류가 발생했고, 둘을 일치시켜 해결했다.

웹 훅의 경우 api_key를 계속 요구하던 에러가 있었다.

livekit-server : 이미지로 컨테이너를 실행했는데 livekit.yaml 파일을 볼륨 마운트하고, 환경 변수 설정까지 해도 계속

2025-07-29T11:48:55.665Z INFO livekit routing/interfaces.go:175 using single-node routing
api_key is required to use webhooks

에러가 발생했다.

클라이언트에서 STOMP로 메세지를 보내 관리하는 것으로 바꿔야할것 같다.

profile
Samsung Electronics. SW Engineering.

0개의 댓글