Rocky 's Blog

Mediasoup 화상 회의 시스템의 미디어 스트림 제어 전략

  • Mediasoup
  • UX
  • 최적화
2026. 01. 20.
게시글 썸네일

화상 강의를 위한 성능 최적화와 UX 설계


어떤 부분을 담당하고 있었는가?

현재 화상 강의 서비스를 구현하고 있다. 100명 정도의 참여자를 고려했을 때, 리소스를 최대한 아끼면서도 부드럽게 작동하는 서비스를 만들어야 했다.

이 과정에서 다른 참여자들의 카메라 스트림을 받아와 렌더링하고, 내 카메라를 켜고 끄는 기능을 구현하고 있었다. 단순한 기능처럼 보였지만, 다양한 최적화 방안과 사용자 경험의 균형점을 고민해보게 되었다.

원격 미디어 수신 최적화


가장 근본적인 방법: 단순 전체 수신

어떤 방식을 떠올렸는가?

서버로부터 참가자 목록을 수신하자마자 모든 참가자의 미디어를 즉시 consume하는 방식이었다. 논리적으로는 가장 단순하고 직관적인 접근이었고, 구현도 쉬운 편이었다.

어떤 문제점이 있었는가?

하지만 이 방식은 참가자 수가 늘어날수록 네트워크 대역폭과 CPU 사용량이 기하급수적으로 증가할 수 있는 구조였다. 10명 수준에서는 문제가 없겠지만, 100명 이상으로 확장했을 때는 확실히 클라이언트 리소스가 감당하기 어려울 것이다. 결과적으로 확장성 측면에서 심각한 병목을 초래할 수 있었다.

첫 번째 시도: 비디오 페이지네이션

어떤 방식을 떠올렸는가?

리소스를 효율적으로 관리하기 위해 비디오 영역에 페이지네이션을 도입했다. 하나의 페이지에 4명의 참가자가 표시된다면, 현재 페이지와 인접한 전, 후 페이지의 참가자(최대 12명)에 대해서만 비디오 스트림을 생성하고 유지하는 방식이다.

이 방식을 적용하면 참가자가 수백 명이라 해도, 클라이언트는 동시에 최대 12명의 비디오만 처리하면 된다. 그 결과 렌더링 부하를 일정 수준으로 제한할 수 있었고, 자원 사용량을 예측 가능한 범위로 고정시킬 수 있었다.

두 번째 시도: 오디오는 항상 수신

어떤 방식을 떠올렸는가?

비디오와 달리 오디오는 모든 참가자에 대해 항상 consume 상태를 유지하도록 설계했다. 누군가 발언을 시작할 때 비로소 오디오 스트림을 요청하면, 세션 연결 과정에서 지연이 발생하며 발언의 앞부분이 잘릴 수 있기 때문이다. 이는 사용자 경험에 직접적인 불편을 줄 수 있는 문제였다.

또한 오디오는 비디오에 비해 대역폭 소모가 훨씬 적다. 따라서 전체 시스템 리소스 관점에서도 감당 가능한 비용이라고 판단했다. 즉, 오디오의 즉각적인 반응성을 보장하기 위해 일정 수준의 리소스 사용은 감수하기로 했다.

하드웨어 리소스와 사용자 신뢰 사이의 균형


미디어 송신 제어의 시행착오

하드웨어 자원을 다루어야 한다.

원격 미디어 수신 설계를 마친 후, 사용자가 자신의 카메라와 마이크를 제어할 때 하드웨어 자원을 어떻게 효율적으로 다룰 것인지 고민했다. 단순히 장치를 켜고 끄는 기능을 넘어, 성능 효율과 사용자 편의성을 위해 여러 단계의 시행착오를 거쳤다.

첫 번째 시도: 하드웨어 리소스 완전 해제

어떤 방식을 떠올렸는가?

