Shaka Player 파헤치기 - 5.3.0 Changelog 분석

5.3.0은 현재 latest 라인의 시작 버전입니다. 새 코덱과 포맷을 넓히고, 광고와 SCTE-35 처리를 정비했으며, 실험 기능을 정리했습니다. 이 글에서는 체인지로그와 주요 PR을 근거로 5.3.0부터 5.3.3까지 살펴봅니다. 5.3.4는 별도 글에서 다뤘습니다.

릴리스 개요

5.3.0은 2026년 10월 16일에 배포되었습니다. 새 기능 44건, 버그 수정 121건, 성능 개선 1건입니다. 버그 수정이 많은 이유는 마이너 체인지로그가 5.2.0 이후의 변경을 모으기 때문이며, 그중 일부는 5.1.x나 5.2.x로 이미 백포트된 항목입니다.

동작이 바뀌는 변경

변경내용PR
DASH JSON 제거5.1.0에서 추가한 실험 빌드 전용 기능 제거. DASH_INVALID_JSON(4061)은 retired#10705
MoQT 구버전 제거draft-14, draft-16 제거#10706
showMenusOnTheRight deprecated설정 시 경고만 남기고 무시, v6에서 제거#10708

앞의 두 건은 사실상 호환성을 깨는 변경이지만, PR에 따르면 실험 빌드에만 있던 기능이라 메인테이너 합의로 Breaking Change로 표시하지 않았습니다. 체인지로그의 표시만으로 판단하면 놓칠 수 있는 부분입니다. 메뉴는 이제 항상 여는 버튼 옆에 위치합니다.

