영상 loopback 오디오 먹먹함 — 전화 대역 원인 분석 버그 분석

마지막 업데이트 2026-07-29

작성일: 2026-07-29 브랜치: PPI-1170 대상: iPad(CriOS 150 / iOS 26.5.2) 아동 세션 영상 오디오

TL;DR결론 한 장

아동 iPad에서 영상 오디오가 먹먹하게 들리는 원인은 loopback 경로의 대역 제한이다. 계측 결과 인코더는 요청한 256kbps를 끝까지 쓰는데 remote 대역 상한만 2~4kHz(전화 대역)로 좁다. 비트 부족도, 코덱 설정 문제도, Bluetooth HFP도 아니다. 원인은 브라우저가 WebRTC 오디오를 음성 경로로 처리하는 층이며 웹 API로 접근할 수 없다. 즉 덕킹 면제(loopback)와 풀밴드는 웹에서 동시에 가질 수 없다.
항목상태
증상영상 재생 중 소리가 먹먹함. 구간에 따라 심하고 덜함(중간중간)
재현 조건iPad + 영상 loopback ON. ?videoLoopback=off(직결)에서는 발생하지 않음
확정된 원인 층브라우저 WebRTC 오디오 처리 경로(음성 대역). 우리 코드 층 아님
기각된 가설코덱 협상 · 소스/ctx 대역 · 대역 추정(BWE) 비트레이트 하락 · Bluetooth HFP · 적응성 열화
즉시 가능한 대응입장 화면 Loopback OFF 선택 → 영상만 직결 출력(코드·배포 불필요)
대가영상 오디오가 EC 활성 중 덕킹으로 약 12dB 감쇠(PPI-1101 회귀)

01배경 — 왜 영상 소리가 loopback을 타는가

iOS는 EC(voice-processing)가 활성인 동안 미디어 카테고리 재생을 덕킹으로 감쇠시킨다(PPI-1101). 이를 회피하려고 영상 오디오를 WebAudio로 빼내 같은 페이지 안의 WebRTC loopback으로 되받아 <audio>.srcObject로 재생한다. iOS가 이를 "통화 상대 음성"으로 분류해 덕킹을 면제하기 때문이다.

video elementblob URL · 48kHz 풀밴드
hub (GainNode)AudioContext 48kHz · 여기까지 정상 확인됨
loopback 성립 시 (기본)
MediaStreamDestination → PC쌍 → <audio>.srcObject덕킹 면제 · 대역 2~4kHz로 제한
Loopback OFF / 폴백
ctx.destination 직결대역 온전 · 덕킹 약 12dB 감쇠
우리 코드(WebAudio·SDP) 브라우저·OS 층 정상 확인 문제 지점
전환 스위치입장 화면(app/client-guest/page.tsx:719)의 Loopback ON/OFF 셀렉트가 이 분기를 그대로 제어한다. OFF는 영상 loopback만 끄고 TTS는 loopback을 유지하므로, TTS 0.25 게인으로 맞춰둔 상대 음량 균형은 유지된다.

02시간순 인과 다이어그램

아동 입장 → 마이크 캡처 시작EC / noiseReduction: far_field
iOS 오디오 세션이 음성(voice-processing) 경로로 전환
브라우저 WebRTC 오디오 처리가 음성 대역(≈4kHz 상한)으로 동작AudioContext(48kHz) 직결 출력은 영향 없음
remote 트랙 상한 1.9~4.0kHz비트레이트는 256kbps 그대로 소비 (낭비)
영상 소리에 고역이 많은 구간에서 먹먹함으로 지각고역이 적은 구간은 차이가 미미 → "중간중간"
주의초기 판단이었던 "시간이 지나며 나빠지는 적응성 열화"는 기각됐다. 대역 제한은 처음부터 계속 걸려 있고, 소스의 고역량이 구간마다 달라 드러나는 정도가 변한 것이다.

03결정적 계측 — 비트레이트 정상, 대역만 좁다

source(인코드 전 hub)와 remote(디코드 후) 스펙트럼을 같은 방식으로 재고, 송신 stats를 5초 간격으로 함께 남겼다. 값은 iPad 실기기 세션(2026-07-29 00:54) 로그다.

