웹 수신기 플레이어 스트리밍 프로토콜

현재 웹 수신기 SDK는 다음 세 가지 유형의 스트리밍 프로토콜을 지원합니다.

DASH, HTTP 실시간 스트리밍, 부드러운 스트리밍

이 문서에서는 각 스트리밍 프로토콜을 지원합니다. 각 프로토콜에서 지원되는 태그에 관한 설명은 세부 프로토콜 사양과 비교하여 상당히 축약되어 있습니다. 목표는 각 프로토콜을 사용하는 방법을 간단히 이해하고 이해하며 Cast 지원 기기에서 지원되는 프로토콜의 기능을 스트리밍 환경을 제공하는 것입니다.

HTTP를 통한 동적 가변 품질 스트리밍 (DASH)

ISO의 세부 DASH 사양

DASH는 적응형 비트 전송률 스트리밍 프로토콜로, HTTP(S) 서버를 통해 고화질 동영상 스트리밍을 지원합니다. XML로 작성된 매니페스트에는 동영상 콘텐츠를 초기화하고 다운로드하는 방법에 대한 대부분의 메타데이터 정보가 포함되어 있습니다. 웹 수신기 플레이어에서 지원하는 주요 개념은 <Period>, <AdaptationSet>, <Representation>, <SegmentTemplate>, <SegmentList>, <BaseUrl>, <ContentProtection>입니다.

DASH 매니페스트는 루트 <MPD> 태그로 시작하고, 내부에는 스트리밍 콘텐츠를 나타내는 하나 이상의 <Period> 태그가 포함됩니다. <Period> 태그를 사용하면 다양한 스트리밍 콘텐츠의 순서를 지정할 수 있고 기본 콘텐츠와 광고 또는 연속된 여러 동영상 콘텐츠를 구분하는 데 자주 사용할 수 있습니다.

<MPD> 아래의 <AdaptationSet>는 한 가지 미디어 스트림 유형(대부분의 경우 동영상, 오디오 또는 자막)에 대한 표현 집합입니다. 가장 일반적으로 지원되는 MIME 유형은 '동영상/mp4', '오디오/mp4', '텍스트/vtt'입니다. <AdaptationSet> 아래에 선택적으로 <ContentComponent contentType="$TYPE$">를 포함할 수 있습니다.

<AdaptationSet> 내에 <Representation> 태그 목록이 있어야 하고 웹 수신기 플레이어는 codecs 정보를 사용하여 MSE 소스 버퍼를 초기화하고 bandwidth 정보를 사용하여 재생할 올바른 표현/비트 전송률을 자동으로 선택합니다.

<Representation>의 경우 미디어 세그먼트는 단일 세그먼트 표현의 경우 <BaseURL>, 세그먼트 목록 (HLS와 유사)의 경우 <SegmentList> 또는 <SegmentTemplate>를 사용하여 설명합니다.

<SegmentTemplate>의 경우 템플릿을 통해 초기화 세그먼트와 미디어 세그먼트를 나타내는 방법을 나타냅니다. 아래 예에서 $Number$는 세그먼트 번호를 CDN에서 사용할 수 있음을 나타냅니다. 따라서 재생이 계속됨에 따라 seg1.m4s, seg2.m4s 등으로 변환됩니다.

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns2="http://www.w3.org/1999/xlink"
  profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash264" type="static"
  publishTime="2016-10-05T22:07:14.859Z" mediaPresentationDuration="P1DT0H0M0.000S" minBufferTime="P0DT0H0M7.500S">
  <Period id="P0">
    <AdaptationSet lang="en" segmentAlignment="true">
      <ContentComponent id="1" contentType="audio"/>
      <SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
        duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
      <Representation id="1" bandwidth="150123" audioSamplingRate="44100"
        mimeType="audio/mp4" codecs="mp4a.40.2" startWithSAP="1">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
        <BaseURL>http://www.google.com/testVideo</BaseURL>
      </Representation>
    </AdaptationSet>
    <AdaptationSet segmentAlignment="true">
      <ContentComponent id="1" contentType="video"/>
      <SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
        duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
      <Representation id="1" bandwidth="212191" width="384" height="208" sar="26:27"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate1/</BaseURL>
      </Representation>
      <Representation id="1" bandwidth="366954" width="512" height="288" sar="1:1"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate2/</BaseURL>
      </Representation>
      <Representation id="1" bandwidth="673914" width="640" height="352" sar="44:45"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate3/</BaseURL>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

