DASH 동영상에 소리가 없을 때 해결 방법

MPD·MPEG-DASH의 영상·오디오 트랙, CORS, DRM, 매니페스트 문제로 무음이 되는 원인을 해결합니다.

DASH로 다운로드했는데 소리가 안 나온다면, 십중팔구는 같은 함정입니다. 영상과 오디오가 별개의 트랙인데 영상 트랙만 집에 데려온 거예요. 이 글은 MPD의 실제 처리 흐름을 따라가며 소리가 어느 단계에서 사라지는지, 어떻게 되살리는지 짚어드립니다.


먼저 이해하기: DASH는 왜 소리를 잃는가

MPD는 "URL 하나 = 파일 하나"가 아닙니다. AdaptationSet이 영상·오디오·자막을 각각의 그룹으로 나누고, 그 안에 비트레이트/화질별 Representation이 여럿 달려 있는 XML 트리입니다. 구조만 봐도 이해가 됩니다:

MPD
├── AdaptationSet: Video
│   └── Representation 1080p
│       ├── init segment(fMP4 헤더, 코덱 설정)
│       ├── segment-001.m4s
│       ├── segment-002.m4s
│       └── ...
└── AdaptationSet: Audio
    └── Representation 128kbps
        ├── init segment
        ├── segment-001.m4s
        ├── segment-002.m4s
        └── ...
                    ↓
            FFmpeg WASM 병합
                    ↓
              output.mp4

이건 HLS와는 완전히 다른 성격입니다. HLS는 보통 영상과 오디오를 같은 TS 세그먼트에 넣어서, 세그먼트만 가져와도 소리까지 붙어 나옵니다. DASH는 fMP4라서 오디오와 영상을 따로 전송하고, 두 트랙을 모두 받아 병합해야 합니다. 도구가 영상 트랙만 인식하면 결과물은 무성영화가 됩니다. 둘의 차이는 비디오 스니핑 — 지원하는 비디오 포맷에서, MPD의 AdaptationSet·Representation·SegmentTemplate 전체 계층을 뜯어본 해설은 DASH 딥에서 확인할 수 있습니다.

FlowPick의 DASH 처리 흐름: MPD 파싱 → 영상/오디오 트랙 식별 → 세그먼트와 초기화 세그먼트를 각각 다운로드 → FFmpeg WASM으로 병합. 구현 상세는 비디오 스니핑 — 오디오/비디오 분리 처리다운로드 엔진 아키텍처 — DASH 스트림의 특수 처리를 참고하세요.

먼저 해볼 일

이 순서대로 한 번 돌려보면 대부분 해결됩니다:

  1. 원본 동영상 페이지를 열어 재생을 시작합니다(재생하지 않으면 MPD를 내보내지 않는 사이트가 많습니다).
  2. FlowPick으로 MPD 매니페스트를 감지합니다.
  3. 트랙 목록에서 영상 트랙과 오디오 트랙을 모두 체크합니다.
  4. 영상 화질에 맞는 오디오 트랙(언어·비트레이트가 맞는 것)을 하나 고릅니다.
  5. 병합이 끝날 때까지 기다렸다가 소리를 켜고 재생합니다.

이렇게 해도 무음이라면 아래 증상에 맞춰 보세요.


증상 1: 영상 트랙만 선택했다

증상: 다운로드는 순식간, 파일은 수 MB~수십 MB, 플레이어에 화면은 나오는데 소리가 없다.

가장 흔한 원인입니다. 비교 대상이 없을 정도로요. DASH 다운로더는 기본적으로 비트레이트 내림차순으로 트랙을 나열하기 때문에, 맨 위 1080p 줄만 체크하고 그 아래 "Audio" 그룹을 놓치는 사람이 많습니다. ffprobe 한 줄로 파일에 오디오 스트림이 있는지 확인해 보세요:

ffprobe -hide_banner output.mp4

출력에 Stream #0:0: Video만 있고 Stream #0:1: Audio가 없다면 이 문제입니다. MPD로 돌아가 오디오 트랙도 함께 체크하고 다시 받으세요. FlowPick은 같은 언어·최고 비트레이트의 오디오 트랙을 자동으로 매칭해 주니 직접 계산할 필요가 없습니다.


증상 2: MPD에 아예 오디오 트랙이 없다

증상: 트랙 목록을 다 뒤져도 오디오가 없다. 또는 "무음" 영상 스트림 한 개만 있다.

MPD는 동적으로 생성되어, 같은 동영상도 지역이나 로그인 상태에 따라 받는 매니페스트가 달라집니다. 흔한 경우는 세 가지:

  • 지역 제한: 특정 지역에는 영상 트랙만, 또는 특정 언어만 내려준다.
  • 로그인 상태: 로그인 전에는 MPD에 오디오 AdaptationSet이 없고, 로그인하면 나타난다.
  • 요청 헤더: Referer/Cookie로 오디오 트랙을 줄지 말지 정하는 사이트가 있다.

