بروتوكولات بث مشغّل مستقبل الويب

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

تتوافق حزمة SDK لمتلقي الويب مع ثلاثة أنواع من بروتوكولات البث اليوم:

DASH والبث المباشر عبر HTTP والبث السلس.

في هذا المستند، نعرض الدعم المتوفر لكل بروتوكول من بروتوكولات البث. لاحظ أن شرح العلامات المتوافقة لكل بروتوكول يتم اختصاره بشكل كبير مقارنة بمواصفات البروتوكول المفصلة. والهدف هو تقديم لمحة سريعة وفهم كيفية استخدام كل بروتوكول، وميزات البروتوكول المدعومة على الأجهزة التي تعمل بتكنولوجيا Google Cast لتقديم تجارب البث.

البث التكيفي الديناميكي عبر HTTP (DASH)

مواصفات DASH التفصيلية لمعيار ISO.

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 الإضافية على العلامات غير المذكورة أعلاه والتي نتيحها حاليًا:

اسم الخاصية دالة السمة
مدة العرض التقديمي للوسائط مدة محتوى الفيديو.
أدنى فترة تحديث تحدد سمة العلامة <MPD> عدد المرات التي نحتاج إليها لإعادة تحميل البيان.
كتابة سمة العلامة <MPD>، وتكون "ديناميكية" للإشارة إلى أنها بث مباشر.
معادلة الوقت في العرض التقديمي سمة للعلامة <SegmentBase>، تحدد معادلة وقت العرض التقديمي من بداية الفترة.
رقم البدء تحدد عدد شريحة الوسائط الأولى في عرض تقديمي خلال فترة معينة. وغالبًا ما تُستخدم هذه العبارة في البث المباشر.

نتيح أيضًا التعرّف على المربّع EMSG داخل أجزاء MP4 لـ DASH وتوفير EmsgEvent لمطوّري البرامج.

على الرغم من أن مشغّل مستقبل الويب الحالي يتوافق مع حالات استخدام DASH الرئيسية، إليك قائمة بالسمات الشائعة التي يتجاهلها تنفيذ DASH الحالي أو لا يستخدمها. هذا يعني أنّه لن يؤثر في تجربة تشغيل المحتوى أيًا كان البيان الذي يتضمّنه.

  • availabilityStartTime (وقت البدء)
  • محاذاة الجزء

البث المباشر وفق بروتوكول HTTP ‏(HLS)

يمكن الاطّلاع على نظرة عامة ومواصفات كاملة للبث المباشر عبر بروتوكول HTTP هنا.

إن إحدى نقاط القوة الرئيسية لمشغّل مستقبل الويب هي قدرته على دعم تشغيل HLS في MSE. وبخلاف قناة DASH، حيث يأتي البيان في ملف واحد، ترسل قناة HLS قائمة التشغيل الرئيسية التي تحتوي على قائمة بكلّ خيارات البثّ مع عنوان URL الخاص بها. قائمة تشغيل الصيغ هي قائمة تشغيل الوسائط. إنّ علامتي HLS الرئيسيتين اللتين يتيحهما مشغّل مستقبل الويب حاليًا في قائمة التشغيل الرئيسية هما:

اسم العلامة الوظائف
#EXT-X-STREAM-INF تحدّد هذه السمة معدّل نقل البيانات/الصيغة. السمة BANDWIDTH مطلوبة لاختيار بث معدل البت القابل للتعديل. يوصى بشدة باستخدام السمة CODECS لإعداد MSE، مثل "avc1.42c01e,mp4a.40.2". وإذا لم يتم تحديد قيمة هذه القيمة، يتم ضبط الحالة التلقائية على فيديو H264 يتضمن الملف الشخصي الرئيسي 3.0 ومحتوى "mp4a.40.2" تم ترميزه صوتيًا.
#EXT-X-MEDIA لتحديد قائمة تشغيل وسائط إضافية (في السمة URI) تمثل المحتوى. وهي عادة مجموعات بث صوتية بديلة بتنسيق آخر (صوت محيطي 5.1) أو بلغة أخرى. يُسمح باستخدام سمة TYPE التي تحتوي على VIDEO أو AUDIO أو SUBTITLES أو CLOSED-CAPTIONS. يشير ضبط السمة DEFAULT على YES إلى اختيار هذا البث التلقائي بشكل تلقائي.