<SegmentTemplate>의 경우 일반적으로 <SegmentTimeline> 태그를 사용하여 각 세그먼트의 길이와 반복되는 세그먼트를 나타냅니다. timescale(1초를 나타내는 단위)은 이 단위를 기준으로 세그먼트의 시간을 계산할 수 있도록 <SegmentTemplate> 속성의 일부로 포함되는 경우가 많습니다. 아래 예에서 <S> 태그는 세그먼트 태그를 나타내고 d 속성은 세그먼트의 길이를 지정하며 r 속성은 media 속성에 지정된 대로 미디어 세그먼트를 다운로드하기 위해 $Time$를 올바르게 계산할 수 있도록 동일한 기간의 반복 세그먼트 수를 지정합니다.

<SegmentTemplate>
  timescale="48000"
  initialization="$RepresentationID$-init.dash"
  media="$RepresentationID$-$Time$.dash"
    startNumber="1">
    <SegmentTimeline>
      <S t="0" d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
   </SegmentTimeline>
</SegmentTemplate>

다음은 <SegmentList>를 사용한 표현의 예입니다.

<Representation id="FirstRep" bandwidth="2000000" width="1280"
  height="720">
  <BaseURL>FirstRep/</BaseURL>
  <SegmentList timescale="90000" duration="270000">
     <RepresentationIndex sourceURL="representation-index.sidx"/>
     <SegmentURL media="seg-1.ts"/>
     <SegmentURL media="seg-2.ts"/>
     <SegmentURL media="seg-3.ts"/>
  </SegmentList>
</Representation>

단일 세그먼트 파일의 경우 <SegmentBase>는 종종 바이트 범위 요청과 함께 <BaseURL> 파일의 어느 부분에 색인이 포함되었는지를 지정하고 나머지는 재생이 진행되거나 탐색이 발생할 때 가져올 수 있습니다. 여기서 Initialization 범위는 init 메타데이터 범위를 지정하고 indexRange 범위는 미디어 세그먼트의 색인을 지정합니다. 현재 연속 바이트 범위만 지원됩니다.

<Representation bandwidth="4190760" codecs="avc1.640028"
  height="1080" id="1" mimeType="video/mp4" width="1920">
  <BaseURL>video.mp4<BaseURL>
  <SegmentBase indexRange="674-1149">
    <Initialization range="0-673" />
  </SegmentBase>
</Representation>

사용되는 표현과 관계없이 스트림이 보호되는 경우 <AdaptationSet> 아래에 <ContentProtection> 섹션이 표시될 수 있습니다. 여기서 schemeIdUri는 사용할 DRM 시스템을 고유하게 식별합니다. 공통 암호화에 키 ID(선택사항)를 포함할 수 있습니다.

<!-- Common Encryption -->
<ContentProtection
  schemeIdUri="urn:mpeg:dash:mp4protection:2011"
  value="cenc"
  cenc:default_KID="7D2714D0-552D-41F5-AD56-8DD9592FF891">
</ContentProtection>

<!-- Widevine -->
<ContentProtection
  schemeIdUri="urn:uuid:EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED">
</ContentProtection>

더 많은 예시와 자세한 내용은 MPEG-DASH 사양을 참고하세요. 다음은 현재 위에 언급되지 않은 태그의 추가 DASH 속성 목록입니다.

속성 이름 속성 함수
mediaPresentationDuration 동영상 콘텐츠의 길이
minimumUpdatePeriod <MPD> 태그의 속성입니다. 매니페스트를 새로고침해야 하는 빈도를 지정합니다.
type <MPD> 태그의 속성입니다. 실시간 스트림임을 나타내는 '동적'입니다.
프레젠테이션 시간 오프셋 <SegmentBase> 태그의 속성. 마침표의 시작 부분부터 프레젠테이션 시간 오프셋을 지정합니다.
시작 번호 기간 내 프레젠테이션의 첫 번째 미디어 세그먼트 수를 지정합니다. 주로 실시간 스트림에서 사용됩니다.

또한 DASH용 MP4 프래그먼트 내 EMSG 상자 인식을 지원하고 개발자에게 EmsgEvent를 제공합니다.

