أداة التلاعب ببيانات أحداث البث المباشر

توفّر واجهة برمجة تطبيقات Pod Presentation API إمكانية الوصول إلى شرائح الإعلانات المشفرة والمحدّدة، معدّة بطريقة يمكن تجميعها مباشرةً في قائمة تشغيل لتشغيل البث المباشر وفق بروتوكول HTTP (HLS) أو قائمة تشغيل وسائط MPEG-DASH. بالنسبة إلى MPEG-DASH، توفر واجهة برمجة تطبيقات عرض Pod أيضًا نموذج بيان لتوفير معلومات وسياق إضافيتين لهذه الشرائح الإعلانية.

يركّز هذا الدليل على تنفيذ خادم أساسي لمعالجة بيانات مجموعات الإعلانات في أحداث البث المباشر.

شرط أساسي: ضبط أحداث البث المباشر في "مدير إعلانات Google"

قبل تقديم أي طلبات من واجهة برمجة تطبيقات عرض الإعلانات المتسلسلة، عليك إنشاء حدث بث مباشر في "مدير الإعلانات" لكل بث تتم معالجته. يمكنك إنشاء حدث مباشر باستخدام LiveStreamEventService API أو واجهة الويب في "مدير إعلانات Google".

لكي يتم استخدام حدث بث مباشر مع واجهة برمجة تطبيقات عرض الإعلانات المتسلسلة، عليك تعبئة عدة سمات للحدث الخاص بك:

  • customAssetKey: معرّف مخصّص يتم استخدامه لهذا الحدث يجب أن يكون فريدًا عبر جميع الأحداث في الشبكة.
  • adTags - عنوان URL لعلامة الإعلان الأساسية الذي يتم إنشاؤه من خلال سير عمل عدد الزيارات في "مدير الإعلانات".
  • dynamicAdInsertionType - يجب ضبطها على POD_SERVING_REDIRECT.
  • streamingFormat - اضبط السمة على HLS أو DASH وفقًا لذلك.
  • segmentUrlAuthenticationKeyIds: مفتاح HMAC واحد على الأقل مستخدَم لتوقيع طلبات الشرائح الإعلانية.
  • daiEncodingProfileIds - قائمة بأرقام تعريف DAIEncodingProfile التي تم تفعيلها لهذا الحدث
  • startDateTime - تاريخ بدء الحدث ووقته
  • endDateTime - تاريخ الانتهاء ووقته المحددَين لهذا الحدث هذه السمة مطلوبة إذا كانت unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime` - منطقية. راجِع أعلاه.

تلقّي طلبات بيان البث

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

تحتاج أيضًا إلى جمع بعض المعلومات الأخرى لتحديد مصدر المحتوى المناسب، مثل Content ID.

مثال على نقطة نهاية محتملة لطلب بيان

GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
معلمات المسار
asset_key رقم تعريف افتراضي يقابل البث المباشر المطلوب في نظامك
format مَعلمة افتراضية تتوافق مع تنسيق ساحة المشاركات. أحد الخيارات التالية:
mpd لبث MPEG-DASH
m3u8 بالنسبة إلى أحداث البث المباشر وفق بروتوكول HTTP (HLS)
معلمات طلب البحث
stream_id رقم تعريف مصدر بيانات "مدير الإعلانات" من تطبيق مشغّل فيديو العميل

استرداد مجموعة بث المحتوى

استخدِم Content ID الذي تم جمعه من طلب البيان لاختيار بث المحتوى لربطه بالإعلانات.

دمج شرائح الإعلانات في مصدر بيانات المحتوى

ستختلف تركيبات عناوين URL لشرائح الإعلان بناءً على تنسيق البث.

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

يتم عادةً عرض مجموعات بث HLS كبيان متعدد المتغيرات يحتوي على مجموعة من الروابط المؤدية إلى بيانات الصيغ، والتي تتوافق مع كل ملف من الملفات الشخصية للترميز.

ملاحظة: للتيسير، يفترض هذا الدليل أنّ وسائط HLS مرمّزة بتنسيق يدمج الصوت والفيديو في ملف المقطع نفسه.

قوائم تشغيل الوكيل المتعدد المتغيرات

ستحتاج إلى استبدال كل عنوان URL لقائمة تشغيل في قائمة التشغيل الأصلية المتعددة الصِيَغ بطلب نقطة نهاية آخر إلى المعالج لمعالجة بيان الصيغة المحدّدة للّاعب.

ستفترض الخطوات المتبقية لدمج HLS أنه تتم معالجة بيان صيغة واحد.

مثال على نقطة نهاية طلب متغيّر محتمَل
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
معلمات المسار
asset_key رقم تعريف افتراضي يقابل البث المباشر المطلوب في نظامك
variant تمثّل هذه السمة مَعلمة افتراضية تحتوي على معرّف لخيار المنتج المحدّد الذي تتم معالجته.
معلمات طلب البحث
stream_id رقم تعريف مصدر بيانات "مدير الإعلانات" من تطبيق مشغّل الفيديو الخاص بالعميل يُستخدَم هنا لتحديد جلسة مستخدم من خلال أداة معالجة البيان.
مثال على بيان متعدد المتغيرات لم تتم معالجته
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/360p.m3u8
مثال على بيان نُسخ مختلفة من الصِيَغ
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/1080p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/720p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/360p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS

تحديد شرائح الفواصل الإعلانية وإدراج الفواصل الإعلانية

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

قد يتم تمييز الفواصل الإعلانية من أقسام المحتوى بطرق مختلفة وذلك اعتمادًا على برنامج الترميز الذي تستخدمه. إحدى الطرق الشائعة لتحديد الفواصل الإعلانية هي وضع تمهيد للشرائح الإعلانية بعلامة #EXT-X-CUE-OUT ومتابعتها باستخدام علامة #EXT-X-CUE-IN.

لفصل الفواصل الإعلانية التي تستضيفها Google عن أقسام المحتوى، يجب إدراج علامات #EXT-X-DISCONTINUITY في بداية ونهاية كل فاصل إعلاني. إذا لم تظهر علامات عدم الاستمرار هذه في البيان النهائي، سيتعذّر تشغيل المحتوى.

معرّفات الموارد المنتظمة (URI) لشرائح الإعلان المدرجة غير مشفّرة. إذا كان المحتوى مشفّرًا، عليك أيضًا إزالة التشفير من خلال تحديد #EXT-X-KEY:METHOD=NONE قبل الشريحة الإعلانية الأولى من كل فاصل إعلاني، ثم إضافتها مرة أخرى بعد الفاصل الإعلاني.

نموذج البيان (الأصلي)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-CUE-OUT:15.000
#EXTINF:5.005,
contentorigin.com/3.ts
#EXTINF:5.005,
contentorigin.com/4.ts
#EXTINF:5.005,
contentorigin.com/5.ts
#EXTINF:5.000,d
contentorigin.com/6.ts
#EXT-X-CUE-IN
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
تم إدراج بيان يشتمل على انقطاعات في الخدمة.
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXTINF:5.005,
#EXT-X-DISCONTINUITY
{... New segments will go here ...}
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4

معالجة شرائح مجموعة الإعلانات المتسلسلة

عليك تتبُّع بعض القيم الإضافية لكل شريحة ضمن مجموعة إعلانات متسلسلة:

  • segment_number: تقسيم الفهرس ضمن مجموعة الإعلانات المتسلسلة، وتبدأ بصفر. أو "init" لشريحة تهيئة mp4.
  • segment_duration: مدة المقطع الحالي بالمللي ثانية يجب أن تكون هذه القيمة هي نفسها لجميع المقاطع باستثناء القيمة الأخيرة في المجموعة.
  • segment_offset: تم حساب إزاحة المقطع عن طريق إضافة مدة الشريحة السابقة إلى إزاحة المقطع بالمللي ثانية
  • last: قيمة منطقية تحدّد الشريحة الأخيرة في مجموعة إعلانات متسلسلة. يكون الإعداد التلقائي على false.

إنشاء عناوين URL لشرائح الإعلان

استبدِل كل مقطع داخل الفاصل الإعلاني بعنوان URL بالتنسيق التالي:

/linear/pods/v1/seg/network/{network_code}/custom_asset/{custom_asset_key}/pod/{pod_id}/profile/{profile_name}/{segment_number}.(ts|mp4|vtt|aac|ac3|eac3)
معلمات المسار
network_code رمز شبكة "مدير الإعلانات 360" لهذه الشبكة
custom_asset_key مفتاح مادة عرض البث المباشر المخصّص المحدّد في واجهة برمجة التطبيقات LiveStreamEventService API أو في صفحة البث المباشر في واجهة الويب "مدير إعلانات Google 360".
pod_id معرّف الفاصل الإعلاني يجب أن تكون القيمة عددًا صحيحًا يبدأ عند 1 ويزداد بمقدار واحد لكل فاصل إعلاني.

يجب أن تكون هذه القيمة متطابقة على مستوى جميع المستخدمين الذين يشاهدون الفاصل الإعلاني نفسه في الحدث الحالي.

profile_name معرّف الملف الشخصي المطلوب
segment_number فهرس هذا القسم ضمن مجموعة الإعلانات المتسلسلة الحالية، والذي يبدأ من الصفر.
عند استخدام حاوية MP4، يمكن طلب شريحة الإعداد من خلال ضبطsegment_number على "init".
معلمات طلب البحث
stream_id مطلوبة يتم عرض معلمة stream_id للمستخدم من طلب إنشاء ساحة المشاركات.
sd مطلوبة segment_duration
so اختياري segment_offset

إذا لم يتم توفير السمة so، يُفترض أنّ جميع الشرائح السابقة لها المدة نفسها، ويتم احتساب معادلة المقطع من segment_number وsd.

pd مطلوب، باستثناء الأحداث التي تم فيها تفعيل فواصل إعلانية غير مجدولة مدة الفاصل الإعلاني (بالمللي ثانية) ويُشار إليها أيضًا باسم ad_pod_duration.
auth-token مطلوبة وهو رمز مميَّز لـ HMAC موقَّع ومُرمّز باستخدام عنوان URL لمجموعة الإعلانات المتسلسلة هذه.
last اختياري قيمة منطقية تشير إلى الشريحة الأخيرة في الفاصل الإعلاني يكون الإعداد التلقائي بالقيمة "خطأ".

يجب ترميز قيم مَعلمات طلب البحث بشكل صحيح لتكون آمنة من عناوين URL. يُعدّ هذا الإجراء مهمًّا بشكل خاص للحقل auth-token لأنّه قد يتضمّن أحرف / و+ و=.

نموذج البيان (بعد استبدال الشريحة)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:3.000,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2&last=true
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4

تهانينا أنت تعرض الآن بثًا مباشرًا باستخدام شرائح الإعلانات المتوفّرة من خلال واجهة برمجة تطبيقات DAI Pod VIEW API.

مجموعات بث DASH

يتم توفير ساحات مشاركات DASH كملف MPD يحتوي على جميع ترميزات البث في ملف واحد، حيث يتم تمثيل المحتوى كسلسلة من النقاط.

نموذج فترة الطلب

اطلب نموذج مدة من "مدير إعلانات Google". سيصبح هذا النموذج فترة الفاصل الإعلاني بعد تعبئة وحدات الماكرو التي يحتوي عليها.

يجب طلب هذا النموذج مرة واحدة فقط في كل جلسة بث، وتخزينه مؤقتًا لإعادة استخدامه مع كل فاصل إعلاني.

نقطة نهاية طلب نموذج الفترة
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
معلمات المسار
network_code رمز شبكة "مدير الإعلانات 360" للناشر.
custom_asset مفتاح مادة العرض المخصّص لحدث البث المباشر في "مدير إعلانات Google".
معلمات طلب البحث
stream_id رقم تعريف مصدر بيانات "مدير الإعلانات" من مشغّل فيديو العميل.
استجابة JSON
dash_period_template سلسلة XML لنموذج الفترة.
segment_duration_ms مدة كل شريحة وسائط إعلانية في نموذج فترة الشرطة بالمللي ثانية.
مثال على طلب (cURL)
curl https://dai.google.com/linear/pods/v1/dash/network/21775744923/custom_asset/tears_of_steel/pods.json?stream-id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS
مثال على إجابة
{"dash_period_template":"<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$> <BaseURL>https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/</BaseURL>
 <SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id={a-stream-id}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">
  <SegmentTimeline>
    <S t="0" d="5" r="$$number-of-repeated-segments$$"/>
  </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
    <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
  </AdaptationSet>
  <AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>

    <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
  </AdaptationSet>
</Period>",
"segment_duration_ms":5000}

تعبئة نموذج الفترة

يحتوي نموذج الفترة على عدة وحدات ماكرو يجب استبدالها لكل فاصل إعلاني. يجب استبدال جميع وحدات الماكرو. ويجب استبدال وحدات الماكرو غير المستخدمة بسلسلة فارغة ("").

وحدة الماكرو الوصف مثال
$$pod-id$$ ويمثّل فهرس مجموعة الإعلانات المتسلسلة هذه الفترة. يجب أن تتطابق هذه القيمة مع مجموعة الإعلانات المتسلسلة نفسها في جميع جلسات المشاهدين. 1
$$period-start$$ يشير ذلك المصطلح إلى الوقت الذي تبدأ فيه الفترة بتنسيق MD الحالي. سمة اختيارية يجب استبدالها بـ start="###"، حيث يشير ### إلى وقت العرض التقديمي الذي يبدأ فيه الفاصل الإعلاني. وإذا لم يتم توفير وقت بدء الفترة، يجب استبدال هذا الماكرو بسلسلة فارغة. start="PT2H33M30S"
$$period-duration$$ تمثّل هذه السمة مدة الفترة الإعلانية بالكامل. سمة اختيارية يجب استبدالها بـ duration="###"، حيث يكون ### هو مدة مدة الإعلان بالتنسيق العادي DASH. وإذا لم يتم توفير مدة الفترة، يجب استبدال هذا الماكرو بسلسلة فارغة. duration="PT15S"
$$pod-duration$$ المدة المتوقَّعة للإعلانات التي يتم اتخاذ قرار بشأنها في مجموعة الإعلانات المتسلسلة هذه بالمللي ثانية. 15000
$$number-of-repeated-segments$$ يتم احتساب هذه القيمة من خلال قسمة مدة فترة الإعلان (بالمللي ثانية) على قيمةsegment_duration_ms، وتقريبها إلى أقرب عدد صحيح. 3
$$cust_params$$ يمكن استبدال وحدة الماكرو هذه بمعلمات الاستهداف المخصّصة الفريدة للفاصل الإعلاني الحالي، في حال توفرها. ويجب تنسيق القيمة كما هو موضّح في مقالة مركز المساعدة هذه في "مدير الإعلانات". وفي حال عدم الحاجة إلى مَعلمات مخصّصة، يجب استبدال وحدة الماكرو هذه بسلسلة فارغة. &cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
$$scte35$$ يجب استبدال وحدة الماكرو هذه بقيمة scte35 فريدة لهذا الفاصل الإعلاني، في حال توفُّرها. إذا لم تكن هناك حاجة إلى معلومات scte35، يجب استبدال وحدة الماكرو هذه بسلسلة فارغة. /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ رمز HMAC مميز موقَّع ومُرمّز باستخدام عنوان URL هذا الرمز المميّز مطلوب. custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
نموذج الفترة الأولية يحتوي على وحدات ماكرو
<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$>
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/
  </BaseURL>
  <SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">  
    <SegmentTimeline>
      <S t="0" d="5" r="$$number-of-repeated-segments$$"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
    <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
  </AdaptationSet>
  <AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>
    <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
  </AdaptationSet>
</Period>
فترة الإعلان التي تمت تعبئتها
<Period id="pod-0" start="PT5H50M12S">
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
  </BaseURL>
  <SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=">
    <SegmentTimeline>
      <S d="5" r="1"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
      <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    </Representation>
  </AdaptationSet>
  <AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
      <Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
      <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    </Representation>
  </AdaptationSet>
</Period>

إدراج الفترة التي تمت تعبئتها في بيان DASH

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

مثال على بيان المحتوى الأولي
<?xml version="1.0"?>
  <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
    <BaseURL>
      http://example.com/tears_of_steel/
    </BaseURL>
    <Period start="PT0S">
      <AdaptationSet bitstreamSwitching="true">

        <Representation id="0" codecs="avc1" mimeType="video/mp4" width="1920" height="1080" startWithSAP="1" bandwidth="500000">
          <SegmentBase>
            <Initialization sourceURL="segments/1080/1.m4s" range="0-862"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segments/1080p/2.m4s" mediaRange="863-7113"/>
            <SegmentURL media="segments/1080p/3.m4s" mediaRange="7114-14104"/>
            <SegmentURL media="segments/1080p/4.m4s" mediaRange="14105-17990"/>
            ...
          </SegmentList>
        </Representation>

        <Representation id="1" codecs="avc1" mimeType="video/mp4" width="1280" height="720" startWithSAP="1" bandwidth="250000">
          <SegmentBase>
            <Initialization sourceURL="segments/720p/1.m4s" range="0-864"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segments/720p/2.m4s" mediaRange="865-11523"/>
            <SegmentURL media="segments/720p/3.m4s" mediaRange="11524-25621"/>
            <SegmentURL media="segments/720p/4.m4s" mediaRange="25622-33693"/>
            ...
          </SegmentList>
        </Representation>

        <Representation id="1" codecs="avc1" mimeType="video/mp4" width="640" height="480" startWithSAP="1" bandwidth="100000">
          <SegmentBase>
            <Initialization sourceURL="segment/480p/1.m4s" range="0-865"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segment/480p/2.m4s" mediaRange="866-26970"/>
            <SegmentURL media="segment/480p/3.m4s" mediaRange="26971-72543"/>
            <SegmentURL media="segment/480p/4.m4s" mediaRange="72544-95972"/>
            ...
          </SegmentList>
        </Representation>
        ...
      </AdaptationSet>
    </Period end>
  </MPD>
مثال على بيان تم دمجه
<?xml version="1.0"?>
  <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
    <BaseURL>
      http://example.com/tears_of_steel/
    </BaseURL>
    
    <Period id="pod-0" start="PT5H50M12S">
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
  </BaseURL>
  <SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=$$scte35$$">
    <SegmentTimeline>
      <S d="5" r="1"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
      <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    </Representation>
  </AdaptationSet>
  <AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
      <Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
      <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    </Representation>
  </AdaptationSet>
</Period>
    
</MPD>

تهانينا أنت تعرض الآن بثًا مباشرًا بتنسيق DASH باستخدام شرائح إعلانية توفّرها واجهة برمجة التطبيقات DAI Pod Present API.

مراجع إضافية