ELI5 · 쉬운 설명 · 원인 분석

핑퐁이 목소리는 들리는데
안내 음성만 거의 안 들린 이유

마지막 업데이트 2026-09-22

아이는 수업 중에 “소리가 안 들려요”를 세 번 눌렀습니다. 그런데 핑퐁이 목소리는 잘 들렸습니다. 소리가 나가는 길이 두 개이고, 그중 한 길만 막혔기 때문입니다. 그림 6장으로 설명합니다.

2026-09-22사건 2026-09-21 19:00~19:23김로건 8회기iPad · iOS Chrome(CriOS 137) · iPadOS 26.6.2

한 장 요약. 안내 음성은 원래 샛길(기기 안에서만 도는 통화 회선)로 나갑니다. 그 샛길이 열려야 소리가 제 크기로 나오는데, 그날은 세 번 다 열리지 않았습니다. 앱은 큰길로 우회했고, 큰길은 마이크가 켜져 있으면 iOS가 소리를 확 줄이는 길이라 “거의 안 들리는” 상태가 수업 끝까지 이어졌습니다. 서버·인터넷은 멀쩡했습니다.

그림 1소리길이 두 개다

핑퐁이 목소리와 안내 영상 소리는 서로 다른 길로 아이 귀에 갑니다.

두 개의 소리길 핑퐁이 목소리는 서버에서 내려와 통화 회선으로 재생되고, 안내 영상 소리는 기기 안에서 WebAudio를 거쳐 재생된다. 그날 막힌 것은 두 번째 길이다. 핑퐁이 목소리 서버(LiveKit)에서 옴 안내 영상 소리 아이패드 안 영상 파일 통화 소리로 재생 iOS가 줄이지 않는 길 WebAudio로 빨려감 영상 자체로는 소리 안 남 잘 들림 아이가 “핑퐁이는 들려요” 거의 안 들림 여기가 막혔다 (그림 2~3) 한쪽만 고장이라 “기기가 먹통”으로 안 보였다

두 소리의 운명이 갈린 지점 — 위는 통화 소리, 아래는 미디어 소리.

왜 영상이 직접 소리를 못 내나? 안내 영상은 createMediaElementSource로 오디오가 WebAudio 그래프에 통째로 빨려 들어갑니다. 그래서 영상 태그 자체로는 소리가 나지 않고, WebAudio가 내보내 주는 곳에서만 소리가 납니다.

그림 2왜 굳이 샛길을 팠나 — 덕킹

마이크가 켜져 있으면 iOS는 “지금 통화 중”이라 보고 미디어 소리를 확 줄입니다.

덕킹과 우회로 마이크가 켜지면 iOS는 미디어 카테고리 소리를 줄인다. 이를 피하려고 영상 소리를 기기 내부 WebRTC 통화 회선으로 되받아 재생한다. 수업 중엔 마이크 ON 아이 말을 들어야 하니까 (에코 제거도 함께 켜짐) iOS가 소리를 줄임 “미디어 소리”는 작게, “통화 소리”는 그대로 = 덕킹(ducking) 우회로: 기기 안 통화 회선 영상 소리를 WebRTC로 나갔다가 곧장 되받아 재생 = loopback iOS가 “통화 상대 목소리”로 보고 안 줄임 인터넷으로 안 나감 · 기기 안에서만 왕복 그래서 그래프는 이렇게 생겼습니다 영상 → 허브 ─┬→ (샛길) 통화 회선 → 스피커 ← 제 음량 └→ (큰길) 그냥 스피커 직결 ← 덕킹돼 작음

샛길이 열리면 큰길을 끊고, 샛길이 안 열리면 큰길이 그대로 남습니다.

이 우회로가 왜 생겼는지의 코드 레벨 설명은 영상 오디오 WebRTC loopback — iOS 덕킹 회피 동작 흐름 문서에 있습니다.

그림 3그날 벌어진 일 — 세 번 두드리고 포기