현재 웹 수신기 플레이어는 주요 DASH 사용 사례를 지원하지만 다음은 DASH의 현재 구현에서 사용하지 않거나 사용하지 않는 일반 속성 목록입니다. 즉, 매니페스트에 이 항목이 포함되어 있는지와 관계없이 콘텐츠의 재생 환경에는 영향을 미치지 않습니다.

  • availabilityStartTime
  • 세그먼트 정렬

HTTP 실시간 스트리밍(HLS)

HTTP 실시간 스트리밍의 개요와 전체 사양은 여기에서 확인할 수 있습니다.

웹 수신기 플레이어의 주요 강점 중 하나는 MSE에서 HLS 재생을 지원하는 기능입니다. 매니페스트가 단일 파일로 들어오는 DASH와 달리 HLS는 모든 변형 스트림의 목록이 포함된 마스터 재생목록을 각 URL과 함께 전송합니다. 변형 재생목록은 미디어 재생목록입니다. 웹 수신기 플레이어가 현재 마스터 재생목록에서 지원하는 두 가지 주요 HLS 태그는 다음과 같습니다.

태그 이름 기능
#EXT-X-STREAM-INF 비트 전송률/변형 스트림을 지정합니다. 적응형 비트 전송률 스트리밍 선택을 지원하는 BANDWIDTH 속성이 필요합니다. CODECS 속성은 "avc1.42c01e,mp4a.40.2"와 같은 MSE를 초기화하는 데 적극 권장됩니다. 지정하지 않으면 기본 케이스는 H264 기본 프로필 3.0 동영상 및 "mp4a.40.2" 오디오 인코딩 콘텐츠로 설정됩니다.
#EXT-X-미디어 콘텐츠를 나타내는 추가 미디어 재생목록 (URI 속성)을 지정합니다. 일반적으로 다른 형식 (5.1 서라운드 사운드)이나 언어의 대체 오디오 스트림입니다. VIDEO, AUDIO, SUBTITLES 또는 CLOSED-CAPTIONS가 포함된 TYPE 속성이 허용됩니다. DEFAULT 속성을 YES로 설정하면 이 대체 스트림이 기본적으로 선택된다는 의미입니다.

다음은 웹 수신기 플레이어가 현재 미디어 재생목록에서 지원하는 HLS 태그 목록입니다.

태그 이름 기능
#확장 스트림 정보(일반적으로 초 단위의 세그먼트 길이, 다음 줄)에는 세그먼트의 URL이 표시됩니다.
#EXT-X-TARGETDURATION 각 세그먼트의 길이(초)입니다. 이는 실시간 스트림의 재생목록 매니페스트를 다운로드/새로고침하는 빈도도 결정합니다. 웹 수신기 플레이어는 0.1초보다 짧은 시간을 지원하지 않습니다.
#EXT-X-MEDIA-SEQUENCE 이 재생목록의 첫 번째 세그먼트가 나타내는 시퀀스 번호 (일반적으로 실시간 스트림)입니다.
#EXT-X-KEY DRM 키 정보 METHOD 속성은 사용할 키 시스템을 알려줍니다. 현재 AES-128SAMPLE-AES가 지원됩니다.
#EXT-X-BYTERANGE 세그먼트 URL로 가져올 바이트 범위입니다.
#EXT-X-불일치 연속 세그먼트 간 불연속성을 지정합니다. 이는 주로 광고 스트림이 기본 스트림 중간에 표시되는 서버 측 광고 삽입에서 나타납니다.
#EXT-X-PROGRAM-DATE-TIME 다음 세그먼트의 첫 번째 샘플의 절대 시간입니다(예: '2016-09-21T23:23:52.066Z').
#EXT-X-ENDLIST VOD 또는 실시간 스트림 여부

실시간 스트림의 경우 #EXT-X-PROGRAM-DATE-TIME#EXT-X-MEDIA-SEQUENCE를 주요 새로 고침 매니페스트를 병합하는 주요 요인으로 사용합니다. #EXT-X-PROGRAM-DATE-TIME가 있는 경우 새로고침된 세그먼트를 일치시키는 데 사용됩니다. 그렇지 않으면 #EXT-X-MEDIA-SEQUENCE 번호가 사용됩니다. HLS 사양에 따라 일치에 파일 이름 비교를 사용하지 않습니다.