في ما يلي قائمة بعلامات HLS التي يدعمها مشغل استقبال الويب حاليًا في قائمة تشغيل الوسائط:

اسم العلامة الوظائف
#EXTINF معلومات البث، تكون عادةً متبوعةً بمدة الشريحة بالثواني، وفي السطر التالي عنوان url للجزء.
#EXT-X-TARGETDURATION مدة كل شريحة بالثواني. يحدد هذا أيضًا عدد مرات تنزيل/تحديث بيان قائمة التشغيل للبث المباشر. لا يدعم مشغّل الويب المدّة التي تقل عن 0.1 ثانية.
#EXT-X-MEDIA-SEQUENCE رقم التسلسل (غالبًا في البث المباشر) الذي تمثله الشريحة الأولى في قائمة التشغيل هذه.
#EXT-X-KEY معلومات مفتاح DRM. تخبرنا السمة METHOD النظام الأساسي الذي يجب استخدامه. نتيح الآن استخدام AES-128 وSAMPLE-AES.
#EXT-X-BYTERANGE نطاق البايت المراد جلبه لعنوان URL للشريحة.
#EXT-X-DISCONTINUITY لتحديد عدم التطابق بين الشرائح المتتالية. وغالبًا ما تتم مشاهدتها باستخدام ميزة إدراج الإعلانات من جهة الخادم حيث تظهر شريحة الإعلان في منتصف ساحة المشاركات الرئيسية.
#EXT-X-PROGRAM-DATE-TIME الوقت المطلق للعينة الأولى من الشريحة التالية، على سبيل المثال "2016-09-21T23:23:52.066Z".
#EXT-X-ENDLIST تحديد ما إذا كان هذا الفيديو عبارة عن فيديو مسجَّل أو بث مباشر

بالنسبة إلى البث المباشر، نستخدم #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 شرائح.

دعم تنسيق الشرائح

تتيح حزمة تطوير البرامج (SDK) لتطبيق CAF تشغيل المحتوى الذي يتم إرساله بتنسيقات متعددة كما هو موضّح في HlsSegmentFormat للصوت والفيديو وHlsVideoSegmentFormat للفيديو. ويشمل ذلك التوافق مع الصوت المجمّع مثل تشغيل AAC وAC3، سواء كان المحتوى مشفّرًا أو غير مشفّر. يجب تحديد هذه المعلومات في MediaInformation من LoadRequestData لوصف المحتوى التابع لك للمشغل بشكل صحيح. وإذا لم يتم تحديد قيمة هذا الحقل، سيحاول ضبط المشغّل التلقائي تشغيل المحتوى باعتباره محتوى مجمّعًا من مجموعة بث. يمكن إعداد هذه الخاصية من أيٍ من المُرسِلين في بيانات طلب التحميل (Android وiOS والويب) أو ضمن المُستلِم من خلال أدوات اعتراض الرسائل.

يمكنك الاطّلاع على نموذج مقتطف الرمز أدناه أو دليل تحميل الوسائط باستخدام Content ID و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 أعلاه، تتوافق حزمة تطوير البرامج (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) هو معرّف المستخدم الفريد Udevine من 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. إذا كنت تستخدم نظامًا هرميًا للمفاتيح، فسيكون هذا هو المفتاح "الجذر".

