تتوافق حزمة تطوير برامج استقبال الويب حاليًا مع ثلاثة أنواع من بروتوكولات البث:
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
لضبط المخزن المؤقت لمصدر الخطأ التربيعي المتوسط ومعلومات 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
نظام إدارة الحقوق الرقمية بشكل فريد.
يمكن تضمين معرّف مفتاح اختياري للتشفير المشترك.
<!-- 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 | لتحديد رقم الجزء الأول من الوسائط في عرض تقديمي ضمن نقطة. غالبًا ما يتم استخدام هذه الطريقة في البث المباشر. |
ونتيح أيضًا إمكانية التعرّف على مربّع EMSG داخل أجزاء MP4 لبروتوكول DASH
ونوفّر علامة
EmsgEvent
للمطوّرين.
على الرغم من أنّ مشغِّل استقبال الويب الحالي يتوافق مع حالات استخدام DASH الرئيسية، نعرض في ما يلي قائمة بالسمات الشائعة التي يتجاهلها تنفيذنا الحالي لتقنية DASH أو لا يستخدمها. وهذا يعني أنّه بغض النظر عمّا إذا كان البيان يتضمّن هذه العلامات أم لا، لن يكون لها أيّ تأثير في تجربة تشغيل المحتوى.
- availabilityStartTime
- segmentAlignment
البث المباشر وفق بروتوكول HTTP (HLS)
يمكن الحصول على النظرة العامة والمواصفات الكاملة للبث المباشر عبر HTTP هنا.
تتمثل إحدى نقاط القوة الرئيسية في "مشغِّل استقبال الويب" في قدرته على إتاحة تشغيل HLS في الخطأ المعتدل على الويب. على عكس DASH، حيث يأتي البيان في ملف واحد، يرسل HLS قائمة التشغيل الرئيسية التي تحتوي على قائمة بكل مجموعات البث المختلفة مع عنوان URL الخاص بها. قائمة تشغيل الوسائط هي قائمة تشغيل الوسائط. علامتا HLS الرئيسيتان اللتان يتيحهما "مشغّل استقبال الويب" حاليًا في قائمة التشغيل الرئيسية هما:
اسم العلامة | الوظائف |
---|---|
#EXT-X-STREAM-INF | لتحديد معدل نقل بيانات/بث متنوّع. يجب إدخال السمة BANDWIDTH التي تتيح اختيار بث معدل نقل البيانات التكيُّفي. وننصح بشدة باستخدام السمة CODECS لضبط الخطأ التربيعي المتوسط، مثل "avc1.42c01e,mp4a.40.2" . في حال عدم تحديد أي خيار، سيتم ضبط الحالة التلقائية
على محتوى فيديو H264 الرئيسي ومشفّر الصوت "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 | معلومات مفتاح إدارة الحقوق الرقمية تخبرنا السمة 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.
إتاحة تنسيق الشرائح
تتيح حزمة CAF SDK تشغيل المحتوى المُرسل بتنسيقات متعددة كما هو مُشار إليه في HlsSegmentFormat
للصوت وHlsVideoSegmentFormat
للفيديو. ويشمل ذلك إمكانية تشغيل
ملفات الصوت المضغوطة،
مثل التشغيل عبر الترميز المتقدّم للصوت وAC3، سواء المشفَّر أو غير المشفّر. ويجب تحديد هذه المعلومات في MediaInformation
الخاصة بالسمة LoadRequestData
لوصف المحتوى الخاص بك بشكل صحيح للمشغّل. في حال عدم تحديد أي خيار، ستحاول إعدادات المشغّل التلقائية تشغيل المحتوى على أنّه محتوى حزمة Transport Stream. يمكن ضبط هذا الموقع من أيٍ من المُرسِلين في
بيانات طلب التحميل (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
أعلاه، تتيح حزمة تطوير البرامج (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
الذي نوفّره حاليًا هو Wazeفين، ويتضمّن معرّف الموارد المنتظم (URI)
معلومات DRM XXXXXXX
المشفرة بترميز BASE64 والتي تحتوي عند فك ترميزها على معرّف المفتاح:
{
"content_id": "MTQ1NjkzNzM1NDgxNA==",
"key_ids": [
"xxxxxxxxxxxxxxxx"
]
}
يحدد الإصدار 1 السمات التالية:
السمة | مثال | الوصف |
---|---|---|
KEYFORMATVERSIONS |
"1" |
يحدد هذا الاقتراح الإصدار 1 من تنسيق المفتاح |
KEYFORMAT |
"urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" |
المعرّف الفريد العالمي (UUID) هو معرّف المستخدم الفريد (UUID) على Waze من DASH IF IOP. يتم استخدام السلسلة نفسها في MPD مع مجموعات البث المشفّرة في Waze. |
URI |
"data:text/plain;base64, <base64 encoded PSSH box>" |
معرّف الموارد المنتظم (URI) لمصدر البيانات الذي يحتوي على نوع البيانات ومربّع PSSH |
METHOD |
SAMPLE-AES-CTR |
يشير إلى شفرة التشفير المستخدمة عند تشفير المحتوى. تُشير أداة نموذج التشفير المتقدّم (AES) إلى أنّ المحتوى مشفَّر باستخدام "سي سي إف". تشير عيّنة أو AES من نسبة النقر إلى الظهور إلى أنّ المحتوى مشفَّر باستخدام أحد مخططات حماية AES-CTR، وهو "cenc". |
السمات التي تم تعيينها إلى DASH MPD:
السمة | الوصف |
---|---|
KEYFORMAT |
سمة schemeIdUri لعنصر ContentProtection |
URI |
محتوى عنصر cenc:pssh. |
KEYID |
تشفِّر سلسلة سداسية عشرية مكونة من 16 بايت معرّف المفتاح الذي له الدور نفسه مثل default_kid في MPEG DASH. إذا كنت تستخدم مخطط مفاتيح هرميًا، فسيكون هذا هو مفتاح "الجذر". |
مثال على قائمة تشغيل HLS مع إشارة الإصدار 2:
#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
لتحديد الفيديوهات المباشرة مقابل الفيديوهات عند الطلب.
البث السلس
مواصفات Smooth Streaming الرسمية من Microsoft.
يوفر البث السلس بروتوكول البث التكيُّفي ومواصفات XML عبر HTTP (على غرار DASH). بخلاف تقنية DASH، يوصي البث السلس باستخدام حزمة MPEG-4 فقط لقطاعات الوسائط.
في ما يلي جدول يضمّ العلامات والسمات الأكثر شيوعًا في البث السلس التي يتيحها "مشغّل استقبال الويب" حاليًا. تم شرح العديد من المفاهيم بالفعل في قسم DASH أعلاه.
العلامة/السمة | الاستخدام |
---|---|
<SmoothStreamingMedia> | تحتوي العلامة الرئيسية للبيان على سمات:
|
<StreamIndex> | مجموعة واحدة من مجموعات البث، على غرار مجموعة AdaptationSet في DASH. يكون النوع عادةً "نص" أو "فيديو" أو "صوت". تتضمن سمة عنوان URL عادةً عنوان URL مجزأًا نموذجيًا باستخدام معلومات مثل معدل نقل البيانات أو وقت البدء. |
<QualityLevel> | تحدد كل علامة QualityLevel معدل نقل البيانات الخاص بها وبرنامج ترميز فورCC. وغالبًا ما يكون رمز فورCC هو "H264" و"AVC1" و"AACL" وما إلى ذلك. وبالنسبة إلى الفيديو، تحدد دقته من خلال Max width وMaxHeight. بالنسبة للصوت، يحدد النطاق تردده (مثل 44100) عبر معدل أخذ العينات وعدد القنوات. |
<c> | عنصر جزء من مجموعة البث. يحتوي على:
|
<الحماية> | تشير هذه العلامة إلى السمة الاختيارية SystemID التي تسرد رقم تعريف إدارة الحقوق الرقمية (DRM) للنظام لاستخدامها ضمن علامة <SmoothStreamingMedia>. |
<ProtectionHeader> | في قسم <Protection>، يمكن أن يتضمّن سمة SystemID والبيانات المخصّصة، عادةً ما تكون بترميز Base64. بالنسبة إلى ويندفين، سيحتوي على معرّف المفتاح وطوله ومعرّف الخوارزمية، مثل 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>
في ما يلي مثال على بيان البث المباشر السلس الذي تبلغ مدته 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 ثوانٍ * 10000000 لكل مقطع:
QualityLevels(2)/Fragments(video=80649401378125) QualityLevels(2)/Fragments(video=80649441378125) ...
في ما يلي قائمة بسمات البث السلس التي نتجاهلها حاليًا وليس لها أي تأثير في تجارب البث بغض النظر عما إذا تم توفيرها أم لا:
- CanSeek، CanPause في علامة
<SmoothStreamingMedia>
. - Chunks و QualityLevels في علامة
<StreamIndex>
. بدلاً من ذلك، نحسب عدد المقاطع وعدد مستويات الجودة استنادًا إلى المعلومات المقدمة في<StreamIndex>
مثل علامةQualityLevel
الفعلية وعلامات<c>
. - BitsPerSample، لا يتم استخدام BitsPerSample في
<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)
إدارة الحقوق الرقمية
يتطلّب استخدام بعض محتوى الوسائط إدارة الحقوق الرقمية (DRM). بالنسبة إلى محتوى الوسائط
الذي يتضمّن ترخيص إدارة الحقوق الرقمية (وعنوان URL الرئيسي) مخزَّنًا في ملف البيان (DASH أو HLS)،
تعالج حزمة تطوير البرامج (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"، قد يتم ربط بعض معلومات إدارة الحقوق الرقمية، مثل بيانات الاعتماد اللازمة للمحتوى، مباشرةً بحسابك على Google من خلال آليات مثل OAuth/الدخول المُوحَّد (SSO). وفي تلك الحالات، إذا تم تحميل محتوى الوسائط من خلال الصوت أو كان مصدره السحابة الإلكترونية، يتم استدعاء setCredentials
من السحابة الإلكترونية إلى جهاز البث لتقديم بيانات الاعتماد هذه. ويمكن للتطبيقات التي تنشئ "تطبيق استقبال الويب" بعد ذلك استخدام
معلومات setCredentials
لتشغيل إدارة الحقوق الرقمية حسب الضرورة. فيما يلي مثال على استخدام
بيانات الاعتماد لإنشاء الوسائط.
ملاحظة: يمكنك أيضًا الاطّلاع على تحميل الوسائط باستخدام contentId وcontentUrl والكيان.
التعامل مع القنوات الصوتية
عندما يُحمِّل مشغّل البث الوسائط، يعمل على إعداد مخزن مؤقت لمصدر صوت واحد. وفي الوقت ذاته، يحدد برنامج الترميز المناسب ليستخدمه المخزن المؤقت، بناءً على نوع MIME للمسار الأساسي. تم إعداد برنامج مخزن مؤقت وبرنامج ترميز جديد:
- عند بدء التشغيل،
- في كل فاصل إعلاني
- في كل مرة يستأنف فيها المحتوى الرئيسي.
ونظرًا لأن المخزن المؤقت يستخدم برنامج ترميز واحدًا، ونظرًا لاختيار برنامج الترميز بناءً على المسار الأساسي، قد تتم فلترة المسارات الثانوية فيه ولا يتم سماعها. ويمكن أن يحدث ذلك عندما يكون المقطع الصوتي الأساسي لبرنامج وسائط في الصوت المحيطي، بينما تستخدم المقاطع الصوتية الثانوية صوت استيريو. بما أنّ المقاطع الصوتية الثانوية تستخدم بشكل متكرر لتقديم محتوى بلغات بديلة، قد يكون لتوفير وسائط تحتوي على أعداد مختلفة من المقاطع الصوتية تأثير كبير، مثل عدم قدرة عدد كبير من المشاهدين على سماع المحتوى بلغتهم الأم.
توضح السيناريوهات التالية سبب أهمية توفير البرمجة حيث تحتوي المسارات الأساسية والثانوية على نفس العدد من القنوات:
السيناريو 1: بث الوسائط يفتقر إلى التكافؤ في القنوات في المقاطع الأساسية والثانوية:
- الإنجليزية - قناة AC-3 5.1 (أساسية)
- السويدية - قناة AAC 2
- الفرنسية - AAC بقناتان
- الألمانية - AAC 2-channel
في هذا السيناريو، إذا كانت لغة المشغّل مضبوطة على أي لغة أخرى غير الإنجليزية، فلن يسمع المستخدم المقطع الصوتي الذي يتوقع سماعه، وذلك بسبب استبعاد جميع المقاطع الصوتية ذات القناتَين أثناء التشغيل. والمقطع الصوتي الوحيد الذي يمكن تشغيله هو قناة AC-3 5.1 الأساسية، ولا يمكن تشغيله إلا عند ضبط اللغة على الإنجليزية.
السيناريو 2: بث وسائط الإعلام بتعادل بين القنوات في المقاطع الأساسية والثانوية:
- الإنجليزية - قناة AC-3 5.1 (أساسية)
- السويدية - AC-3 5.1 channel
- فرنسا - قناة AC-3 5.1
- الألمانية - قناة AC-3 5.1
بما أنّ جميع المقاطع الصوتية في هذا البث لها عدد القنوات نفسه، سيستمع الجمهور إلى المقطع الصوتي بغض النظر عن اللغة التي اختارها.
التعامل مع قناة Shaka الصوتية
ويتم ضبط عدد القنوات المفضل في مشغّل Shaka (DASH) على اثنتين، كإجراء للتخفيف من حدته عند عرض وسائط تفتقر إلى التكافؤ على مستوى المقاطع الصوتية الثانوية.
إذا لم يكن المقطع الصوتي الأساسي في المقطع الصوتي المحيطي (على سبيل المثال، مقطع صوتي استيريو ثنائي القناة)، فسيتم ضبط مشغّل Shaka تلقائيًا على قناتَين، وسيُفلتر تلقائيًا أي مقاطع صوتية للوسائط ثانوية تحتوي على أكثر من قناتَين.
يمكن أيضًا ضبط العدد المفضّل من قنوات "شاكا" الصوتية من خلال ضبط
preferredAudioChannelCount
في السمة shakaConfig
على
cast.framework.PlaybackConfig.
مثال:
shakaConfig = { "preferredAudioChannelCount": 6 };
عند ضبط preferredAudioChannelCount
على 6، يتحقّق Shaka Player من توافقه مع برامج ترميز الصوت المحيطي (AC-3
أو EC-3
)، ويفلتر تلقائيًا أي مقاطع صوتية للوسائط لا تتوافق مع عدد القنوات المفضّل.