HLS 구현은 5.1 서라운드 사운드와 같은 대체 오디오 스트림을 기본 오디오 재생으로 선택하는 것을 지원합니다. 이렇게 하려면 대체 코덱이 포함된 #EXT-X-MEDIA 태그를 사용하고 스트림 구성에서 세그먼트 형식을 제공해야 합니다.

웹 수신기 플레이어는 특정 사양별 동작을 예상합니다. 예를 들어 #EXT-INF 태그 다음에 URI가 있어야 합니다. 예를 들어 URI가 아니라면 #EXT-X-DISCOUNTINUITY는 재생목록의 파싱에 실패합니다.

#EXT-X-TARGETDURATION초마다 재생목록/매니페스트를 다시 로드하여 새 세그먼트 목록을 가져오고 모든 세그먼트의 새로운 내부 표현을 새 세그먼트로 업데이트합니다. 탐색이 요청될 때마다 탐색 가능한 범위 내에서만 탐색이 이루어집니다. 실시간의 경우 최신 목록의 처음부터 끝부분의 타겟 기간 3까지만 탐색할 수 있습니다. 예를 들어 10개의 세그먼트 목록이 있고 세그먼트 6에는 최대 7개까지만 탐색할 수 있으며 8개까지는 찾을 수 없습니다.

세그먼트 형식 지원

CAF SDK는 오디오의 경우 HlsSegmentFormat, 동영상의 경우 HlsVideoSegmentFormat에서 참조한 대로 여러 형식으로 제공되는 콘텐츠 재생을 지원합니다. 여기에는 AAC 및 AC3 재생과 같은 패킹된 오디오(암호화 및 비암호화) 지원이 포함됩니다. 플레이어에게 콘텐츠를 올바르게 설명하려면 이 정보를 LoadRequestDataMediaInformation에 지정해야 합니다. 지정하지 않으면 기본 플레이어 구성이 콘텐츠를 전송 스트림 패키지 콘텐츠로 재생하려고 시도합니다. 이 속성은 로드 요청 데이터(Android, iOS, )의 모든 발신자에서 또는 메시지 가로채기를 통해 수신기 내에서 설정할 수 있습니다.

웹 수신기에서 콘텐츠를 준비하는 방법에 대한 자세한 내용은 아래의 샘플 코드 스니펫 또는 contentId, contentUrl, 항목을 사용하여 미디어 로드 가이드를 확인하세요.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      ...
      // Specify segment format for an HLS stream playing CMAF packaged content.
      loadRequestData.media.contentType = 'application/x-mpegurl';
      loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.FMP4;
      loadRequestData.media.hlsVideoSegmentFormat = cast.framework.messages.HlsVideoSegmentFormat.FMP4;
      ...
      return loadRequestData;
    });

콘텐츠 보호

위의 #EXT-X-KEY 태그 섹션에 나열된 대로 Cast SDK는 키의 URI를 지정할 수 있는 SAMPLE-AES 또는 SAMPLE-AES-CTR를 지원합니다. 초기화 벡터는 다음과 같습니다.

EXT-X-KEY: METHOD=SAMPLE-AES, \
URI="data:text/plain;base64,XXXXXX", \
IV=0x6df49213a781e338628d0e9c812d328e, \
KEYFORMAT="com.widevine", \
KEYFORMATVERSIONS="1"

이제 지원되는 KEYFORMAT는 Widevine이며, URI에는 디코딩 시 키 ID가 포함된 BASE64로 인코딩된 DRM 정보 XXXXXXX이 포함됩니다.

{
   "content_id": "MTQ1NjkzNzM1NDgxNA==",
   "key_ids": [
      "xxxxxxxxxxxxxxxx"
   ]
}

버전 1은 다음 속성을 정의합니다.

속성 설명
KEYFORMATVERSIONS "1" 이 제안서에서는 키 형식 버전 1을 정의합니다.
KEYFORMAT "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" UUID는 DASH IF IOP의 Widevine UUID입니다. MPD에서는 Widevine으로 암호화된 스트림과 동일한 문자열을 사용합니다.
URI "data:text/plain;base64, <base64 encoded PSSH box>" 데이터 유형 및 PSSH 상자가 포함된 스트림의 URI
METHOD SAMPLE-AES-CTR 콘텐츠를 암호화할 때 사용되는 암호화 암호화를 나타냅니다. SAMPLE-AES는 'cbcs'를 사용하여 콘텐츠가 암호화되었음을 알립니다. SAMPLE-AES-CTR은 AES-CTR 보호 체계 중 하나인 'cenc'를 사용하여 콘텐츠가 암호화되었음을 알립니다.