مثال على قائمة تشغيل وفق بروتوكول HTTP (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-X-I-FRAME-STREAM-INF في قائمة التشغيل الرئيسية.
  • تم تجاهل #EXT-X-DISCONTINUITY-SEQUENCE
  • يمكن عرض #EXT-X-PLAYLIST-TYPE:EVENT في البث المباشر و #EXT-X-PLAYLIST-TYPE:VOD يمكن مشاركته في البث المباشر، ولكن في الوقت الحالي لا يعتمد مشغّل مستقبِل الويب إلا على وجود #EXT-X-ENDLIST لتحديد البث المباشر مقابل الفيديو المسجّل.

بث سلس

مواصفات البث السلس الرسمية من Microsoft.

يوفر البث السلس مواصفات البث المباشر ومواصفات XML عبر HTTP (مثل DASH). بخلاف DASH، يوصي البث السلس بحزمة MPEG-4 فقط لأجزاء الوسائط.

في ما يلي جدول يضم العلامات والسمات الأكثر شيوعًا في البث السلس التي يدعمها مشغل استقبال الويب اليوم. تم شرح العديد من المفاهيم من قبل في قسم DASH أعلاه.

العلامة/السمة الاستخدام
SmoothStreamingMedia> تحتوي العلامة الرئيسية للبيان على سمات:
  • مقياس زمني: عدد الوحدات التي تمثل ثانية واحدة، وعادة ما تكون زيادة 10,000,000.
  • المدة: طول المحتوى في نطاق زمني محدد. لا يتيح مشغّل الويب إمكانية العمل لفترات أقصر من 0.1 ثانية.
  • IsLive: تحديد ما إذا كان البيان عبارة عن وسائط مباشرة.
<StreamIndex> مجموعة بث واحدة مماثلة لـ DASH’s AdaptationSet. وعادةً ما يكون النوع "text" أو "video" أو "audio". تتضمن سمة عنوان Url عادةً عنوان URL لقالب نموذجي يستخدم معلومات مثل معدل البت أو وقت البدء.
<qualityLevel> وتحدد كل علامة من علامات LevelLevel معدّل نقل البيانات وبرنامج ترميز FourCC. وغالبًا ما تكون شفرة CCCC هي "H264" و"AVC1" و"AACL" وما إلى ذلك. أمّا بالنسبة إلى الفيديو، فتحدد درجة الدقة درجة الدقة من خلال MaxWidth وMaxHeight. بالنسبة إلى الصوت، تحدد فترة التكرار (مثل 44100) من خلال SamplingRate وعدد القنوات.
<c> عنصر تجزئة للبث. يحتوي على:
  • d: مدة الكسر.
  • t: وقت الوسائط للكسر.
<الحماية> علامة ذات سمة SystemID اختيارية تسرد رقم تعريف النظام DRM المراد استخدامه ضمن علامة <SmoothStreamingMedia>.
<ProtectionHeader> ضمن <Protection>، يمكن أن تتضمن سمة من سمات معرّف النظام والبيانات المخصّصة، وتكون عادةً بتشفير 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" ضمن "مؤشر بث الفيديو" والزيادة في الوقت بمقدار 4 ثوانٍ * 10000000 لكل شريحة:

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

في ما يلي قائمة بسمات "البث السلس" التي نتجاهلها حاليًا ولا تؤثّر في تجارب البث بصرف النظر عن توفيرها:

  • CanSeek، CanPause في العلامة <SmoothStreamingMedia>.
  • Sunks و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>)

أمثلة:

للتحقق مما إذا كان جهاز استقبال الويب والعرض متوافقان مع نوع الفيديو/mp4 مع برنامج الترميز والأبعاد ومعدل عرض الإطارات المحدد هذا:

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

للتحقق مما إذا كان جهاز استقبال الويب والعرض يدعم تنسيق الفيديو 4K لبرنامج الترميز هذا عن طريق تحديد العرض 3840 والارتفاع 2160:

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)

إدارة الحقوق الرقمية

ملاحظة: إنّ إحدى الفوائد الرئيسية لاستخدام حزمة تطوير البرامج (SDK) الخاصة باستلام الويب هي أن تطبيقك لم يعد بحاجة إلى تحميل MPL والتعامل مع تشغيل الوسائط بشكل منفصل، لأن حزمة Web SDK SDK تعالج هذا الأمر نيابةً عنك.

يتطلب بعض محتوى الوسائط إدارة الحقوق الرقمية (DRM). بالنسبة إلى محتوى الوسائط الذي يحمل ترخيص DRM (وعنوان URL للمفتاح) المخزّن في ملف البيان (DASH أو HLS)، تتعامل حزمة SDK Cast مع هذه الحالة بالنيابة عنك. تتطلّب مجموعة فرعية من هذا المحتوى 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) مثل بيانات الاعتماد اللازمة للمحتوى مباشرةً بحسابك على Google من خلال آليات مثل OAuth/الدخول الموحّد (SSO). وفي هذه الحالات، إذا تم تحميل محتوى الوسائط باستخدام الصوت أو إذا كان مصدره السحابة الإلكترونية، يتم استدعاء setCredentials من السحابة الإلكترونية إلى جهاز البث الذي يوفّر بيانات الاعتماد. ويمكن للتطبيقات التي تكتب تطبيق مستقبل الويب استخدام معلومات setCredentials لتشغيل إدارة الحقوق الرقمية حسب الضرورة. في ما يلي مثال على استخدام بيانات الاعتماد لإنشاء الوسائط.

ملاحظة: راجع أيضًا تحميل الوسائط باستخدام Content ID وcontentUrl والكيان.