경과bitrateKbpssource rolloffremote rolloff차이
1.2s148.31072312176무효 (remoteRms 0.002 = 램프업 구간)
6.8s260.991051910−7195
12.1s260.936912707−984
17.4s260.939732824−1149
22.6s260.979573059−4898
27.9s261.161992449−3750
33.1s260.953323129−2203
38.4s256.057773996−1781

유효 샘플 7개 전부 remote 상한이 4kHz 아래다. source가 9.1kHz까지 있을 때 remote는 1.9kHz였다.

6.8s src9105 Hz
6.8s rmt1910
22.6s src7957 Hz
22.6s rmt3059
38.4s src5777 Hz
38.4s rmt3996
04k8k12k
source 95% 롤오프(인코드 전) remote 95% 롤오프(디코드 후)
핵심 추론256kbps를 쓰면서 전화 대역만 담아 보내고 있다. 코덱이 비트 부족으로 대역을 줄였다면 비트레이트도 함께 내려간다. 비트가 남는데 대역만 좁은 것은 대역을 좁히는 주체가 코덱의 비트 배분이 아니라는 증거다.

협상은 완전히 정상

// Video audio loopback established / codec stats (iPad 실기기)
negotiatedOpusFmtp: "cbr=1;maxaveragebitrate=256000;minptime=10;sprop-stereo=1;stereo=1;usedtx=0;useinbandfec=1"
channels: 2          clockRate: 48000          sampleRate(ctx): 48000
bweDisabled: true    bweFeedbackRemoved: 3     jitterBufferApplied: null
부수 발견jitterBufferApplied: null — CriOS에는 jitterBufferTarget·playoutDelayHint가 둘 다 없어 수신 버퍼 고정이 실기기에서 전혀 적용되지 않는다. 재생 속도 출렁임 억제책이 무효라는 뜻이며 별도 이슈다.

04기각된 가설과 근거

가설판정기각 근거
코덱 협상/설정 문제
fmtp 미반영, 모노 다운믹스
기각 fmtp 전량 반영, channels: 2, clockRate: 48000
소스·AudioContext 대역 제한 기각 12-20k 밴드 비중이 0이 아님(0.007~0.013) → Nyquist > 12kHz → ctx 48kHz 확정. 원본 파일도 풀밴드
대역 추정(BWE)이 비트레이트를 낮춤 기각 transport-cc·goog-remb·헤더확장 제거(bweFeedbackRemoved: 3) 후에도 증상 유지. 비트레이트는 애초에 하락 없음
적응성 열화(시간 경과로 수렴) 기각 대역 제한은 상시. 첫 샘플이 정상으로 보였던 건 remoteRms 0.002 램프업 구간의 노이즈였음
Bluetooth HFP 강제
JUCE 사례와 같은 메커니즘
기각 BT 미연결·내장 스피커에서도 재현. 또한 HFP라면 직결 출력도 함께 좁아져야 하는데 직결은 정상
iOS 스피커 렌더 단계의 음색 차 기각 손실이 스피커 앞이 아니라 remote 탭(디코드 직후)에서 이미 관측됨
브라우저 WebRTC 오디오 처리가 음성 대역 유력(잔존) 위 전부를 배제하고 남은 유일한 층. 직결(48kHz)은 정상이고 RTP 경로만 좁다는 비대칭과 일치
미확정 잔여대역이 좁아지는 정확한 메커니즘(8kHz 다운샘플인지 speech 대역 필터인지)과 지점(송신 리샘플인지 수신 디코드인지)은 구분되지 않았다. 95% 롤오프는 하드 엣지가 아니고, remote의 6-12k 비중이 완전히 0은 아니다(0.007~0.031). 1~15kHz 스윕 톤 진단이면 차단 주파수(4kHz=협대역 / 8kHz=16kHz 처리)와 기울기가 확정된다. 다만 처방은 바뀌지 않는다.

05왜 웹에서 못 고치는가

비교 대상이 된 JUCE 포럼 사례는 입력 사용 시 iOS가 HFP를 강제해 8/16kHz로 떨어지는 문제를 AVAudioSessionCategoryOptionAllowBluetooth 한 줄 제거로 해결한다. 같은 계열의 문제이지만, 그 레버가 웹에는 존재하지 않는다.

레버네이티브
오디오 세션 카테고리·모드 지정가능없음
Bluetooth 프로파일 선택(HFP/A2DP)가능없음
WebRTC 오디오 처리 레이트 지정가능없음
EQ·게인 등 신호 가공가능가능하나 손실 대역은 복원 불가
구조적 결론덕킹 면제와 풀밴드는 웹에서 동시에 성립하지 않는다. loopback을 쓰면 전화 대역을 받고, 안 쓰면 덕킹을 받는다. 근본 해결은 AVAudioSession을 직접 제어할 수 있는 네이티브 래퍼뿐이다.