DASH MPD에 매핑되는 속성:

속성 설명
KEYFORMAT ContentProtection 요소의 schemeIdUri 속성입니다.
URI cenc:pssh 요소의 콘텐츠입니다.
KEYID MPEG DASH의 default_kid와 동일한 역할을 하는 키 ID를 인코딩하는 16바이트 16진수 문자열입니다. 계층적 키 스키마를 사용하는 경우 '루트' 키가 됩니다.

V2 신호 기능이 있는 HLS 재생목록 예:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:2
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init_segment.mp4"
#EXTINF:1.001,
output_video-1.mp4
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="data:text/plain;base64,AAAAPXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAB0aDXdpZGV2aW5lX3Rlc3QiDHRlc3QgY29udGVudA==",KEYID=0x112233445566778899001122334455,KEYFORMAT="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed",KEYFORMATVERSION="1"
#EXTINF:1.001,
output_video-2.mp4
#EXTINF:0.734,
output_video-3.mp4
#EXT-X-ENDLIST

다음은 현재 사용되거나 지원되지 않는 HLS의 기능 및 태그 목록입니다. 이 항목이 있는지 여부와 관계없이 스트리밍 동작에 영향을 미치지 않습니다.

  • #EXT-X-STREAM-INFRESOLUTION= 속성은 무시됩니다.
  • #EXT-X-MEDIAAUTOSELECT= 속성은 사용되지 않습니다. 대신 DEFAULT=를 사용합니다.
  • 마스터 재생목록의 #EXT-X-I-FRAME-STREAM-INF 항목은 무시됩니다.
  • #EXT-X-DISCONTINUITY-SEQUENCE은(는) 무시됩니다.
  • #EXT-X-PLAYLIST-TYPE:EVENT는 실시간 스트림에 존재하고 #EXT-X-PLAYLIST-TYPE:VOD는 VOD 스트림에 존재할 수 있지만, 현재 웹 수신기 플레이어는 #EXT-X-ENDLIST의 존재에만 의존하여 실시간 대 VOD를 판단합니다.

원활한 스트리밍

Microsoft의 공식 부드러운 스트리밍 사양

원활한 스트리밍은 DASH와 비슷하게 HTTP를 통해 적응형 스트리밍 프로토콜과 XML 사양을 제공합니다. DASH와 달리 Smooth Streaming에서는 미디어 세그먼트의 경우 MPEG-4 패키징만 권장합니다.

다음은 현재 웹 수신기 플레이어가 지원하는 스무스 스트리밍의 가장 일반적인 태그와 속성 표입니다. 많은 개념은 위의 DASH 섹션에 이미 설명되어 있습니다.

태그/속성 사용
<부드러운 스트리밍 미디어> 매니페스트의 기본 태그에 다음과 같은 속성이 포함됩니다.
  • 타임스케일: 1초를 나타내는 단위의 수(일반적으로 10,000,000 증가)
  • 길이: 콘텐츠 길이(기간) 웹 수신기 플레이어는 0.1초보다 짧은 시간을 지원하지 않습니다.
  • IsLive: 매니페스트가 라이브 미디어인지 여부
<StreamIndex> DASH의 AdaptationSet과 유사한 하나의 스트림 세트 유형은 일반적으로 '텍스트', '동영상' 또는 '오디오'입니다. URL 속성에는 일반적으로 비트 전송률 또는 시작 시간과 같은 정보를 사용하는 템플릿 프래그먼트 URL이 포함됩니다.
<품질 수준> 각 QualityLevel 태그는 비트 전송률과 FourCC 코덱을 지정합니다. FourCC 코드는 보통 ‘H264’, ‘AVC1’, ‘AACL’ 등입니다. 동영상의 경우 MaxWidth 및 MaxHeight를 통해 해상도를 지정합니다. 오디오의 경우 샘플링 레이트와 채널 수를 통해 주파수 (예: 44100)를 지정합니다.
<c> 스트림 프래그먼트 요소 다음을 포함합니다.
  • d: 프래그먼트의 지속 시간입니다.
  • t: 프래그먼트의 미디어 시간입니다.