샛길은 5초 안에 열려야 합니다. 세 번 다 안 열렸고, 규칙상 더는 시도하지 않습니다.

세 번의 시도와 포기 스텝 영상이 시작될 때마다 loopback을 시도했으나 세 번 모두 5초 타임아웃으로 실패했고, 최대 시도 횟수 3회를 모두 쓴 뒤로는 재시도하지 않아 수업 내내 직결 출력이 유지됐다. 스텝 영상이 시작될 때마다 샛길을 열어 보려 시도 최대 3번까지만 1번째 19:00:19 5초 기다림 → 실패 2번째 19:02:38 5초 기다림 → 실패 3번째 19:05:59 5초 기다림 → 실패 시도 상한 소진 이후로는 다시 열어 보지 않음 = 수업 끝까지 큰길 안내 음성 계속 작음 완전 무음이 아니라 “거의 안 들림”이었던 이유 샛길이 막히면 큰길(직결)이 그대로 살아 있습니다. 소리는 나지만 덕킹돼 아주 작습니다.

로그에 Video audio loopback established한 번도 찍히지 않았습니다.

3/3샛길 시도 전부 실패
5초한 번 기다리는 시간
0성공한 횟수
17분3번째 실패 후 남은 수업

그림 4아이가 버튼을 누른 시각

세 번째 실패 18초 뒤 첫 신고가 들어왔습니다.

사건 시간선 19시 00분 19초, 02분 38초, 05분 59초에 loopback이 실패했고 06분 17초와 06분 20초, 09분 44초에 아동이 소리가 안 들린다고 신고했다. 19:00:19 샛길 실패 ① 19:02:38 샛길 실패 ② 19:05:59 샛길 실패 ③ · 포기 19:06:17 “소리가 안 들려요” 3초 뒤 한 번 더 19:09:44 “소리가 안 들려요” 18초

원인과 신고 사이의 간격이 18초 — 인과가 시간으로도 맞습니다.

‘도움이 필요해요’ 버튼은 정상 동작했습니다. 아이가 누른 6번(멈추기 3 · 소리 3) 모두 GUEST_ISSUE_REPORT 송신 기록이 남아 있고, 19:03:56에는 진행자가 AI 응답 취소로 반응한 흔적도 있습니다. 다만 진행자 화면에 알림이 떴는지는 해당 핸들러가 console.log만 남겨 세션 로그로는 확정할 수 없습니다 — 진행자 LogRocket 세션이 필요합니다.

그림 5인터넷 탓이 아닌 이유

샛길은 기기 밖으로 나가지 않습니다. 속도·끊김과 무관합니다.

로컬 경로와 서버 경로의 분리 loopback은 같은 페이지 안의 두 연결로 기기 내부에서만 왕복하고, 서버 연결은 별도로 정상 작동했다. 네트워크 경고가 없는 조용한 구간에도 실패가 일어났다. 샛길 = 기기 안에서만 왕복 보내는 쪽 받는 쪽 STUN/TURN 서버도 쓰지 않음 기기 내부 주소(host · mDNS)로만 붙음 그 시각 인터넷은 어땠나 ✓ 서버 연결(LiveKit · SFU) 정상 유지 ✓ 2·3번째 실패 앞뒤 60초 네트워크 경고 0건 · 경고가 몰린 19:12~19:18에는 시도 자체가 없었음 · 기기 성능도 정상(8코어 · 저사양 아님 · 58.8fps) → 느려서 못 붙은 게 아니라, 붙을 주소가 없었던 쪽

“연결 타임아웃”은 대역폭이 아니라 5초 안에 연결 상태가 connected로 못 올라온 것입니다.

다만 한 가지 예외가 있습니다. 대역폭·지연은 무관하지만 네트워크 인터페이스 구성은 다른 얘기입니다. 이 iPad는 셀룰러 연결이었고, 기기 내부 주소(mDNS/Bonjour)는 Wi-Fi 같은 로컬 링크에 기대는 구조라 셀룰러 전용이면 후보 수집이 비거나 막힐 수 있습니다. 그러면 “서버는 멀쩡한데 기기 안 샛길만 실패”라는 이 사건의 모양이 정확히 맞아떨어집니다.