06선택지와 대가

내용대가 / 한계
A. 영상만 직결
현재 유력
입장 화면 Loopback OFF. TTS는 loopback 유지 → 상대 음량 균형 유지 영상 오디오가 덕킹으로 약 12dB 감쇠. 절대 음량은 기기 볼륨으로 보상(디지털 헤드룸 소모 없음)
B. 직결 + 게인 보상 직결 경로에 게인 튜너블 추가 영상 오디오가 풀스케일에 가까워 실용 상한 +3~6dB. 12dB는 클리핑. 덕킹이 동적이면 상쇄 자체가 무효
C. loopback 유지 + EQ 상쇄 ?videoLoopbackEqPresenceDb, EqMudDb. 살아 있는 대역이 ~3kHz까지이므로 presenceHz는 2500 권장 없는 대역은 복원 불가. 명료도 개선에 그침
D. 영상 구간 마이크 캡처 정지 음성 경로 전환 자체를 회피 시도 범인이 loopback 자체면 무효. 모니터 아동 소리·STT·무음 감지에 영향
E. EC 상시 off voice-processing 회피 비추천 — 에코·clone 무음 사이드 이펙트 이력 구역
F. 네이티브 래퍼 AVAudioSession 직접 제어 유일한 근본 해결이나 범위가 큼(장기)
권고A를 기본값으로 두고, 실기기에서 덕킹 감쇠가 실용적인지 확인한다. 음량이 부족하면 B를 소폭(+3~6dB) 병행한다. C는 A가 불가할 때의 완화책이다.

07계측 도구 — 이번에 추가한 것

모두 진단 목적이고 기본값에서 출력 동작을 바꾸지 않는다. apps/web/shared/lib/video-audio-loopback.ts, apps/web/shared/lib/webrtc-audio-loopback.ts

로그 / 기능내용튜너블
Video loopback spectrum sample source·remote의 대역별 비중, 센트로이드, 95% 롤오프, 4kHz 이상 비중, sinceEstablishedMs videoLoopbackSpectrumLog=off|all
videoLoopbackSpectrumLogLimit=N
Video loopback codec stats 5초 간격 실효 비트레이트·채널·clockRate·fmtp videoLoopbackCodecStatsLog=off|all
videoLoopbackCodecStatsLimit=N
BWE 차단 (SDP munging) transport-cc·goog-remb·transport-wide-cc·abs-send-time 제거. 가설은 기각됐으므로 롤백 후보 videoLoopbackBwe=on으로 이전 동작
출력 EQ loopback 경로에만 peaking 2단(mud/presence). 기본 0dB면 노드 미생성 videoLoopbackEqPresenceDb
직결 A/B loopback 없이 ctx.destination 직결만 사용 videoLoopback=off
계측 함정스펙트럼 샘플은 remoteRms가 무음 수준이면 노이즈를 읽는다(램프업 구간). 단일 샘플로 판정하지 말고 remoteRms가 유의미한 샘플만 볼 것. remote는 지터버퍼만큼 지연돼 source와 시점이 어긋나므로 추세로 비교해야 한다.

08다음 작업

  1. Loopback OFF로 수업 1회 완주 — 덕킹 감쇠가 실용적인지 청감 판정 (코드·배포 불필요)
  2. 덕킹 깊이 외부 녹음 측정 — 다른 기기로 iPad 스피커를 녹음해 loopback/직결 레벨차를 dB로 확정 → 게인 보상값이 추정이 아닌 계산이 된다
  3. BWE 차단 롤백 — 가설이 기각됐으므로 기본 비활성으로 되돌리고 튜너블로만 남긴다(근거 없는 SDP 변조 제거)
  4. 스윕 톤 진단(선택) — 차단 주파수 4kHz/8kHz 확정. 문서화·재현 가치이며 처방은 불변
  5. jitterBufferApplied: null 별도 이슈화 — CriOS에서 수신 버퍼 고정이 무효인 상태
상태🟡 원인 층 확정 · 처방 선택 대기. 실기기 청감 판정과 덕킹 깊이 측정이 남아 있다.

관련 문서