<보호> <SmoothStreamingMedia> 태그 아래에서 사용할 시스템 DRM의 ID를 나열하는 SystemID 속성(선택사항)이 포함된 태그
<ProtectionHeader> <Protection>에는 일반적으로 Base64로 인코딩된 SystemID 및 커스텀 데이터의 속성을 포함할 수 있습니다. Widevine의 경우 키 ID, 키 길이, 알고리즘 ID(예: AESCTR), LA_URL(라이선스 획득 URL), LUI_URL(라이선스 사용자 인터페이스 URL), DS_ID(도메인 서비스 ID)가 포함됩니다.

콘텐츠 보호

보호 시스템 ID를 올바르게 인코딩하려면 다음 매핑을 사용하세요.

  • WIDEVINE: 'EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED',
  • CLEARKEY: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
  • MPEG_DASH_MP4PROTECTION: 'URN:MPEG:DASH:MP4PROTECTION:2011'

<ProtectionHeader>의 경우 다음은 Base64로 인코딩된 데이터의 예입니다. 디코딩될 때 데이터는 위의 DASH 콘텐츠 보호 지원에 설명된 것과 동일한 디코딩된 형식을 따릅니다.

<Protection>
  <ProtectionHeader SystemID="9a04f079-9840-4286-ab92-e65be0885f95">
    $BASE64ENCODED_DATA
  </ProtectionHeader>
</Protection>

다음은 콘텐츠 길이가 3,000초인 원활한 실시간 스트리밍 매니페스트의 예입니다.

<?xml version="1.0"?>
  <SmoothStreamingMedia MajorVersion="2" MinorVersion="0" Duration="3000000000"
    TimeScale="10000000" IsLive="TRUE" LookAheadFragmentCount="2" DVRWindowLength="600000000" CanSeek="TRUE" CanPause="TRUE">
    <StreamIndex Type="text" Name="textstream301_swe" Language="swe" Subtype="CAPT" Chunks="0"
      TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(textstream301_swe={start time})">
      <QualityLevel Index="0" Bitrate="20000" CodecPrivateData="" FourCC="DFXP"/>
        <c d="40000000" t="80649382288125"/>
        <c d="39980000"/>
        <c d="40020000"/>
    </StreamIndex>
    <Protection>
      <ProtectionHeader> SystemID="$BASE64ENCODEDDRMDATA$"</ProtectionHeader>
    </Protection>
    <StreamIndex Type="audio" Name="audio101_eng" Language="eng" Subtype="AACL" Chunks="0"
      TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(audio101_eng={start time})">
      <QualityLevel Index="0" Bitrate="128000" CodecPrivateData="1290" FourCC="AACL" AudioTag="255"
        Channels="2" SamplingRate="32000" BitsPerSample="16" PacketSize="4"/>
      <c d="40000000" t="80649401327500"/>
      <c d="40000000"/>
      <c d="40000000"/>
    </StreamIndex>
    <StreamIndex Type="video" Name="video" Subtype="AVC1" Chunks="0" TimeScale="10000000"
      Url="QualityLevels({bitrate})/Fragments(video={start time})">
      <QualityLevel Index="0" Bitrate="400000" CodecPrivateData="000000016742E01596540C0EFCB808140000000168CE3880"
        FourCC="AVC1" MaxWidth="384" MaxHeight="216"/>
      <QualityLevel Index="1" Bitrate="800000" CodecPrivateData="00000001674D401E965281004B6020500000000168EF3880"
        FourCC="AVC1" MaxWidth="512" MaxHeight="288"/>
      <QualityLevel Index="2" Bitrate="1600000" CodecPrivateData="00000001674D401E965281B07BCDE020500000000168EF3880"
        FourCC="AVC1" MaxWidth="854" MaxHeight="480"/>
      <QualityLevel Index="3" Bitrate="2200000" CodecPrivateData="00000001674D401F96528080093602050000000168EF3880"
        FourCC="AVC1" MaxWidth="1024" MaxHeight="576"/>
      <c d="40000000" t="80649401378125"/>
      <c d="40000000"/>
      <c d="40000000"/>
    </StreamIndex>
  </SmoothStreamingMedia>

