Shaka Player 파헤치기 - 5.2.0 Changelog 분석

5.2.0은 Breaking Change 표시 없이도 재생 내부 경로가 크게 움직인 릴리스입니다. HLS의 기본 경로가 바뀌었고, URL 처리와 CMCD 구현이 교체되었습니다. 이 글에서는 체인지로그와 주요 PR을 근거로 5.2.0을 분석합니다.

릴리스 개요

5.2.0은 2026년 7월 10일에 배포되었습니다. 새 기능 60건, 버그 수정 59건, 성능 개선 18건입니다. 현재 5.2 라인은 previous 브랜치로 유지보수되고 있습니다.

동작이 바뀌는 변경

HLS sequenceMode 기본 비활성화

#10325 Disable sequenceMode by default

manifest.hls.sequenceMode의 기본값이 device.supportsSequenceMode()에서 false로 바뀌었습니다. 이제 Chrome, Firefox, Safari 등에서 segments mode가 기본 재생 경로입니다. PR은 sequence mode를 단계적으로 없애는 계획(#9323)의 일환이라고 설명합니다.

HLS 서비스라면 가장 먼저 확인해야 할 변경입니다. 이전 동작이 필요하면 설정할 수 있지만, 옵션 자체가 향후 사라질 예정입니다.

1player.configure('manifest.hls.sequenceMode', true);

Worker 트랜스먹싱

#9914 transmux in a worker (이슈 #1735)

트랜스먹싱을 Web Worker에서 수행할 수 있게 되었습니다. 단, mediaSource.transmuxWorkerUrl을 설정해야 동작하며 기본값은 빈 문자열입니다. 워커 URL이 없거나, 생성에 실패하거나, 요청이 타임아웃되거나, 기기가 제외 대상이면 메인 스레드로 돌아갑니다.

1player.configure('mediaSource.transmuxWorkerUrl', '/shaka/transmuxer.worker.js');

위 경로는 예시이며, PR에서 추가한 별도 워커 번들을 서비스에서 제공해야 합니다. 초기 버전의 안정화는 5.2.1, 5.2.2 패치에서 이어졌습니다.

goog.Uri에서 URL API로

#10197은 Closure의 goog.Uri 사용을 제거하고 네이티브 URL을 쓰는 shaka.util.URL을 추가했습니다. URL 파싱과 쿼리 처리의 기반 구현이 바뀌었으므로, 커스텀 네트워킹 플러그인에서 URL을 다룬다면 확인이 필요합니다. 5.2.x 패치에는 기존 쿼리 파라미터 재인코딩(5.2.5)과 CMCD 쿼리 모드의 상대 URI 실패(5.2.15) 수정도 있습니다.

CMCD 구현 교체

#10060 vendor @svta/cml-cmcd, replace custom encoder + state machine

자체 CMCD 인코더와 상태 머신을 Common Media Library의 @svta/cml-cmcd로 교체했습니다. PR은 CTA-5004 규격에 맞추기 위한 의도적인 전송 형식 변경을 명시합니다.

  • nor URL이 루트 상대 경로가 되고, V2에서는 inner-list 형식이 됩니다.
  • ld, lh 키가 제거되었습니다.
  • V2 인코딩이 SFV 규격을 따릅니다.

CMCD 데이터를 수집하는 서버나 CDN 로그 파서가 있다면 이 형식 변경을 반영해야 합니다.

DASH와 HLS

  • Linked Period(#10221): DASH 6판의 ImportedMPD로 연결된 Period를 해석합니다.
  • URL 파라미터(#10222): urlparam:2025의 RequestParam을 지원합니다. urlparam:2016도 함께 지원합니다.
  • EXT-X-DATERANGE의 timelineregionadded 발생(#10301, 이슈 #9828): HLS에서도 DASH처럼 타임라인 이벤트를 받을 수 있습니다.
  • DASH 콜백 이벤트 비콘, MPD와 Period 수준의 Essential/SupplementalProperty 지원
  • HLS PROGRAM-DATE-TIME 불연속 구간에서 정확한 재생 시각 보고

DRM과 복구

Safari ClearKey(#10180): WebCrypto를 사용해 Safari에서 ClearKey 재생을 지원합니다. 이후 5.2.13에서 cbcs ClearKey 손상 재생 방지 수정이 이어졌습니다.

깨진 I-frame 세그먼트 복구(#10304): 일부 패키저는 I-frame 전용 플레이리스트를 첫 I-frame까지 잘라내면서 moof와 mdat을 고치지 않습니다. 이런 세그먼트는 디먹서가 거부합니다. 새로운 ContentWorkarounds.fixBrokenIframes 단계가 프래그먼트를 실제 샘플에 맞게 잘라내고, 남은 키프레임의 길이를 세그먼트 전체로 늘립니다.

stall 복구 재시도(#10327): 이전에는 stall을 깨는 동작을 한 번만 시도했습니다. PR에 따르면 Safari 18.x 등 구형 WebKit은 segments mode의 HLS 불연속 지점에서 멈출 수 있어, 이제 MAX_STALL_RETRIES(초기 시도 후 2회)까지 다시 시도합니다.

UI

  • CSS 변수 테마(#10152, 이슈 #10145): 빌드 결과가 2개로 나뉩니다. 기존 .css는 호환성을 위해 변수를 평탄화하고, .modern.css는 CSS 변수를 유지합니다.
  • 통계 패널 개편(#10144), timeToFirstFrame 통계 추가(#10065)
  • 접근성(#10023): 장식 아이콘의 aria-hidden, 광고 컨트롤의 aria-label, 토글 버튼의 aria-pressed를 정비했습니다.
  • 재생 속도 메뉴의 슬라이더와 프리셋, 자막 스타일 미리보기, Queue 버튼, Apple Immersive Video용 fisheye 프로젝션

성능 개선 18건 분석

5.2.0의 성능 항목은 크게 세 방향입니다.

방향대표 항목근거
매니페스트 처리 축소DASH SegmentTemplate@duration 세그먼트 참조 지연 생성#10050
HLS 라이브 갱신 시 알려진 세그먼트 병합 생략#9998
조회 비용 감소세그먼트 조회의 이진 탐색 확대#9997
할당과 GC 감소timeupdate마다 전체 설정을 깊은 복사하던 코드 제거#10098
H.265, AC-3, EC-3 트랜스먹서의 프레임당 객체 할당 감소체인지로그

#9997은 저사양 TV의 긴 DVR 라이브를 직접 목표로 밝히고 있습니다. #10098은 1줄 변경이지만, liveSync나 vodDynamicPlaybackRate를 쓰는 세션의 timeupdate당 할당을 없앴습니다.

한 가지 주의할 점은 #9998이 5.0.18의 "LL-HLS stall 수정"을 낳았다는 것입니다. 체인지로그에는 "Fix LL-HLS stall on live playlist updates after #9998"로 기록되어 있습니다. 성능 최적화가 회귀를 만들고 곧바로 수정된 사례입니다.

5.2.x 패치의 주요 수정

5.2.1부터 5.2.17까지 버그 수정 124건이 있습니다. 앞선 라인과 공유되는 항목을 뺀 대표 수정입니다.

분류주요 항목버전
트랜스먹싱워커 타임아웃, 실패 시 메인 스레드 폴백5.2.1, 5.2.2
썸네일프리뷰가 플레이어 크기에 맞게 스케일되도록 수정5.2.1
네트워크재시도 간 헤더 격리5.2.2
HLS먹스드 TS의 segments mode 오디오/비디오 싱크5.2.5
네트워크장애 시 variant 전환을 끝없이 반복하지 않고 에러로 종료5.2.15
HLS미디어 플레이리스트 실패 시 redundant URI 폴백5.2.16
MSEchangeType 실패 시 MediaSource 리셋으로 폴백5.2.16

마지막 5.2.17에는 5.3.4에서 다룬 생명주기 수정이 함께 들어갔습니다.

마치며, 정리

  • 5.2.0은 표시된 Breaking Change는 없지만 HLS 기본 경로가 segments mode로 바뀌었습니다.
  • Worker 트랜스먹싱은 mediaSource.transmuxWorkerUrl을 설정해야 동작합니다.
  • CMCD 전송 형식과 URL 처리 구현이 바뀌었으므로 관련 서버와 플러그인을 확인해야 합니다.
  • 성능 개선은 저사양 기기와 긴 DVR 라이브를 겨냥합니다.
  • 5.2로 올린다면 초기 버전보다 최신 패치인 5.2.17을 사용하는 편이 좋습니다.