معالجة القناة الصوتية

عندما يحمّل مشغّل Cast الوسائط، فإنه يعمل على إعداد ذاكرة تخزين مؤقت لمصدر صوت واحد. وفي الوقت نفسه، يحدد أيضًا برنامج ترميز مناسبًا ليتم استخدامه بواسطة المخزن المؤقت، استنادًا إلى نوع MIME للمسار الأساسي. تم إعداد برنامج تخزين مؤقت وبرنامج ترميز جديدين:

  • عندما يبدأ التشغيل،
  • في كل فاصل إعلاني،
  • في كل مرة يتم فيها استئناف المحتوى الرئيسي.

وبما أن المخزن المؤقت يستخدم برنامج ترميز واحدًا، ولأن برنامج الترميز يتم اختياره بناءً على المسار الرئيسي، هناك حالات يمكن فيها تصفية المسارات الثانوية وعدم سماعها. ويمكن أن يحدث ذلك عندما يكون المقطع الصوتي الأساسي لبرنامج الوسائط في الصوت المحيطي، ولكن تستخدم المقاطع الصوتية الثانوية صوت استيريو. بما أنّ المقاطع الصوتية الثانوية تُستخدم بشكل متكرّر لتقديم محتوى بلغات بديلة، قد يؤثر توفير وسائط تحتوي على عدد مختلف من المقاطع الصوتية تأثيرًا كبيرًا، مثل عدم تمكن عدد كبير من المشاهدين من سماع المحتوى بلغتهم الأصلية.

توضّح السيناريوهات التالية سبب أهمية توفير البرمجة حيث تتضمن المقاطع الصوتية الأساسية والثانوية نفس عدد القنوات:

السيناريو 1 - تفتقد مجموعة بث الوسائط إلى تكافؤ القناة عبر المقاطع الصوتية الأساسية والثانوية:

  • الإنجليزية - قناة AC-3 5.1 (أساسية)
  • السويدية - قناتان (AAC)
  • الفرنسية - AAC - قناتان
  • القناة الألمانية - قناة AAC 2

في هذا السيناريو، إذا لم يتم ضبط لغة المشغّل على أي لغة غير الإنجليزية، لن يسمع المستخدم المقطع الصوتي الذي يتوقّع سماعه لأنّه تتم فلترة كل المقاطع الصوتية ذات القناتين أثناء التشغيل. والمقطع الوحيد الذي يمكن تشغيله هو قناة AC-3 5.1 الأساسية، وبعد ذلك يتم تعيين اللغة إلى الإنجليزية فقط.

السيناريو 2 - بث على وسائل الإعلام مع تكافؤ القناة عبر المقاطع الصوتية الأساسية والثانوية:

  • الإنجليزية - قناة AC-3 5.1 (أساسية)
  • السويدية - قناة AC-3 5.1
  • الفرنسية - AC-3 5.1 channel
  • القناة الألمانية - قناة AC-3 5.1

بما أنّ جميع المقاطع الصوتية لهذا البث تتضمّن العدد نفسه من القنوات، سيسمع الجمهور صوتًا بغض النظر عن اللغة المختارة.

معالجة قناة Shaka الصوتية

يتم تعيين مشغل شاكا (DASH) افتراضيًا على عدد قنوات مفضل يبلغ اثنين، كإجراء التخفيف عند مواجهة وسائط تفتقر إلى التكافؤ عبر المقاطع الصوتية الثانوية.

إذا لم يكن المقطع الصوتي الأساسي عبارة عن صوت مجسم (مثل مسار ستيريو ثنائي القنوات)، فسيتحول مشغل Shaka افتراضيًا إلى قناتين، وسيعمل تلقائيًا على تصفية أي مقاطع صوتية ثانوية للوسائط التي تحتوي على أكثر من قناتين.

يمكن أيضًا ضبط عدد القنوات الصوتية المفضّلة لدى "شاكا" من خلال ضبط preferredAudioChannelCount في السمة shakaConfig على cast.framework.التشغيلConfig.

مثلاً:

shakaConfig = { "preferredAudioChannelCount": 6 };

عند ضبط preferredAudioChannelCount على 6، يتحقّق Shaka Player من إمكانية استخدام برامج ترميز الصوت المحيطي (AC-3 أو EC-3) ويستبعد تلقائيًا أي ملفات وسائط لا تتوافق مع العدد المفضّل للقنوات.