코덱과 포맷

  • TS의 AV1(#10603): MPEG-2 TS로 전달되는 AV1을 트랜스먹싱합니다. CEA 자막을 AV1에서 추출하는 기능도 추가되었습니다.
  • IAMF 완성(#10586, 이슈 #10581): 이전에는 매니페스트의 codecs 문자열로만 인식해서 HLS 미디어 플레이리스트에서 동작하지 않았습니다. 이제 iacb 박스를 파싱해 codecs 문자열을 다시 만듭니다.
  • MKV(#10667, 이슈 #10388): 실험 빌드에 추가되었습니다.
  • Preselections(#10344, 이슈 #9139): DASH의 차세대 오디오 선택 방식을 지원합니다.
  • 오디오 트랙 제공 방식(#10689): Apple의 계층형 사다리처럼 5.1과 Atmos가 일부 화질에만 있을 때, 이전에는 ABR이 움직일 때마다 트랙 목록이 바뀌었습니다. 이제 모든 화질의 오디오를 제공하고, ABR은 더 적은 채널로 폴백할 수 있습니다.

광고와 SCTE-35 통합

SCTE-35 통합(#10606): DASH, HLS, EMSG로 들어오는 SCTE-35를 전용 타임라인으로 모아 XML과 바이너리 페이로드를 정규화합니다. 기존 timeline region 이벤트 동작은 유지합니다.

런타임 스킵 구간(#10338): 스킵 구간은 프레젠테이션 타임라인에서 세그먼트가 없는 것처럼 다루는 [start, end) 구간입니다. 매니페스트를 고치지 않고 되돌릴 수도 있습니다. PR은 재생 위치를 감시해 currentTime을 옮기는 방식의 문제로 다음을 듭니다.

  • 건너뛸 세그먼트를 이미 다운로드하고 디코딩합니다.
  • 폴링 간격만큼 늦게 이동해 광고 프레임이 잠깐 보입니다.

이 기능으로 MediaTailor에서 이미 본 광고 구간을 건너뜁니다.

인터스티셜 쿨다운(#10494): ads.interstitialCooldown으로 SGAI 광고 구간 종료 뒤 일정 시간 다른 광고가 재생되지 않게 합니다. 기본값은 0이며 비활성화 상태입니다.

클릭 URI 제한(#10412): 인터스티셜의 클릭 URI는 매니페스트와 광고 응답에서 온 값이 window.open()으로 전달되고 있어, http(s) 스킴으로 제한했습니다.

자막 스타일 커스터마이징과 UI

#10697은 자막 자체의 스타일을 덮어쓰는 textDisplayer 설정 6개를 추가했습니다.

1player.configure('textDisplayer.fontColor', '#ffff00');
2player.configure('textDisplayer.backgroundOpacity', 0.5);

설정할 수 있는 항목은 fontFamily, fontColor, fontOpacity, backgroundColor, backgroundOpacity, characterEdgeStyle입니다. 기본값에서는 렌더링이 바뀌지 않고, UITextDisplayer에서만 지원됩니다. UI에도 해당 메뉴와 초기화 버튼, 중첩 메뉴 그룹이 추가되었습니다.

그 외 UI 변경은 다음과 같습니다.

  • 앞뒤 시크 버튼, 큰 버튼의 가운데 정렬 툴팁
  • playbackRateSliderStep 설정
  • 키보드 조작이 진행 중인 시크바 드래그를 이어받는 동작

주요 버그 수정

MSE 복구

#10380 이전에는 MSE append가 실패해도 MediaSource 리셋보다 스트림 전환이 먼저 일어나, 방금 실패한 SourceBuffer에 다음 세그먼트를 추가했습니다. PR에 따르면 임베디드 WebKit 같은 플랫폼에서는 이것이 비동기 네이티브 크래시로 이어집니다. 이제 리셋을 먼저 수행합니다.

#10409는 Severity 판단을 분리했습니다. 리셋만 성공한 경우는 완전한 회복으로 보지 않아 CRITICAL을 유지하고, 스트림 비활성화까지 성공해야 RECOVERABLE로 낮춥니다. 자세한 흐름은 에러 처리 글에서 다뤘습니다.

그 외 안정성

분류수정PR
트랜스먹싱워커 타임아웃 시 CRITICAL 대신 메인 스레드 폴백#10349
생명주기재생이 멈춘 상태에서 destroy()가 영원히 끝나지 않던 문제 수정#10624
프리페치청크마다 전체 버퍼를 복사하던 O(N²) 제거#10448

#10624는 load()가 JS 아래 계층에서 멈추면 destroy()가 뮤텍스를 영원히 기다리는 문제입니다. PR 작성자는 webOS와 Tizen 운영 환경에서 겪었다고 밝혔습니다.

시크바 관련으로는 키보드 시크 프리뷰, 썸네일 스케일링, 챕터 마커 정렬이 수정되었습니다. 오프라인에서는 IndexedDB 연결 누수와 DRM 세션 정리 문제가 해결되었습니다.

5.3.1 ~ 5.3.3 패치

버전배포일주요 수정
5.3.110월 19일textDisplayer.fontFamily에 임의의 CSS 폰트 허용
5.3.210월 23일네트워크 장애 시 에러로 종료, SegmentTemplate@endNumber 준수, HLS 라이브 가용 구간 고정, WebVTT와 TTML 위치 계산
5.3.310월 29일HLS redundant URI 폴백, changeType 실패 시 MediaSource 리셋, 리셋 후 재생 위치 유지, 실패한 라이선스 요청의 세션 닫기

5.3.1은 5.3.0에서 추가한 fontFamily를 3일 만에 보완한 것입니다.

마치며, 정리

  • 5.3.0은 AV1 on TS, IAMF, MKV, Preselections로 포맷 지원을 넓혔습니다.
  • SCTE-35 타임라인과 런타임 스킵 구간은 광고 처리의 기반을 정비한 변경입니다.
  • 실험 빌드의 DASH JSON과 MoQT 구버전은 Breaking Change 표시 없이 제거되었으니, 실험 빌드 사용자는 PR까지 확인해야 합니다.
  • MSE 복구 순서와 Severity 판단이 바뀌어, 임베디드 기기에서 안정성을 기대할 수 있습니다.
  • 5.3 라인을 쓴다면 5.3.4까지 올리는 것을 권합니다.