그림 6남은 용의자 셋과 가르는 법

여기까지가 로그로 확정된 곳이고, 그 다음은 아직 갈리지 않았습니다.

① 셀룰러 전용
Wi-Fi 링크가 없어 기기 내부 주소(mDNS)를 못 만든다. 서버 연결만 멀쩡한 모양과 가장 잘 맞는다.
유력
② iOS Chrome 앱
엔진은 WebKit이지만 Safari와 별개 앱이라 로컬 네트워크 권한이 따로 걸린다. 꺼져 있으면 같은 결과.
가능
③ 기기 · iPadOS 26
이 기기 상태나 iPadOS 26.6.2 특정 동작. 위 둘을 배제한 뒤에 남는 후보.
가능

30초면 갈립니다

  1. 같은 iPad를 Wi-Fi에 연결해 수업 입장 → Video audio loopback established 가 뜨면 ①번 확정.
  2. 여전히 실패하면 설정 → Chrome → 로컬 네트워크 토글 확인, 그리고 같은 기기 Safari로 입장해 비교 → 뜨면 ②번, 안 뜨면 ③번.
다음 재발 때는 자동으로 확정됩니다. ICE 진단 로그(ICE_DIAGNOSTIC_SUMMARY)가 9/22 운영 배포에 포함됐습니다. 이제 loopback 타임아웃에도 localCandidateCount · localCandidateTypes가 함께 남아, 후보가 0개이거나 host가 없으면 그 자리에서 판별됩니다. 9/21 사건에는 이 로그가 없었습니다 — 머지는 9/21 16:30, 운영 배포는 9/22 10:32였습니다.

정리확정된 것과 추정인 것

내용상태근거
loopback이 3번 모두 5초 타임아웃으로 실패, 한 번도 성립 못 함확정세션 로그 · LogRocket 양쪽 동일 (VIDEO_AUDIO_LOOPBACK)
실패 후 직결 출력이 유지됨(무음 아님)확정코드 경로 — 성립 시에만 직결을 끊는데 성립 로그 0건
서버 연결·대역폭은 원인이 아님확정2·3차 실패 ±60초 네트워크 경고 0건 · LiveKit/SFU 정상
아동의 도움 요청 6건 모두 정상 송신확정GUEST_ISSUE_REPORT emit 기록
직결 출력이 덕킹돼 작게 들렸다추정코드 주석 + 7/8 실기기 검증 이력. 실제 출력 음량은 로그에 없음
셀룰러 전용이라 기기 내부 주소를 못 만들었다추정증상 모양과 일치. iOS는 NetworkInformation 미지원이라 로그로 확인 불가
진행자 화면에 도움 알림이 떴는지미확인모니터 핸들러가 console.log만 남김 → 진행자 LogRocket 필요
영향 범위 주의. 셀룰러 축이 맞다면 “셀룰러로 수업하는 모든 iPad에서 안내 음성이 덕킹 상태”라는 뜻이 됩니다. 한 아이의 기기 문제로 닫지 말고 Wi-Fi 비교 결과를 먼저 받아야 합니다.

참고코드 위치와 이웃 문서

무엇어디
샛길 컨트롤러 · 직결 폴백 · 시도 상한 3apps/web/shared/lib/video-audio-loopback.ts
5초 연결 대기 · 타임아웃 시 ICE 진단 호출apps/web/shared/lib/webrtc-audio-loopback.ts
아동 도움 요청 송신apps/web/entities/guest-socket/model/use-guest-socket.ts
진행자 도움 알림 수신apps/web/entities/monitor-session/model/use-monitor-session.ts
실기기 A/B 스위치?videoLoopback=off (직결 고정 — 덕킹은 남으므로 대응책 아님)