دستکاری کننده مانیفست برای پخش جریانی زنده

Pod Serving API دسترسی به بخش‌های تبلیغاتی رمزگذاری‌شده و شرطی‌شده را فراهم می‌کند، به گونه‌ای که می‌توان آن‌ها را مستقیماً در فهرست پخش رسانه‌ای HLS یا MPEG-DASH قرار داد. برای MPEG-DASH، Pod Serving API همچنین یک الگوی مانیفست برای ارائه اطلاعات اضافی و زمینه برای این بخش‌های تبلیغاتی ارائه می‌کند.

این راهنما بر روی اجرای یک سرور دستکاری مانیفست پایه Pod Serving برای استریم های زنده متمرکز شده است.

پیش نیاز: رویدادهای پخش زنده را در Google Ad Manager پیکربندی کنید

قبل از درخواست از API سرویس pod، باید برای هر جریانی که پردازش می‌کنید یک رویداد پخش زنده Ad Manager ایجاد کنید. می‌توانید با استفاده از LiveStreamEventService API یا رابط وب Google Ad Manager یک رویداد پخش زنده ایجاد کنید.

برای استفاده از یک رویداد پخش زنده با API سرویس پاد، باید چندین ویژگی رویداد خود را پر کنید:

  • customAssetKey - یک شناسه سفارشی که برای این رویداد استفاده می شود. باید در تمام رویدادهای شبکه منحصر به فرد باشد.
  • adTags - نشانی اینترنتی تگ تبلیغاتی اصلی که توسط گردش کار ترافیک Ad Manager ایجاد می شود.
  • dynamicAdInsertionType - باید روی POD_SERVING_REDIRECT تنظیم شود.
  • streamingFormat - بر این اساس روی HLS یا DASH تنظیم کنید.
  • segmentUrlAuthenticationKeyIds - حداقل یک کلید HMAC برای امضای درخواست‌های بخش تبلیغات استفاده می‌شود.
  • daiEncodingProfileIds - لیستی از شناسه های DAIEncodingProfile فعال شده برای این رویداد.
  • startDateTime - تاریخ و زمان شروع رویداد
  • endDateTime - تاریخ و زمان پایان برنامه ریزی شده این رویداد. اگر unlimitedEndDateTime is false and ignored if unlimitedEndDateTime is true. نامحدودEndDateTime` - بولی. بالا را ببینید.

درخواست‌های مانیفست جریان را دریافت کنید

دستکاری کننده مانیفست شما باید یک نقطه پایانی API برای گوش دادن به درخواست های مانیفست از برنامه مشتری پخش کننده ویدیو ارائه دهد. حداقل، این نقطه پایانی باید شناسه جریانی را از برنامه پخش‌کننده مشتری جمع‌آوری کند و باید یک مانیفست جریان دوخته شده را برگرداند. شناسه جریان برای شناسایی جلسه پخش جریانی به Ad Manager استفاده می‌شود.

همچنین باید اطلاعات دیگری را برای شناسایی جریان محتوای مناسب جمع آوری کنید، به عنوان مثال، شناسه محتوا.

مثالی از یک نقطه پایانی درخواست مانیفست بالقوه

GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
پارامترهای مسیر
asset_key شناسه فرضی مربوط به جریان مستقیم درخواستی در سیستم شما.
format یک پارامتر فرضی مربوط به قالب جریان. یکی از هر دو:
mpd برای جریان های MPEG-DASH
m3u8 برای جریان های HLS
پارامترهای پرس و جو
stream_id شناسه جریان Ad Manager از برنامه پخش کننده ویدیوی مشتری.

جریان محتوا را بازیابی کنید

از شناسه محتوای جمع‌آوری‌شده از درخواست مانیفست برای انتخاب جریان محتوا برای هم‌پیوندی با تبلیغات استفاده کنید.

بخش های تبلیغات را به جریان محتوا بپیچید

بسته به قالب پخش شما، پیوند URL های بخش تبلیغات متفاوت خواهد بود.

جریان های HLS

جریان‌های HLS معمولاً به‌عنوان یک مانیفست چند متغیره ارائه می‌شوند که شامل مجموعه‌ای از پیوندها به مانیفست‌های متغیر است که با هر یک از نمایه‌های رمزگذاری مطابقت دارد.

توجه: برای سادگی، این راهنما فرض می‌کند که رسانه HLS شما در قالبی کدگذاری شده است که صدا و تصویر را در یک فایل بخش ترکیب می‌کند.

لیست های پخش چند متغیره پروکسی

برای پردازش مانیفست نوع انتخابی پخش کننده، باید هر نشانی اینترنتی فهرست پخش نسخه را در فهرست پخش چند متغیره اصلی با یک فراخوان نقطه پایانی دیگر به دستکاری کننده جایگزین کنید.

مراحل باقی‌مانده برای دوخت HLS فرض می‌کند که یک مانیفست نوع واحد در حال پردازش است.

مثالی از یک نقطه پایانی درخواست نوع بالقوه
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
پارامترهای مسیر
asset_key شناسه فرضی مربوط به جریان مستقیم درخواستی در سیستم شما.
variant یک پارامتر فرضی حاوی یک شناسه برای نوع خاص در حال پردازش.
پارامترهای پرس و جو
stream_id شناسه جریان Ad Manager از برنامه پخش کننده ویدیوی مشتری. در اینجا برای شناسایی یک جلسه کاربر با دستکاری کننده مانیفست استفاده می شود.
نمونه مانیفست چند متغیره پردازش نشده
#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 : مقدار بولی که آخرین بخش را در یک آگهی تبلیغاتی مشخص می کند. پیش فرض به نادرست.

URL های بخش تبلیغات بسازید

هر بخش در وقفه تبلیغاتی را با یک URL با فرمت جایگزین کنید:

/linear/pods/v1/seg/network/{network_code}/custom_asset/{custom_asset_key}/{pod_identifier}/profile/{profile_name}/{segment_number}.(ts|mp4|vtt|aac|ac3|eac3)
پارامترهای مسیر
network_code کد شبکه Ad Manager 360 برای این شبکه.
custom_asset_key کلید دارایی پخش مستقیم سفارشی که در LiveStreamEventService API یا در صفحه پخش زنده در رابط وب Ad Manager 360 مشخص شده است.
pod_identifier

فرمت های زیر پشتیبانی می شوند:

pod/{integer}

شناسه عددی برای وقفه تبلیغاتی فعلی. شناسه‌های غلاف آگهی به‌صورت تدریجی برای هر رویداد وقفه تبلیغاتی، از 1 شروع می‌شود.

ad_break_id/{string}

شناسه رشته برای وقفه تبلیغاتی فعلی.

profile_name شناسه پروفایل مورد درخواست،
segment_number شاخص این بخش در غلاف تبلیغات فعلی، از صفر شروع می شود.
هنگام استفاده از کانتینر MP4، بخش مقداردهی اولیه را می توان با تنظیم segment_number روی "init" درخواست کرد.
پارامترهای پرس و جو
stream_id مورد نیاز پارامتر stream_id کاربر از درخواست Stream Create برگردانده شد.
sd مورد نیاز segment_duration
so اختیاری segment_offset

اگر so نیست، فرض می‌شود که بخش‌های قبلی همگی مدت زمان یکسانی دارند و افست بخش از segment_number و sd محاسبه می‌شود.

pd الزامی است، به جز رویدادهایی که وقفه‌های تبلیغاتی بدون مدت فعال هستند مدت زمان وقفه تبلیغاتی (بر حسب میلی ثانیه). همچنین به عنوان ad_pod_duration نیز نامیده می شود.
auth-token مورد نیاز یک کد HMAC امضا شده و کدگذاری شده با URL برای این غلاف تبلیغاتی.
last اختیاری Boolean نشان دهنده آخرین بخش در وقفه تبلیغاتی است. پیش فرض به نادرست.

مقادیر پارامتر پرس و جو باید به درستی کدگذاری شوند تا از نظر 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/ad_break_id/adbreak1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=ad_break_id%3adbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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 Serving API هستید.

جریان های DASH

جریان‌های DASH به‌عنوان یک فایل MPD ارائه می‌شوند، که شامل تمام رمزگذاری‌های جریان در یک فایل است، که در آن محتوا به‌صورت مجموعه‌ای از نقطه‌ها نشان داده می‌شود.

الگوی دوره درخواست

از Google Ad Manager یک الگوی دوره درخواست کنید. این الگو پس از پر شدن ماکروهای موجود در آن به دوره استراحت تبلیغاتی شما تبدیل خواهد شد.

شما باید این الگو را فقط یک بار در هر جلسه پخش جریانی درخواست کنید و با هر وقفه تبلیغاتی آن را برای استفاده مجدد در حافظه پنهان ذخیره کنید.

درخواست الگوی دوره endpointhjf
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
پارامترهای مسیر
network_code کد شبکه Ad Manager 360 ناشر.
custom_asset کلید دارایی سفارشی رویداد پخش زنده در Google Ad Manager.
پارامترهای پرس و جو
stream_id شناسه جریان Ad Manager از پخش کننده ویدیوی مشتری.
پاسخ 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$$ زمانی که دوره در MPD فعلی شروع می شود. یک ویژگی اختیاری که باید با start="###" جایگزین شود، که در آن ### زمان ارائه ای است که در آن وقفه تبلیغاتی شروع می شود. اگر زمان شروع دوره ارائه نشده باشد، این ماکرو باید با یک رشته خالی جایگزین شود. start="PT2H33M30S"
$$period-duration$$ مدت زمان دوره کامل آگهی. یک ویژگی اختیاری که باید با duration="###" جایگزین شود، که در آن ### مدت زمان دوره تبلیغ در قالب استاندارد مدت زمان DASH است. اگر مدت زمان ارائه نشده باشد، این ماکرو باید با یک رشته خالی جایگزین شود. duration="PT15S"
$$pod-duration$$ مدت زمان مورد انتظار تبلیغاتی که باید برای این pod تصمیم گیری شود، بر حسب میلی ثانیه. 15000
$$number-of-repeated-segments$$ این مقدار با تقسیم مدت زمان تبلیغات (بر حسب میلی ثانیه) بر مقدار segment_duration_ms و گرد کردن به نزدیکترین عدد صحیح محاسبه می شود. 3
$$cust_params$$ این ماکرو را می‌توان با پارامترهای هدف‌یابی سفارشی منحصر به فرد برای استراحت فعلی جایگزین کرد. ارائه شده است. مقدار باید همانطور که در این مقاله مرکز راهنمای Ad Manager توضیح داده شده است قالب بندی شود. اگر هیچ پارامتر سفارشی مورد نیاز نیست، این ماکرو باید با یک رشته خالی جایگزین شود. &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 Serving API هستید.

منابع اضافی