پروتکل های پخش گیرنده وب

Web Receiver SDK امروزه از سه نوع پروتکل جریان پشتیبانی می کند:

DASH , HTTP Live Streaming و Smooth Streaming .

در این سند ما پشتیبانی خود را برای هر یک از پروتکل‌های جریان فهرست می‌کنیم. توجه داشته باشید که توضیح تگ های پشتیبانی شده برای هر پروتکل در مقایسه با مشخصات پروتکل دقیق کاملاً مختصر است. هدف ارائه یک نگاه اجمالی و درک سریع از نحوه استفاده از هر پروتکل، و اینکه کدام ویژگی‌های پروتکل در دستگاه‌های دارای قابلیت Cast برای ارائه تجربیات پخش خود پشتیبانی می‌شوند، است.

پخش جریانی تطبیقی ​​پویا از طریق HTTP (DASH)

مشخصات دقیق ISO از DASH .

DASH یک پروتکل پخش با نرخ بیت تطبیقی ​​است که پخش ویدئو با کیفیت بالا را از طریق سرورهای HTTP(S) امکان پذیر می کند. یک مانیفست که در XML تشکیل شده است، حاوی بیشتر اطلاعات فراداده برای نحوه مقداردهی اولیه و دانلود محتوای ویدیویی است. مفاهیم کلیدی که پخش کننده گیرنده وب پشتیبانی می کند عبارتند از <Period> ، <AdaptationSet> ، <Representation> ، <SegmentTemplate> ، <SegmentList> ، <BaseUrl> و <ContentProtection> .

مانیفست DASH با یک تگ ریشه <MPD> شروع می شود و در داخل شامل یک یا چند تگ <Period> است که نشان دهنده یک محتوای جریانی است. برچسب‌های <Period> امکان سفارش قطعات مختلف محتوای جریانی را فراهم می‌کنند و اغلب برای جدا کردن محتوای اصلی و تبلیغات یا چندین محتوای ویدیویی متوالی استفاده می‌شوند.

یک <AdaptationSet> در <MPD> مجموعه ای از نمایش برای یک نوع جریان رسانه است، در بیشتر موارد ویدئو، صدا، یا شرح. رایج‌ترین نوع mime تایپ‌هایی که پشتیبانی می‌شوند عبارتند از "video/mp4"، "audio/mp4" و "text/vtt". یک <ContentComponent contentType="$TYPE$"> اختیاری را می توان در <AdaptationSet> گنجاند.

در داخل هر <AdaptationSet> باید فهرستی از تگ های <Representation> وجود داشته باشد و پخش کننده گیرنده وب از اطلاعات codecs برای مقداردهی اولیه بافر منبع MSE و اطلاعات bandwidth استفاده می کند تا به طور خودکار نمایش/ نرخ بیت مناسب را برای پخش انتخاب کند.

برای هر <Representation> ، بخش‌های رسانه با استفاده از <BaseURL> برای نمایش تک بخش، <SegmentList> برای لیست بخش‌ها (شبیه به HLS) یا <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 (واحد برای نمایش یک ثانیه) اغلب به عنوان بخشی از ویژگی های <SegmentTemplate> گنجانده می شود تا بتوانیم زمان بخش را بر اساس این واحد محاسبه کنیم. در مثال زیر، تگ <S> نشان‌دهنده یک تگ بخش است، ویژگی d مشخص می‌کند که بخش چقدر طول دارد و ویژگی r مشخص می‌کند که چند بخش از همان مدت تکرار می‌شود تا بتوان $Time$ برای دانلود رسانه به درستی محاسبه کرد. بخش همانطور که در ویژگی media مشخص شده است.

<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 محدوده فراداده اولیه را مشخص می کند و 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 مورد استفاده را شناسایی می‌کند. شناسه کلید اختیاری را می توان برای رمزگذاری رایج گنجاند.

<!-- 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 اضافی در برچسب‌هایی که در بالا ذکر نشده‌اند و در حال حاضر پشتیبانی می‌کنیم، آمده است:

نام صفت تابع صفت
مدت زمان ارائه رسانه محتوای ویدیو چقدر طولانی است.
minimalUpdatePeriod ویژگی تگ <MPD> . مشخص می کند که چند بار باید مانیفست را دوباره بارگیری کنیم.
نوع ویژگی تگ <MPD> . "دینامیک" برای نشان دادن اینکه این یک جریان زنده است.
ارائه زمان آفست ویژگی تگ <SegmentBase> ; زمان ارائه را از ابتدای دوره مشخص می کند.
شماره شروع تعداد اولین بخش رسانه ای در ارائه در یک دوره را مشخص می کند. این اغلب در پخش زنده استفاده می شود.

ما همچنین از تشخیص جعبه EMSG در قطعات MP4 برای DASH پشتیبانی می کنیم و EmsgEvent برای توسعه دهندگان ارائه می دهیم.

در حالی که پخش کننده گیرنده وب فعلی ما از موارد استفاده اصلی DASH پشتیبانی می کند، در اینجا لیستی از ویژگی های رایج وجود دارد که اجرای فعلی DASH ما نادیده گرفته شده یا از آنها استفاده نمی کند. این بدان معناست که صرف نظر از اینکه مانیفست حاوی آنها است یا خیر، آنها هیچ تاثیری بر تجربه بازپخش محتوا ندارند.

  • در دسترس بودنStartTime
  • هم ترازی قطعه

HTTP Live Streaming (HLS)

نمای کلی و مشخصات کامل پخش زنده HTTP را می توانید از اینجا دریافت کنید.

یکی از نقاط قوت کلیدی Web Receiver Player توانایی آن در پشتیبانی از پخش HLS در MSE است. متفاوت از DASH، جایی که یک مانیفست در یک فایل قرار می‌گیرد، HLS فهرست پخش اصلی حاوی فهرستی از همه جریان‌های متغیر را با URL مربوطه ارسال می‌کند. لیست پخش نوع، لیست پخش رسانه است. دو تگ اصلی HLS که Web Receiver Player در حال حاضر در لیست پخش اصلی پشتیبانی می کند عبارتند از:

نام را تگ کنید کارکرد
#EXT-X-STREAM-INF یک جریان بیت نرخ/نوع را مشخص می کند. ویژگی BANDWIDTH مورد نیاز است که از انتخاب جریان بیت تطبیقی ​​پشتیبانی می کند. ویژگی CODECS به شدت برای مقداردهی اولیه MSE توصیه می شود، مانند "avc1.42c01e,mp4a.40.2" . اگر مشخص نشده باشد، حالت پیش‌فرض روی ویدیوی 3.0 نمایه اصلی H264 و محتوای رمزگذاری‌شده صوتی "mp4a.40.2" تنظیم می‌شود.
#EXT-X-MEDIA فهرست پخش رسانه اضافی (در ویژگی URI ) را که محتوا را نشان می دهد، مشخص می کند. اینها معمولاً جریان های صوتی جایگزین در قالب های دیگر (صدای فراگیر 5.1) یا زبان هستند. یک ویژگی TYPE که شامل VIDEO ، AUDIO ، SUBTITLES یا CLOSED-CAPTIONS است مجاز است. تنظیم ویژگی DEFAULT بر روی YES نشان دهنده انتخاب این جریان جایگزین به طور پیش فرض است.

در اینجا لیستی از برچسب های HLS است که پخش کننده گیرنده وب در حال حاضر در لیست پخش رسانه پشتیبانی می کند:

نام را تگ کنید کارکرد
#EXTINF جریان اطلاعات، معمولاً به دنبال آن مدت بخش بر حسب ثانیه، و در خط بعدی نشانی اینترنتی بخش.
#EXT-X-TARGETDURATION هر بخش چند ثانیه است. این همچنین تعیین می‌کند که ما هر چند وقت یک‌بار مانیفست لیست پخش را برای پخش جریانی زنده بارگیری/بازسازی کنیم. پخش کننده گیرنده وب مدت زمان کمتر از 0.1 ثانیه را پشتیبانی نمی کند.
#EXT-X-MEDIA-SEQUENCE شماره دنباله ای (اغلب برای پخش زنده) که اولین بخش در این لیست پخش نشان می دهد.
#EXT-X-KEY اطلاعات کلید DRM ویژگی METHOD به ما می گوید که از چه سیستم کلیدی استفاده کنیم. امروز ما از AES-128 و SAMPLE-AES پشتیبانی می کنیم.
#EXT-X-BYTERANGE محدوده بایت برای واکشی برای نشانی وب بخش.
#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، ما از مقایسه نام فایل برای تطبیق استفاده نمی کنیم.