동영상 스트림의 경우 위의 URL 템플릿은 다음과 같습니다.

QualityLevels({bitrate})/Fragments(video={start time})

따라서 처음 두 세그먼트 (색인 2 품질 수준에 있다고 가정)는 동영상 스트림 인덱스의 t="80649401378125"에서 추출한 초기 시간을 세그먼트당 4초 * 1,0000,000씩 늘리는 것입니다.

QualityLevels(2)/Fragments(video=80649401378125)
QualityLevels(2)/Fragments(video=80649441378125)
...

다음은 현재 Google에서 무시하며 제공 여부에 관계없이 스트리밍 환경에 영향을 미치지 않는 원활한 스트리밍 속성 목록입니다.

  • <SmoothStreamingMedia> 태그의 CanSeek, CanPause
  • <StreamIndex> 태그의 Chunks, QualityLevels입니다. 대신, 실제 QualityLevel 태그 및 <c> 태그와 같이 <StreamIndex> 내부에 제공된 정보를 기반으로 세그먼트 수와 품질 수준 수를 계산합니다.
  • <QualityLevel>BitsPerSample, PacketSize는 사용되지 않습니다.

디스플레이 유형 확인

canDisplayType 메서드는 전달된 미디어 매개변수를 확인하고 불리언을 반환하여 웹 수신기 기기의 동영상 및 오디오 기능을 확인하고 표시합니다. 첫 번째 매개변수를 제외한 모든 매개변수는 선택사항입니다. 더 많은 매개변수를 포함할수록 검사가 더 정확해집니다.

서명은 canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)입니다.

예:

다음과 같은 특정 코덱, 크기, 프레임 속도를 사용하여 웹 수신기 기기 및 디스플레이에서 동영상/mp4 MIME 유형을 지원하는지 확인합니다.

canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)

너비 3840, 높이 2160을 지정하여 웹 수신기 기기와 디스플레이에서 이 코덱의 4K 동영상 형식을 지원하는지 확인합니다.

canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)

이 코덱, 크기 및 프레임 속도에서 웹 수신기 기기 및 디스플레이가 HDR10을 지원하는지 확인합니다.

canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)

웹 수신기 기기 및 디스플레이가 다음 코덱, 크기, 프레임 속도를 위해 Dolby Vision (DV)을 지원하는지 확인합니다.

canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)

DRM

참고: 웹 수신기 SDK를 사용할 때의 주요 이점 중 하나는 앱에서 더 이상 MPL을 로드하고 미디어 재생을 별도로 처리할 필요가 없다는 것입니다. 이는 웹 수신기 SDK가 대신 처리하기 때문입니다.

일부 미디어 콘텐츠에는 디지털 권한 관리 (DRM)가 필요합니다. 매니페스트 (DASH 또는 HLS)에 저장된 DRM 라이선스 (및 키 URL)가 있는 미디어 콘텐츠의 경우 Cast SDK가 이 사례를 대신 처리합니다. 콘텐츠의 하위 집합에는 복호화 키를 얻는 데 필요한 licenseUrl가 필요합니다. 웹 수신기에서 PlaybackConfig를 사용하여 필요에 따라 licenseUrl를 설정할 수 있습니다.

다음 코드 스니펫은 withCredentials와 같은 라이선스 요청의 요청 정보를 설정하는 방법을 보여줍니다.

const context = cast.framework.CastReceiverContext.getInstance();
const playbackConfig = new cast.framework.PlaybackConfig();
// Customize the license url for playback
playbackConfig.licenseUrl = 'http://widevine/yourLicenseServer';
playbackConfig.protectionSystem = cast.framework.ContentProtection.WIDEVINE;
playbackConfig.licenseRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

// Update playback config licenseUrl according to provided value in load request.
context.getPlayerManager().setMediaPlaybackInfoHandler((loadRequest, playbackConfig) => {
  if (loadRequest.media.customData && loadRequest.media.customData.licenseUrl) {
    playbackConfig.licenseUrl = loadRequest.media.customData.licenseUrl;
  }
  return playbackConfig;
});