카메라나 마이크를 끄면 즉시 track.stop()을 호출하여 하드웨어 권한을 반환하는 방식을 적용했다. 이렇게 하면 배터리 소모를 줄이고, 개인 프라이버시를 보호할 수 있다는 장점이 있다.

어떤 문제점이 있었는가?

하지만 문제는 다시 켤 때였다. 장치를 초기화하는 지연이 발생해 화면이 일시적으로 검게 번쩍이거나 깜빡이는 현상이 나타났다. 이러한 시각적인 불안정은 분명 사용자 경험을 떨어뜨리는 요소였다.

두 번째 시도: 하드웨어 유지 및 스트림 송출만 중단

어떤 방식을 떠올렸는가?

다음으로는 장치 권한을 유지하되, 서버로 미디어를 송출하는 부분만 제어하는 방식을 시도했다. 이 경우 장치를 다시 켤 때 초기화 과정이 생략되므로 반응 속도가 빨라지고, 화면 깜빡임도 사라져 자연스러운 전환이 가능했다.

어떤 문제점이 있었는가?

그러나 예상치 못한 문제가 있었다. 사용자가 카메라를 껐음에도 불구하고 노트북 상단의 카메라 LED가 계속 켜져 있었다. 이는 사용자 입장에서 분명 카메라를 껐는데, 왜 여전히 켜져 있다 하지? 라는 불안감을 유발할 수 있으며, 서비스 신뢰도를 크게 떨어뜨릴 수 있는 문제였다.

마지막 시도: 미디어 특성별 분리

어떤 방식을 떠올렸는가?

최종적으로 미디어의 특성과 사용자 피드백의 중요도에 따라 제어 전략을 분리하였다.

사용자가 카메라를 끄는 경우, 하드웨어 리소스를 완전히 해제하도록 하였다. 약간의 재연결 지연보다는 LED가 꺼지는 물리적인 보안이 사용자 경험에서 더 중요한 요소라고 판단했기 때문이다.

오디오는 하드웨어 연결을 유지하고 소프트웨어 레벨에서 송출을 제어하였다. 음성 대화에서는 잠깐의 지연도 불필요한 재질문을 유도하며, 대화의 흐름이 끊길 수 있다. 원할한 커뮤니케이션 흐름에서는 즉각적인 반응성이 더 중요하다고 판단하였다.

Zoom의 동작 방식

Zoom에서는 어떤 방식을 택하고 있는가?

실제 Zoom에서도 비슷한 동작 방식을 확인할 수 있었다. 회의 중 카메라가 켜지면 노트북의 LED와 브라우저 상단 아이콘이 표시된다. 반대로 카메라를 끄면 아이콘이 즉시 사라지고, LED도 꺼진다.

Zoom에서 카메라를 사용 중일 때
Zoom에서 카메라를 사용 중일 때

그러나 음소거 상태에서는 마이크 아이콘이 여전히 활성화된 상태로 남아 있다. 이는 하드웨어 연결은 유지하되 송출만 막고 있음을 의미한다. 또한, 음소거 상태에서 발언을 시도하면 마이크가 음소거되어 있습니다 라는 피드백을 제공한다. 즉, 마이크 권한은 유지된 채로 소프트웨어적으로 제어되고 있다는 것을 알 수 있었다.

결론


최적화만이 답은 아니다.

이번 과정을 통해 단순히 시스템 자원 효율성만을 생각하는 것은 바람직하지 않다는 점을 깨달았다. 만약 리소스 절감만을 고려했다면 카메라와 마이크 모두를 완전히 해제했겠지만, 그 결과 사용자는 불편함을 느끼고, 서비스를 이용하지 않게 될 것이다.

때로는 오디오처럼 더 많은 자원을 소모하더라도 즉각적인 대화 경험을 보장해야 하고, 때로는 비디오처럼 빠른 반응보다 안전하다는 감각이 더 중요할 수도 있다. 결국 기술적인 최적화와 사용자 경험 사이에서 균형을 맞추는 것이 중요하다고 느꼈다.