MPD 주소를 뽑아 curl로 검증해 보세요(주소는 자신의 것으로 바꿔야 합니다):

curl -sL -H "Referer: https://www.example.com/watch/123" \
     "https://cdn.example.com/master.mpd" > master.mpd

# 매니페스트에 오디오 AdaptationSet이 정말 있는지 확인
grep -c 'AdaptationSet.*type="audio"' master.mpd
# 출력 0 = 정말 오디오 트랙 없음; >0 = 있는데 체크를 안 한 것 (증상 1로 이동)

출력이 0이라면 원본 동영상 페이지로 돌아가 로그인 상태를 유지하고 확장으로 다시 감지하세요. AdaptationSet·Representation·SegmentTemplate 노드가 구체적으로 어떤 모양인지는 DASH 스트리밍이란? 비개발자를 위한 MPD 파일 해설이 교과서보다 훨씬 쉽게 설명합니다.


증상 3: CORS / 403 / 404

증상: 영상 트랙은 잘 받아지는데 오디오 세그먼트를 끌어오면 바로 403/404. 또는 온라인 도구가 CORS를 보고한다.

온라인 도구는 flowpick.com 도메인에서 실행되기 때문에 대상 사이트의 Cookie도 원본 페이지의 Referer도 실어 보낼 수 없어서, 원본 서버가 검증에 걸러냅니다. 이것은 핫링크 방지이지, 소리가 없다는 것 자체의 문제가 아닙니다. 대처법:

  • 핫링크 방지가 있는 사이트는 확장 프로그램으로 전환해서 원본 동영상 페이지에서 작업하세요. Referer/Cookie가 자동으로 붙습니다.
  • v1.1.1+ 확장은 핫링크 방지 프록시를 내장합니다. 미리보기와 다운로드에서 Referer와 Cookie를 자동으로 채워 주고, 저장 전에 응답도 검사해서 HTML 에러 페이지를 미디어로 저장하는 사고도 막아 줍니다.
  • ?token=xxx&expires=yyy가 붙은 오디오 세그먼트 URL은 몇 분 안에 만료됩니다. 뜨거울 때 받으세요. 중간에 밥 먹으러 가지 말고요.
핫링크 방지 프록시는 v1.1.1에서 추가되었습니다. 업그레이드하면 Bilibili, Weibo 같은 사이트의 성공률이 확실히 올라갑니다. 업그레이드 방법은 설치 가이드 — 확장 업데이트, 기능 상세는 FlowPick v1.1.1: 보호 리소스 미리보기 및 다운로드를 참고하세요. Referer 문제의 완전한 진단(curl 재현 포함)은 M3U8 문제 해결 — 403과 핫링크 방지를 참고하세요. 방법은 DASH에도 그대로 적용됩니다.

증상 4: 오디오 세그먼트 다운로드가 불완전하다

증상: 두 트랙을 다 체크했는데 병합 후에도 무음이거나 소리가 끊긴다. 콘솔에 오디오 세그먼트 실패 기록이 몇 건 보인다.

오디오와 영상은 따로 다운로드됩니다. 영상이 전부 받아졌어도 오디오가 한두 조각 덜 받아졌을 수 있고, 병합할 때는 부서진 오디오 트랙 그대로 진행할 수밖에 없습니다. 먼저 세그먼트가 실제로 유실됐는지 확인해 보세요:

# 오디오 세그먼트의 HTTP 상태를 하나씩 확인 (URL은 자신의 것으로)
for i in $(seq 1 200); do
  url="https://cdn.example.com/audio/seg-$i.m4s"
  status=$(curl -s -o /dev/null -w "%{http_code}" "$url")
  echo "seg-$i.m4s -> $status"
done

403/404/5xx가 나오면 받아올 수 없는 세그먼트가 있다는 뜻입니다. 대처법:

  • 네트워크가 들쭉날쭉하면 동시 다운로드 수를 2~3으로 낮추세요. 재시도 부담이 줄어듭니다. 오디오 트랙은 애초에 세그먼트가 얼마 없어서 느려도 문제없습니다.
  • 일부만 5xx라면 잠시 기다렸다가 다시 받으세요. 원본 서버가 CDN 오리진 회수 중일 수 있습니다.
  • 같은 세그먼트에서 매번 끊기면 대부분 임시 토큰 만료입니다. 원본 페이지로 돌아가 다시 감지해 새 MPD를 받아오세요.