اجرای HLS ما از انتخاب یک جریان صوتی جایگزین، مانند صدای فراگیر 5.1، به عنوان پخش اصلی صدا پشتیبانی می کند. این را می توان با داشتن یک تگ #EXT-X-MEDIA با کدک های جایگزین و همچنین ارائه فرمت بخش در پیکربندی استریم انجام داد.

پخش کننده گیرنده وب انتظار رفتار خاصی را در هر مشخصات دارد. به عنوان مثال، پس از یک تگ #EXT-INF ، ما انتظار یک URI را داریم. اگر یک URI نباشد، برای مثال یک #EXT-X-DISCOUNTINUITY باعث می‌شود تجزیه برای لیست پخش ناموفق باشد.

هر #EXT-X-TARGETDURATION ثانیه، لیست پخش/مانیفست را مجدداً بارگیری می‌کنیم تا لیست‌های بخش جدید دریافت کنیم و نمایش داخلی جدید همه بخش‌ها را به قسمت جدید به‌روزرسانی می‌کنیم. هر زمان که جستجو درخواست شود، ما فقط در محدوده قابل جستجو جستجو می کنیم. برای زنده، ما فقط از ابتدای جدیدترین لیست تا سه مدت زمان هدف از پایان اجازه جستجو را می دهیم. بنابراین، برای مثال، اگر یک لیست 10 بخش دارید، و در بخش 6 هستید، فقط می توانید تا 7 را جستجو کنید، اما نه 8.

پشتیبانی از فرمت بخش

