WebRTC 기반 P2P 오디오 스트리밍으로 여러 사용자가 온라인에서 함께 합주할 수 있는 서비스입니다. 3명이 함께 만들었고, 저는 실시간 통신 인프라와 오디오 처리, 결제 연동을 주로 맡았습니다.
여러 명이 동시에 목소리를 주고받아야 하는 합주 특성상, 오디오 지연이 조금만 늘어나도 박자가 어긋나 연주가 불가능해졌습니다.
WebRTC의 SDP를 직접 수정해 Opus 오디오 패킷 전송 주기(ptime)를 기본 20ms에서 10ms로 줄이고, 스테레오·FEC·DTX처럼 지연을 늘릴 수 있는 옵션을 비활성화해 저지연 전송을 구현했습니다.
참가자가 늘어날수록 Mesh 구조 특성상 연결 수가 제곱으로 증가해 대규모 인원에는 한계가 있었습니다.
현재는 소규모 인원(밴드 단위)에 맞춰 Mesh로 구현했고, 인원이 늘어나는 경우 SFU(중계 서버) 구조로 전환이 필요하다는 걸 확인했습니다.
브라우저의 마이크 접근 API(getUserMedia)는 보안상 HTTPS 환경에서만 동작해, 로컬 개발 중에도 마이크 테스트가 막혔습니다.
자체 서명(self-signed) 인증서를 만들어 로컬 개발 서버도 HTTPS로 띄우도록 구성해, 개발 단계에서부터 실제 환경과 동일하게 마이크 기능을 테스트할 수 있도록 했습니다.
음원 분리(Demucs) 결과 파일이 계속 쌓이면 스토리지 공간을 불필요하게 차지하게 됩니다.
node-cron으로 주기적인 정리 작업을 만들어, 만료 시간이 지난 음원 분리 결과를 자동으로 스토리지에서 삭제하도록 구현했습니다.