동시 다운로드 수와 성능의 관계는 다운로드 엔진 아키텍처 — 동시 다운로더, 재시도와 백오프 로직은 다운로드 엔진 아키텍처 — 재시도 메커니즘을 참고하세요.


증상 5: 파일 크기는 정상인데 소리가 없다

증상: 파일이 작은 게 아니다. ffprobe에도 오디오 스트림이 보인다. 그런데 재생하면 무음이거나 음성/영상이 어긋난다.

이건 보통 다운로드 문제가 아니라 병합 또는 인코딩 단계의 문제입니다:

증상원인처리
오디오 스트림은 있는데 재생이 무음먹서가 오디오를 제대로 매칭하지 못함(H.265 영상 + 이상한 오디오 태그)출력 포맷을 바꾸거나 ffmpeg 명령줄로 리무싱 다시 실행
음성/영상 어긋남SegmentTimeline 타임스탬프가 불연속FFmpeg으로 재인코딩해 수정
VLC에선 재생되는데 시스템 플레이어에선 안 됨플레이어에 디코더가 없음(VP9/AV1/Opus)VLC / PotPlayer로 전환. 파일 문제가 아님

ffmpeg로 오디오만 따로 뽑아 오디오 자체가 멀쩡한지 확인해 보세요:

ffmpeg -i output.mp4 -map 0:a -c copy audio.m4a
# 뽑아낸 audio.m4a가 정상 재생되면 → 오디오는 멀쩡, 문제는 병합 단계

FFmpeg WASM 리무싱 원리는 포맷 변환 — TS 세그먼트 → MP4(FFmpeg WASM 리무싱), 오디오/비디오 분리 병합 흐름은 포맷 변환 — 오디오/비디오 분리 병합을 참고하세요.


증상 6: DRM 보호

증상: MPD에 <ContentProtection>이 있거나, 재생 전에 Widevine/PlayReady CDM 모듈을 불러온다.

이건 다운로드가 불가능합니다. FlowPick은 명시적으로 거부합니다. 이는 기능이지 버그가 아닙니다. DRM은 권리자가 하드웨어 수준 암호로 잠가 놓은 것이고, DRM을 풀 수 있다고 주장하는 다운로더는 거짓말을 하거나 불법 행위입니다. 시간과 디스크를 낭비하지 마세요. 법적·기술적 경계는 스트리밍 비디오 다운로드는 합법인가?기술과 법적 체크리스트를 참고하세요.

DRM 감지 방식과 미지원 목록 전체는 알려진 제한 — DRM 보호 콘텐츠, DASH 오디오/비디오 분리의 알려진 엣지 케이스는 알려진 제한 — 분리 음비디오 스트림을 참고하세요.

진단 도구 빠른 참조

F12로 개발자 도구를 열어 자주 쓰는 체크포인트입니다:

확인패널작업
MPD가 요청됐는지Network필터 칸에 mpd 입력, 새로고침 후 동영상 재생
오디오 세그먼트 상태 코드Network필터 칸에 .m4s 입력, Status 열과 크기 확인
어떤 헤더가 붙었는지Network → 요청 → HeadersRequest Headers에 Referer/Cookie가 있는지 확인
병합 오류Consoleffmpeg 또는 wasm으로 검색

환경 정보에 의문이 있다면 Console에서 아래 코드를 실행해 환경 리포트를 만들고 피드백에 활용하세요:

const report = {
  ua: navigator.userAgent,
  fsa: 'showDirectoryPicker' in window,
  sab: typeof SharedArrayBuffer !== 'undefined',
  coi: self.crossOriginIsolated,
  storage: await navigator.storage?.estimate().catch(() => null),
  ts: new Date().toISOString(),
}
console.log(JSON.stringify(report, null, 2))

리포트에는 브라우저 환경 정보만 포함됩니다. 방문 기록이나 개인 데이터는 일절 들어가지 않습니다.


정말 다운로드할 수 없는 경우

  • DRM 보호 콘텐츠(Widevine / PlayReady / FairPlay)
  • 로그인 우회나 유료 장벽을 뚫어야 하는 콘텐츠
  • 커스텀 세그먼트의 MSE 사이트로, 네이티브 MPD를 내보내지 않는 곳
  • 비공개 무손실 또는 개별 암호화된 다중 오디오 트랙

이것들은 설계상 미지원이지 버그가 아닙니다. 이런 케이스에서 올바른 동작은 조용히 손상된 파일을 만드는 것이 아니라 오류를 내는 것입니다. 이것이 FlowPick의 태도입니다. 법적·기술적 경계에 대해서는 스트리밍 비디오 다운로드는 합법인가?기술과 법적 체크리스트를 참고하세요.


관련 문서