Google 어시스턴트 통합이 있으면 콘텐츠에 필요한 사용자 인증 정보와 같은 일부 DRM 정보가 OAuth/SSO와 같은 메커니즘을 통해 Google 계정에 직접 연결될 수 있습니다. 이러한 경우 미디어 콘텐츠가 음성을 통해 로드되거나 클라우드에서 오는 경우 클라우드에서 사용자 인증 정보를 제공하는 Cast 기기로 setCredentials이 호출됩니다. 그런 다음 웹 수신기 앱을 작성하는 애플리케이션은 필요에 따라 setCredentials 정보를 사용하여 DRM을 작동할 수 있습니다. 다음은 사용자 인증 정보를 사용하여 미디어를 구성하는 예입니다.

도움말: contentId, contentUrl, 항목을 사용하여 미디어 로드도 참고하세요.

오디오 채널 처리

Cast 플레이어는 미디어를 로드할 때 단일 오디오 소스 버퍼를 설정합니다. 동시에 기본 트랙의 MIME 유형에 따라 버퍼에서 사용할 적절한 코덱도 선택합니다. 새 버퍼 및 코덱이 설정됩니다.

  • 재생이 시작되면
  • 광고 시점마다
  • 메인 콘텐츠가 재개될 때마다

버퍼는 단일 코덱을 사용하고 코덱은 기본 트랙을 기반으로 선택되므로 보조 트랙이 필터링되고 들리지 않는 상황이 있습니다. 미디어 프로그램의 기본 트랙이 서라운드 사운드에 있지만 보조 오디오 트랙이 스테레오 사운드를 사용하는 경우 이러한 문제가 발생할 수 있습니다. 보조 트랙은 대체 언어로 콘텐츠를 제공하는 데 자주 사용되므로 다양한 트랙이 포함된 미디어를 제공하면 많은 시청자가 모국어로 콘텐츠를 들을 수 없게 되는 등 상당한 영향을 미칠 수 있습니다.

다음 시나리오에서는 기본 트랙과 보조 트랙에 동일한 수의 채널이 포함된 프로그래밍을 제공하는 것이 중요한 이유를 보여줍니다.

시나리오 1 - 기본 및 보조 트랙의 미디어 패리티가 부족한 미디어 스트림:

  • 영어 - AC-3 5.1 채널 (기본)
  • 스웨덴 - AAC 2채널
  • french - AAC 2채널
  • 독일 - AAC 2채널

이 시나리오에서 플레이어의 언어가 영어 이외의 언어로 설정된 경우 사용자는 두 트랙이 모두 재생 중에 필터링되기 때문에 사용자가 들을 것으로 예상되는 트랙을 듣지 못합니다. 재생할 수 있는 유일한 트랙은 기본 AC-3 5.1 채널뿐이며 언어가 영어로 설정된 경우에만 가능합니다.

시나리오 2 - 기본 및 보조 트랙의 채널 패리티가 있는 미디어 스트림:

  • 영어 - AC-3 5.1 채널 (기본)
  • 스웨덴 - AC-3 5.1 채널
  • 프랑스어 - AC-3 5.1 채널
  • 독일 - AC-3 5.1 채널

이 스트림의 트랙에는 모두 동일한 수의 채널이 있기 때문에 시청자는 선택한 언어와 관계없이 트랙을 듣게 됩니다.

Shaka 오디오 채널 처리

보조 오디오 트랙에서 패리티가 부족한 미디어가 발견될 경우 Shaka 플레이어 (DASH)는 기본적으로 선호되는 채널 수인 2로 설정됩니다.

기본 트랙이 서라운드 사운드가 아닌 경우 (예: 2채널 스테레오 트랙) Shaka 플레이어는 기본적으로 2채널로 설정되고 채널이 3개 이상인 보조 미디어 트랙을 자동으로 필터링합니다.

cast.framework.PlaybackConfigshakaConfig 속성에 preferredAudioChannelCount를 설정하여 샤카의 기본 오디오 채널 수를 구성할 수도 있습니다.

예를 들면 다음과 같습니다.

shakaConfig = { "preferredAudioChannelCount": 6 };

preferredAudioChannelCount를 6으로 설정하면 Shaka 플레이어는 서라운드 사운드 코덱 (AC-3 또는 EC-3)을 지원할 수 있는지 확인하고 원하는 수의 채널을 준수하지 않는 모든 미디어 트랙을 자동으로 필터링합니다.