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

웹 수신기 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 유형은 'video/mp4', 'audio/mp4' 및 'text/vtt'입니다. 선택사항인 <ContentComponent contentType="$TYPE$"><AdaptationSet> 아래에 포함할 수 있습니다.

<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>

사용되는 표현과 관계없이 스트림이 보호되는 경우 <ContentProtection> 섹션이 <AdaptationSet> 아래에 표시될 수 있습니다. 여기서 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> 태그의 속성으로, 매니페스트를 새로고침해야 하는 빈도를 지정합니다.
유형 <MPD> 태그의 속성으로, 실시간 스트림임을 나타내는 '동적'입니다.
presentationTimeOffset <SegmentBase> 태그의 속성으로, 기간의 시작 부분을 기준으로 프레젠테이션 시간 오프셋을 지정합니다.
startNumber 기간 내 프레젠테이션의 첫 번째 미디어 세그먼트 수를 지정합니다. 라이브 스트림에서 자주 사용됩니다.

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

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

  • availabilityStartTime
  • segmentAlignment

HTTP 실시간 스트리밍(HLS)

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

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

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

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

태그 이름 기능
#EXTINF 스트림 정보. 일반적으로 세그먼트 길이(초)가 이어지고 다음 줄에는 세그먼트의 URL이 나옵니다.
#EXT-X-TARGETDURATION 각 세그먼트의 길이(초)입니다. 이는 실시간 스트림의 재생목록 매니페스트를 다운로드/새로고침하는 빈도도 결정합니다. 웹 수신기 플레이어는 0.1초 미만의 기간을 지원하지 않습니다.
#EXT-X-MEDIA-SEQUENCE 이 재생목록의 첫 번째 세그먼트가 나타내는 시퀀스 번호 (실시간 스트림의 경우 많음)입니다.
#EXT-X-KEY DRM 키 정보 METHOD 속성은 사용할 키 시스템을 알려줍니다. 현재 AES-128SAMPLE-AES가 지원됩니다.
#EXT-X-BYTERANGE 세그먼트 URL에 대해 가져올 바이트 범위입니다.
#EXT-X-DISCONTINUITY 연속된 세그먼트 간의 불연속성을 지정합니다. 광고 세그먼트가 메인 스트림의 중간에 표시되는 서버 측 광고 삽입과 함께 표시되는 경우가 많습니다.
#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 사양에 따라 일치를 위해 파일 이름 비교를 사용하지 않습니다.

Google의 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는 SAMPLE-AES 또는 SAMPLE-AES-CTR를 지원합니다. 여기서 초기화 벡터의 키 URI를 지정할 수 있습니다.

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

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

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

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

속성 설명
KEYFORMATVERSIONS "1" 이 제안서는 키 형식 버전 1을 정의합니다.
KEYFORMAT "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" UUID는 DASH IF IOP의 Widevine UUID입니다. 정확히 동일한 문자열이 Widevine 암호화 스트림이 포함된 MPD에 사용됩니다.
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

다음은 현재 Google에서 사용하거나 지원하지 않는 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 스트림에 있을 수 있지만 현재 Google의 웹 수신기 플레이어는 #EXT-X-ENDLIST의 존재만 사용하여 실시간과 VOD를 판단합니다.

원활한 스트리밍

Microsoft의 공식 스무스 스트리밍 사양

스무스 스트리밍은 HTTP를 통해 적응형 스트리밍 프로토콜과 XML 사양을 제공합니다 (DASH와 유사). DASH와 달리 Smooth Streaming은 미디어 세그먼트에 MPEG-4 패키징만 사용하는 것을 권장합니다.

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

태그/속성 사용
<SmoothStreamingMedia> 매니페스트의 기본 태그로, 다음 속성을 포함합니다.
  • TimeScale: 1초를 나타내는 단위 수로, 일반적으로 10,000,000 단위로 증가합니다.
  • 길이: 시간 척도로 표시되는 콘텐츠의 길이입니다. 웹 수신기 플레이어는 0.1초 미만의 기간을 지원하지 않습니다.
  • IsLive: 매니페스트가 라이브 미디어인지 여부입니다.
<StreamIndex> DASH의 AdaptationSet과 유사한 스트림 세트입니다. 유형은 일반적으로 '텍스트', '동영상' 또는 '오디오'입니다. URL 속성에는 일반적으로 비트 전송률 또는 시작 시간과 같은 정보를 사용하는 템플릿 프래그먼트 URL이 포함됩니다.
<QualityLevel> 각 QualityLevel 태그는 비트 전송률과 FourCC 코덱을 지정합니다. FourCC 코드는 주로 ‘H264’, ‘AVC1’, ‘AACL’ 등입니다. 동영상의 경우 MaxWidth 및 MaxHeight를 통해 해상도를 지정합니다. 오디오의 경우 SamplingRate와 채널 수를 통해 주파수 (예: 44100)를 지정합니다.
<c> 스트림 프래그먼트 요소 포함 항목:
  • d: 프래그먼트의 기간.
  • t: 프래그먼트의 미디어 시간입니다.
<보호> <SmoothStreamingMedia> 태그 아래 사용할 시스템 DRM의 ID를 나열하는 선택적 SystemID 속성이 포함된 태그입니다.
<ProtectionHeader> <Protection> 아래에 SystemID의 속성과 맞춤 데이터(일반적으로 Base64로 인코딩됨)가 포함될 수 있습니다. 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 품질 수준에 있다고 가정)는 동영상 StreamIndex 아래의 t="80649401378125"에서 추출한 초기 시간과 세그먼트당 시간의 증분이 4초 * 10000000인 다음과 같습니다.

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

다음은 제공 여부와 관계없이 현재 무시되고 스트리밍 환경에 영향을 미치지 않는 스무스 스트리밍 속성 목록입니다.

  • <SmoothStreamingMedia> 태그의 CanSeek, CanPause
  • <StreamIndex> 태그의 덩어리, 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

일부 미디어 콘텐츠에는 디지털 권한 관리 (DRM)가 필요합니다. DRM 라이선스 (및 키 URL)가 매니페스트 (DASH 또는 HLS)에 저장된 미디어 콘텐츠의 경우 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 계정에 직접 연결될 수 있습니다. 이러한 경우 미디어 콘텐츠가 음성을 통해 로드되거나 클라우드에서 제공되면 setCredentials가 클라우드에서 Cast 기기로 호출되어 사용자 인증 정보를 제공합니다. 그러면 웹 수신기 앱을 작성하는 애플리케이션에서 setCredentials 정보를 사용하여 필요에 따라 DRM을 작동할 수 있습니다. 다음은 사용자 인증 정보를 사용하여 미디어를 구성하는 예입니다.

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

오디오 채널 처리

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

  • 재생할 때
  • 광고 시점을 정해야 하며
  • 재개할 때마다 재생되어야 합니다.

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

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

시나리오 1 - 기본 및 보조 트랙에서 채널 패리티가 없는 미디어 스트림:

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

이 시나리오에서 플레이어의 언어가 영어 이외의 언어로 설정되어 있으면 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를 설정하여 Shaka의 기본 오디오 채널 수를 구성할 수도 있습니다.

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

shakaConfig = { "preferredAudioChannelCount": 6 };

preferredAudioChannelCount를 6으로 설정하면 Shaka Player가 서라운드 사운드 코덱 (AC-3 또는 EC-3)을 지원할 수 있는지 확인하고 기본 채널 수에 부합하지 않는 미디어 트랙을 자동으로 필터링합니다.