CAF SDK از پخش محتوای ارائه شده در فرمت های متعدد همانطور که در HlsSegmentFormat برای صدا و HlsVideoSegmentFormat برای ویدیو اشاره شده است، پشتیبانی می کند. این شامل پشتیبانی از صدای بسته بندی شده مانند پخش AAC و AC3، چه رمزگذاری شده و چه غیر رمزگذاری شده است. لازم است این اطلاعات را در MediaInformation LoadRequestData مشخص کنید تا محتوای شما به درستی برای پخش کننده توصیف شود. اگر مشخص نشده باشد، پیکربندی پخش‌کننده پیش‌فرض سعی می‌کند محتوا را به‌عنوان محتوای بسته‌بندی شده «جریان انتقال» پخش کند. این ویژگی را می توان از هر یک از فرستنده ها در داده های درخواست بارگذاری ( اندروید ، 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"

KEYFORMAT که اکنون پشتیبانی می کنیم Widevine است و URI حاوی اطلاعات DRM کد شده BASE64 XXXXXXX است که هنگام رمزگشایی حاوی شناسه کلید است:

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

نسخه 1 ویژگی های زیر را تعریف می کند:

صفت مثال توضیحات
KEYFORMATVERSIONS "1" این پیشنهاد فرمت کلیدی نسخه 1 را تعریف می کند
KEYFORMAT "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" UUID UUID Widevine از DASH IF IOP است. همان رشته دقیق در MPD با جریان های رمزگذاری شده Widevine استفاده می شود.
URI "data:text/plain;base64, <base64 encoded PSSH box>" URI جریان حاوی نوع داده و کادر PSSH.
METHOD SAMPLE-AES-CTR رمز رمزگذاری مورد استفاده در هنگام رمزگذاری محتوا را نشان می دهد. SAMPLE-AES سیگنال می دهد که محتوا با استفاده از "cbcs" رمزگذاری شده است. SAMPLE-AES-CTR سیگنال می دهد که محتوا با استفاده از یکی از طرح های حفاظتی AES-CTR، یعنی "cenc" رمزگذاری شده است.

ویژگی های ترسیم شده به DASH MPD:

صفت توضیحات
KEYFORMAT ویژگی schemeIdUri عنصر ContentProtection.
URI محتوای عنصر cenc:pssh.
KEYID رشته هگزادسیمال 16 بایتی کد کننده شناسه کلید که نقشی مشابه default_kid در MPEG DASH دارد. اگر از یک طرح کلید سلسله مراتبی استفاده کنید، این کلید "ریشه" خواهد بود.

مثال لیست پخش HLS با سیگنالینگ V2:

#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 است که ما در حال حاضر از آنها استفاده نمی کنیم یا پشتیبانی نمی کنیم. بودن یا نبودن آنها بر رفتار جریان تاثیری ندارد.

  • RESOLUTION= ویژگی در #EXT-X-STREAM-INF نادیده گرفته شده است.
  • ویژگی AUTOSELECT= در #EXT-X-MEDIA استفاده نمی شود. در عوض ما به DEFAULT= تکیه می کنیم
  • #EXT-XI-FRAME-STREAM-INF در فهرست پخش اصلی نادیده گرفته می شود.
  • #EXT-X-DISCONTINUITY-SEQUENCE نادیده گرفته می شود
  • #EXT-X-PLAYLIST-TYPE:EVENT می تواند در یک جریان زنده و #EXT-X-PLAYLIST-TYPE:VOD می تواند در یک جریان VOD وجود داشته باشد، اما در حال حاضر پخش کننده گیرنده وب ما فقط به وجود #EXT-X-ENDLIST متکی است. #EXT-X-ENDLIST برای تعیین زنده در مقابل VOD.

جریان روان

مشخصات رسمی Smooth Streaming مایکروسافت.

پخش روان پروتکل جریان تطبیقی ​​و مشخصات XML را از طریق HTTP (مشابه DASH) فراهم می کند. متفاوت از DASH، Smooth Streaming فقط بسته بندی MPEG-4 را برای بخش های رسانه توصیه می کند.

در اینجا جدولی از متداول‌ترین برچسب‌ها و ویژگی‌ها در Smooth Streaming است که پخش کننده گیرنده وب امروزه از آن پشتیبانی می‌کند. بسیاری از مفاهیم قبلاً در بخش DASH در بالا توضیح داده شده است.

برچسب/ویژگی استفاده
<SmoothStreamingMedia> تگ اصلی برای مانیفست، حاوی ویژگی های زیر است:
  • مقیاس زمانی: تعداد واحدهایی که یک ثانیه را نشان می دهند، معمولاً 10،000،000 افزایش می یابد.
  • مدت زمان: طول محتوا در مقیاس زمانی. پخش کننده گیرنده وب مدت زمان کمتر از 0.1 ثانیه را پشتیبانی نمی کند.
  • IsLive: آیا مانیفست یک رسانه زنده است.
<StreamIndex> یک مجموعه جریان، شبیه به AdaptationSet DASH. نوع آن معمولاً «متن»، «ویدئو» یا «صوتی» است. مشخصه Url معمولاً حاوی یک URL قطعه الگو با استفاده از اطلاعاتی مانند نرخ بیت یا زمان شروع است.
<سطح کیفیت> هر تگ QualityLevel میزان بیت و یک کدک FourCC را مشخص می کند. کد FourCC اغلب 'H264'، 'AVC1'، 'AACL' و غیره است. برای ویدیو، وضوح خود را از طریق MaxWidth و MaxHeight مشخص می کند. برای صدا، فرکانس آن (مانند 44100) را از طریق SamplingRate و تعداد کانال ها مشخص می کند.
<c> جریان قطعه قطعه. حاوی:
  • د: مدت یک قطعه.
  • t: زمان رسانه قطعه.
<حفاظت> برچسبی با ویژگی SystemID اختیاری که شناسه سیستم DRM را برای استفاده در تگ <SmoothStreamingMedia> فهرست می کند.
<ProtectionHeader> در زیر <Protection>، می‌تواند حاوی ویژگی SystemID و داده‌های سفارشی باشد که معمولاً Base64 کدگذاری می‌شود. برای Widevine، شامل شناسه کلید، طول کلید، شناسه الگوریتم، مانند AESCTR، LA_URL (url کسب مجوز)، LUI_URL (url رابط کاربری مجوز)، و DS_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>

در زیر نمونه‌ای از مانیفست پخش مستقیم روان با مدت زمان محتوا 3000 ثانیه است:

<?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" در زیر ویدیوی StreamIndex و افزایش زمان 4 ثانیه * 10000000 در هر بخش:

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

در اینجا فهرستی از ویژگی‌های Smooth Streaming است که ما در حال حاضر آنها را نادیده می‌گیریم و بدون در نظر گرفتن اینکه ارائه شده باشند، تأثیری بر تجربیات پخش ندارند:

  • CanSeek ، CanPause در برچسب <SmoothStreamingMedia> .
  • تکه ها ، QualityLevels در تگ <StreamIndex> . در عوض، تعداد بخش‌ها و تعداد سطوح کیفیت را بر اساس اطلاعات ارائه‌شده در <StreamIndex> مانند تگ‌های QualityLevel واقعی و تگ‌های <c> محاسبه می‌کنیم.
  • BitsPerSample ، PacketSize در <QualityLevel> استفاده نمی شود.

نوع نمایشگر را بررسی کنید

روش canDisplayType قابلیت‌های ویدیویی و صوتی دستگاه گیرنده وب و نمایش آن را با اعتبارسنجی پارامترهای رسانه ارسال شده و بازگرداندن یک بولی بررسی می‌کند. همه پارامترها به جز اولی اختیاری هستند - هر چه پارامترهای بیشتری را وارد کنید، بررسی دقیق‌تر خواهد بود.

امضای آن canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)

