Trình chỉnh sửa tệp kê khai cho sự kiện phát trực tiếp

API phân phát nhóm cho phép bạn truy cập vào các phân đoạn quảng cáo đã mã hoá và được điều chỉnh, được chuẩn bị sao cho chúng có thể được ghép trực tiếp vào HLS cho người dùng hoặc danh sách phát đa phương tiện MPEG-DASH. Đối với MPEG-DASH, API phân phát nhóm cũng cung cấp một mẫu tệp kê khai để cung cấp thêm thông tin và ngữ cảnh cho các phân đoạn quảng cáo này.

Hướng dẫn này tập trung vào việc triển khai một máy chủ thao tác tệp kê khai cơ bản của tính năng Phân phát nhóm cho luồng phát trực tiếp.

Điều kiện tiên quyết: Định cấu hình sự kiện phát trực tiếp trong Google Ad Manager

Trước khi thực hiện bất kỳ yêu cầu nào từ API phân phát nhóm, bạn phải tạo một Quảng cáo Quản lý sự kiện phát trực tiếp cho mỗi sự kiện phát trực tiếp mà bạn xử lý. Bạn có thể tạo sự kiện phát trực tiếp bằng LiveStreamEventService API hoặc giao diện web của Google Ad Manager.

Để sử dụng một sự kiện phát trực tiếp với API phân phát nhóm, bạn cần điền sẵn một số thuộc tính của sự kiện:

  • customAssetKey – Giá trị nhận dạng tuỳ chỉnh sẽ được dùng cho Sự kiện này. Phải duy nhất trên tất cả các Sự kiện cho mạng.
  • adTags - URL thẻ quảng cáo chính do tính năng quản lý quảng cáo Ad Manager tạo ra quy trình làm việc.
  • dynamicAdInsertionType – Phải được đặt thành POD_SERVING_REDIRECT.
  • streamingFormat – Đặt thành HLS hoặc DASH tương ứng.
  • segmentUrlAuthenticationKeyIds – ít nhất một Khoá HMAC dùng để ký các yêu cầu phân khúc quảng cáo.
  • daiEncodingProfileIds – Danh sách DAIEncodingProfile Đã bật mã nhận dạng cho sự kiện này.
  • startDateTime – Ngày và giờ bắt đầu sự kiện
  • endDateTime – Ngày và giờ kết thúc theo lịch của sự kiện này. Bạn bắt buộc phải sử dụng thuộc tính này nếu unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime` – Boolean. Xem bên trên.

Nhận yêu cầu tệp kê khai luồng

Trình điều khiển tệp kê khai phải cung cấp một điểm cuối API để theo dõi tệp kê khai từ ứng dụng trình phát video. Ở mức tối thiểu, điểm cuối này phải thu thập mã luồng từ ứng dụng trình phát máy khách và phải trả về một đường ghép tệp kê khai luồng. Mã luồng dùng để xác định phiên truyền trực tuyến đến Quảng cáo Người quản lý.

Bạn cũng cần thu thập một số thông tin khác để xác định chính sách luồng nội dung, ví dụ: Content ID.

Ví dụ về điểm cuối yêu cầu tệp kê khai tiềm năng

GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
Tham số đường dẫn
asset_key Mã nhận dạng giả định tương ứng với sự kiện phát trực tiếp được yêu cầu trong hệ thống của bạn.
format Một tham số giả định tương ứng với định dạng luồng. Một trong hai lựa chọn sau:
mpd Đối với luồng MPEG-DASH
m3u8 Đối với luồng HLS
Tham số truy vấn
stream_id Mã luồng Ad Manager từ ứng dụng trình phát video ứng dụng.

Truy xuất luồng nội dung

Sử dụng Content ID thu thập được từ yêu cầu tệp kê khai để chọn nội dung để kết hợp với quảng cáo.

Nối các phân đoạn quảng cáo vào luồng nội dung

Việc ghép các URL phân đoạn quảng cáo sẽ khác nhau, tuỳ thuộc vào định dạng luồng phát của bạn.

Luồng HLS

Luồng HLS thường được phân phát dưới dạng tệp kê khai đa biến thể, chứa tập hợp các liên kết đến tệp kê khai biến thể, tương ứng với mỗi mã hoá hồ sơ.

Lưu ý: Để đơn giản, hướng dẫn này giả định rằng phương tiện truyền thông HLS của bạn được mã hoá theo để kết hợp âm thanh và video vào cùng một tệp phân đoạn.

Danh sách phát đa biến thể proxy

Bạn sẽ cần thay thế từng URL danh sách phát biến thể trong đa biến thể ban đầu danh sách phát có một lệnh gọi điểm cuối khác đến trình điều khiển để xử lý tệp kê khai biến thể đã chọn.

Các bước còn lại để ghép nối HLS sẽ giả định rằng một tệp kê khai biến thể duy nhất đang được xử lý.

Ví dụ về điểm cuối của yêu cầu biến thể tiềm năng
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
Tham số đường dẫn
asset_key Mã giả định tương ứng với sự kiện phát trực tiếp được yêu cầu trong hệ thống của bạn.
variant Một tham số giả định chứa giá trị nhận dạng cho biến thể cụ thể đang được xử lý.
Tham số truy vấn
stream_id Mã luồng Ad Manager từ ứng dụng trình phát video của ứng dụng khách. được dùng ở đây để xác định phiên người dùng bằng trình điều khiển tệp kê khai.
Ví dụ về tệp kê khai nhiều biến thể chưa xử lý
#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
Ví dụ về tệp kê khai nhiều biến thể được proxy
#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

Xác định các đoạn chèn quảng cáo và chèn điểm gián đoạn

Khi bạn xử lý tệp kê khai biến thể, hãy theo dõi thời gian bắt đầu, thời lượng và chỉ mục của điểm chèn quảng cáo tiếp theo, cho đến khi tệp kê khai động đang được xử lý chứa các phân đoạn sẽ được thay thế bằng nội dung quảng cáo.

Có nhiều cách để phân định điểm chèn quảng cáo với các phân đoạn nội dung, tuỳ thuộc vào bộ mã hoá của bạn. Một cách phổ biến để phân định điểm chèn quảng cáo là mở đầu quảng cáo các phân đoạn có thẻ #EXT-X-CUE-OUT và theo sau là thẻ #EXT-X-CUE-IN.

Để tách các điểm chèn quảng cáo do Google lưu trữ khỏi các phân đoạn nội dung, bạn phải chèn thẻ #EXT-X-DISCONTINUITY vào đầu và cuối mỗi điểm chèn quảng cáo. Nếu các yêu cầu này thẻ gián đoạn không xuất hiện trong tệp kê khai cuối cùng, phát lại sẽ không thành công.

URI phân khúc quảng cáo được chèn không được mã hoá. Nếu nội dung của bạn được mã hoá, bạn cũng sẽ cần loại bỏ lớp mã hoá bằng cách chỉ định #EXT-X-KEY:METHOD=NONE trước phân đoạn quảng cáo đầu tiên của mỗi điểm chèn quảng cáo và sau đó thêm lại sau điểm chèn quảng cáo.

Tệp kê khai mẫu (gốc)
#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
Tệp kê khai có các điểm gián đoạn đã được chèn
#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

Xử lý phân khúc nhóm quảng cáo

Đối với mỗi phân đoạn trong nhóm quảng cáo, bạn phải theo dõi một vài giá trị bổ sung:

  • segment_number: Chỉ mục phân đoạn trong nhóm quảng cáo, bắt đầu từ 0. Hoặc "init" cho phân đoạn khởi chạy mp4.
  • segment_duration: Thời lượng của phân đoạn hiện tại tính bằng mili giây. Chiến dịch này tất cả các phân khúc đều phải có giá trị giống nhau, ngoại trừ phân khúc cuối cùng trong nhóm.
  • segment_offset: Độ lệch phân đoạn được tính bằng cách thêm thời lượng của phân đoạn trước vào độ lệch phân đoạn bằng mili giây
  • last: Giá trị Boolean xác định phân khúc cuối cùng trong một nhóm quảng cáo. Giá trị mặc định là false.

Tạo URL phân khúc quảng cáo

Thay thế từng phân đoạn trong điểm chèn quảng cáo bằng một URL có định dạng:

/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)
Tham số đường dẫn
network_code Mã mạng Ad Manager 360 cho mạng này.
custom_asset_key Khoá thành phần phát trực tiếp tuỳ chỉnh được chỉ định trong API LiveStreamEventService hoặc trên trang phát trực tiếp trong giao diện web của Ad Manager 360.
pod_identifier

Các định dạng sau được hỗ trợ:

pod/{integer}

Giá trị nhận dạng dạng số cho điểm chèn quảng cáo hiện tại. Mã nhóm quảng cáo được chỉ định tăng dần cho mỗi sự kiện chèn quảng cáo, bắt đầu từ 1.

ad_break_id/{string}

Giá trị nhận dạng chuỗi cho điểm chèn quảng cáo hiện tại.

profile_name Giá trị nhận dạng cho hồ sơ đang được yêu cầu,
segment_number Chỉ mục của phân đoạn này trong nhóm quảng cáo hiện tại, bắt đầu từ 0.
Khi sử dụng vùng chứa MP4, bạn có thể yêu cầu phân đoạn khởi chạy bằng cách đặt segment_number thành "init".
Tham số truy vấn
stream_id Bắt buộc Tham số stream_id của người dùng được trả về từ yêu cầu Tạo luồng.
sd Bắt buộc segment_duration
so Không bắt buộc segment_offset

Nếu thiếu so, hệ thống sẽ xem như các phân khúc trước đó tất cả có cùng thời lượng và chênh lệch phân đoạn được tính từ segment_numbersd.

pd Bắt buộc, ngoại trừ các sự kiện đã bật chế độ chèn quảng cáo không có thời lượng Thời lượng (tính bằng mili giây) của điểm chèn quảng cáo. Còn được gọi là ad_pod_duration.
auth-token Bắt buộc Mã thông báo HMAC đã ký, được mã hoá bằng URL cho nhóm quảng cáo này.
last Không bắt buộc Boolean cho biết phân đoạn cuối cùng trong điểm chèn quảng cáo. Giá trị mặc định là sai.

Giá trị tham số truy vấn phải được mã hoá đúng cách để an toàn cho URL. Điều này đặc biệt quan trọng đối với trường auth-token, vì trường này có thể chứa các ký tự /, +=.

Tệp kê khai mẫu (sau khi thay thế phân đoạn)
#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

Xin chúc mừng! Bạn hiện đang phân phát sự kiện phát trực tiếp bằng phân khúc quảng cáo do API phân phát nhóm DAI.

Luồng DASH

Luồng DASH được cung cấp dưới dạng tệp MPD, chứa tất cả phương thức mã hoá luồng trong một tệp duy nhất, trong đó nội dung được trình bày dưới dạng một chuỗi dấu chấm.

Mẫu giai đoạn yêu cầu

Yêu cầu mẫu khoảng thời gian từ Google Ad Manager. Mẫu này sẽ trở thành khoảng thời gian chèn quảng cáo sau khi các macro trong đó được điền sẵn.

Bạn chỉ nên yêu cầu mẫu này một lần cho mỗi phiên phát trực tuyến và lưu mẫu đó vào bộ nhớ đệm để sử dụng lại cho mỗi điểm chèn quảng cáo.

Điểm cuối yêu cầu mẫu khoảng thời gianhjf
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
Tham số đường dẫn
network_code Mã mạng Ad Manager 360 của nhà xuất bản.
custom_asset Khoá tài sản tuỳ chỉnh của sự kiện phát trực tiếp trong Google Ad Manager.
Tham số truy vấn
stream_id Mã luồng Ad Manager từ trình phát video ứng dụng.
JSON phản hồi
dash_period_template Chuỗi XML của mẫu kỳ.
segment_duration_ms Thời lượng của mỗi phân đoạn nội dung nghe nhìn quảng cáo trong mẫu dấu gạch ngang, theo mili giây.
Yêu cầu mẫu (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
Ví dụ về phản hồi
{"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}

Điền mẫu kỳ

Mẫu dấu chấm chứa một số macro mà bạn phải thay thế cho mỗi quảng cáo nghỉ ngơi. Bạn phải thay thế tất cả macro. Bạn nên thay thế các macro không dùng đến bằng một chuỗi trống ("").

Macro Mô tả Ví dụ:
$$pod-id$$ Chỉ mục của nhóm quảng cáo mà khoảng thời gian này đại diện. Giá trị này phải khớp với cùng một nhóm trên tất cả các phiên xem. 1
$$period-start$$ Thời điểm bắt đầu giai đoạn tính bằng MPD hiện tại. Một thuộc tính không bắt buộc phải được thay thế bằng start="###", trong đó ### là thời gian trình bày mà điểm chèn quảng cáo bắt đầu. Nếu bạn không cung cấp thời gian bắt đầu của khoảng thời gian, thì bạn nên thay thế macro này bằng một chuỗi trống. start="PT2H33M30S"
$$period-duration$$ Thời lượng của toàn bộ thời gian quảng cáo. Đây là thuộc tính không bắt buộc được thay thế bằng duration="###", trong đó ### là thời lượng của thời gian quảng cáo ở định dạng thời lượng DASH chuẩn. Nếu khoảng thời gian không được cung cấp, bạn phải thay thế macro này bằng một chuỗi trống. duration="PT15S"
$$pod-duration$$ Thời lượng dự kiến của quảng cáo sẽ được quyết định cho nhóm quảng cáo này, tính bằng mili giây. 15000
$$number-of-repeated-segments$$ Giá trị này được tính bằng cách chia thời lượng của khoảng thời gian quảng cáo (tính bằng mili giây) cho giá trị của segment_duration_ms rồi làm tròn lên số nguyên gần nhất. 3
$$cust_params$$ Bạn có thể thay thế macro này bằng các thông số nhắm mục tiêu tùy chỉnh dành riêng cho điểm chèn quảng cáo hiện tại, nếu có. đã cung cấp. Giá trị này phải được định dạng như mô tả trong bài viết này trên Trung tâm trợ giúp của Ad Manager. Nếu không cần thông số tùy chỉnh, bạn nên thay thế macro này bằng một tham số trống . &cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
$$scte35$$ Bạn cần thay thế macro này bằng một giá trị scte35 dành riêng cho điểm chèn quảng cáo đó, nếu có. Nếu không cần thông tin scte35 thì macro này sẽ sẽ được thay thế bằng một chuỗi trống. /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ URL được mã hoá, đã ký Mã thông báo HMAC. Mã thông báo này là bắt buộc. custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
Mẫu khoảng thời gian thô, có chứa macro
<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>
Khoảng thời gian quảng cáo được điền sẵn
<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>

Chèn khoảng thời gian đã điền vào tệp kê khai DASH

Cuối cùng, hãy thay thế khoảng thời gian thích hợp trong tệp kê khai thô bằng khoảng thời gian quảng cáo mới được điền và trả về tệp kê khai đã ghép nối cuối cùng cho ứng dụng video đang yêu cầu để phát.

Ví dụ về tệp kê khai nội dung thô
<?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>
Ví dụ về tệp kê khai ghép nối
<?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>

Xin chúc mừng! Bạn hiện đang phân phát một sự kiện phát trực tiếp DASH có các phân đoạn quảng cáo do API Phân phát nhóm DAI cung cấp.

Tài nguyên khác