마지막 업데이트 2026-07-29
카메라 인코딩 경량화 — simulcast 고화질 레이어 낭비 개선의 핵심을 수사반장식으로 먼저 안내합니다. 기술적 결론과 원문 근거는 아래 본문에 보존되어 있습니다.
아동 카메라 1장을 진행자에게 보내기 위해 브라우저가 초당 ~30회 실시간 인코딩한다. 현재 구조:
// use-guest-media-manager.ts:335 video: props.videoDevice?.deviceId ? { deviceId: {...} } : false // width/height/frameRate 제한 없음
// use-mediasoup-producer.ts:415 encodings: [ { maxBitrate: 100000, scaleResolutionDownBy: 4 }, // 저 (캡처/4) { maxBitrate: 300000, scaleResolutionDownBy: 2 }, // 중 (캡처/2) { maxBitrate: 900000 }, // 고 (캡처 원본) ]
중요: 3개를 다 인코딩하고, "1개 선택"은 인코딩이 아니라 그 뒤 서버(SFU)/수신측이 한다. mediasoup는 자동(대역폭 BWE) 또는 앱 제어(setPreferredLayers)가 가능한데, 이 프로젝트는 앱 제어다.
// use-mediasoup-consumer.ts:299 — consumer 생성 시 socket.emit("set-consumer-layers", { consumerId, spatialLayer: 0, temporalLayer: 0 });
// use-mediasoup-consumer.ts:718 setConsumerLayer(peerId, spatialLayer) socket.emit("set-consumer-layers", { consumerId, spatialLayer, temporalLayer: 2 });
| 진행자 화면 상태 | 선택 레이어 |
|---|---|
| 썸네일/카드뷰 (작게 여러 명) | 최저 (spatialLayer 0) |
| 포커스뷰 (한 명 크게) | 앱 지정 상위 레이어 + 풀프레임(temporal 2) |
| (위에) 수신 대역폭 | 천장 역할 — 모자라면 강등 |
// use-guest-media-manager.ts getUserMedia video 제약 추가 video: { deviceId: {...}, width: { max: 1280 }, height: { max: 720 }, frameRate: { max: 24 } }
1080p→720p면 인코딩 픽셀 절반 이하. 아동 얼굴 모니터링엔 720p(또는 480p)로 충분.
고(1080p) 레이어를 빼서 3벌 → 2벌. 인코딩 부하 약 1/3 감소.
// sender 측 setParameters — 재협상 없이 런타임 토글 const params = sender.getParameters(); params.encodings[2].active = false; // 고화질 레이어 off (평상시) await sender.setParameters(params); // 진행자가 그 아동을 포커스하면 active = true 로 복귀