مثال ها:

بررسی می‌کند که آیا دستگاه گیرنده وب و نمایشگر از نوع mime video/mp4 با این کدک، ابعاد و نرخ فریم خاص پشتیبانی می‌کنند یا خیر:

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 کانال

در این سناریو، اگر زبان پخش کننده روی چیزی غیر از انگلیسی تنظیم شده باشد، کاربر آهنگی را که انتظار شنیدن آن را دارد نمی شنود، زیرا تمام آهنگ های دو کاناله در حین پخش فیلتر می شوند. تنها آهنگی که می‌توان پخش کرد کانال اصلی AC-3 5.1 خواهد بود و تنها زمانی که زبان روی انگلیسی تنظیم شده باشد.

سناریوی 2 - جریان رسانه با برابری کانال در تراک های اولیه و ثانویه:

  • انگلیسی - AC-3 5.1 کانال (اصلی)
  • سوئدی - AC-3 5.1 کانال
  • فرانسوی - AC-3 5.1 کانال
  • آلمانی - AC-3 5.1 کانال

از آنجایی که آهنگ‌های این جریان همگی تعداد کانال‌های یکسانی دارند، مخاطب بدون توجه به زبان انتخابی، آهنگی را می‌شنود.

مدیریت کانال صوتی شاکا

پخش‌کننده Shaka (DASH) به‌عنوان یک معیار کاهش در هنگام مواجهه با رسانه‌ای که برابری در تراک‌های صوتی ثانویه ندارد، به‌طور پیش‌فرض تعداد کانال‌های ترجیحی را دو می‌کند.

اگر آهنگ اصلی صدای فراگیر نباشد (مثلاً یک آهنگ استریو دو کاناله)، پخش کننده Shaka به طور پیش فرض روی دو کانال قرار می گیرد و به طور خودکار هر آهنگ رسانه ثانویه ای را که بیش از دو کانال دارد فیلتر می کند.

تعداد کانال های صوتی ترجیحی Shaka را نیز می توان با تنظیم preferredAudioChannelCount در ویژگی shakaConfig در cast.framework.PlaybackConfig پیکربندی کرد.

به عنوان مثال:

shakaConfig = { "preferredAudioChannelCount": 6 };

با تنظیم preferredAudioChannelCount روی 6، Shaka Player بررسی می‌کند که آیا می‌تواند از کدک‌های صدای فراگیر ( AC-3 یا EC-3 ) پشتیبانی کند یا خیر، و به‌طور خودکار هر آهنگ رسانه‌ای را که با تعداد کانال‌های ترجیحی مطابقت ندارد، فیلتر می‌کند.