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 cung cấp quyền truy cập vào các phân đoạn quảng cáo được mã hoá và điều chỉnh, được chuẩn bị theo cách có thể ghép trực tiếp vào danh sách phát nội dung nghe nhìn HLS-DASH dành cho người dùng. Đố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 khúc quảng cáo này.

Hướng dẫn này tập trung vào việc triển khai máy chủ thao tác tệp kê khai Phân phát nhóm cơ bản cho sự kiện 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 đưa ra 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 sự kiện phát trực tiếp trong Ad Manager cho từng luồng mà bạn xử lý. Bạn có thể tạo sự kiện phát trực tiếp bằng cách sử dụng LiveStreamEventService API hoặc giao diện web Google Ad Manager.

Để 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 một số thuộc tính của sự kiện:

  • customAssetKey – Giá trị nhận dạng tuỳ chỉnh dùng cho Sự kiện này. Phải là duy nhất trên tất cả các Sự kiện của mạng.
  • adTags – URL thẻ quảng cáo chính do quy trình quản lý quảng cáo của Ad Manager tạo ra.
  • dynamicAdInsertionType – Phải đặt thành POD_SERVING_REDIRECT.
  • streamingFormat – Đặt thành HLS hoặc DASH cho phù hợp.
  • segmentUrlAuthenticationKeyIds – ít nhất một khoá HMAC được dùng để ký các yêu cầu về phân khúc quảng cáo.
  • daiEncodingProfileIds – Danh sách các mã nhận dạng DAIEncodingProfile được bật 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.heightEndDateTime` – Boolean. Xem bên trên.

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

Trình thao tác tệp kê khai phải cung cấp một điểm cuối API để theo dõi các yêu cầu về tệp kê khai từ ứng dụng trình phát video. Ít nhất, điểm cuối này phải thu thập mã luồng từ ứng dụng trình phát ứng dụng khách và phải trả về một tệp kê khai luồng được ghép. Mã luồng được dùng để xác định phiên truyền trực tuyến tới Ad Manager.

Bạn cũng cần thu thập một số thông tin khác để xác định luồng nội dung thích hợp, chẳng hạn như mã nhận dạng nội dung.

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

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 thông số giả định tương ứng với định dạng luồng. Một trong hai cách 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 của Ad Manager từ ứng dụng trình phát video của ứng dụng.

Truy xuất luồng nội dung

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

Ghép các phân đoạn quảng cáo vào luồng nội dung

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

Luồng HLS

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

Lưu ý: Để đơn giản, hướng dẫn này giả định rằng nội dung nghe nhìn HLS của bạn được mã hoá ở một định dạng 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 danh sách phát đa biến thể ban đầu bằng một lệnh gọi điểm cuối khác đến trình thao tác để xử lý tệp kê khai biến thể đã chọn của người chơi.

Các bước còn lại để ghép 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 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ã 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.
variant Một thông số giả định có 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 khách hàng được dùng ở đây để xác định phiên hoạt động của người dùng bằng trình thao tác tệp kê khai.
Ví dụ về tệp kê khai đa biến thể chưa được 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 đa biến thể đã qua 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 phân đoạn điểm 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 sắp tới 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 để mô tả điểm chèn quảng cáo từ 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 phân khúc quảng cáo bằng thẻ #EXT-X-CUE-OUT và theo sau bằng thẻ #EXT-X-CUE-IN.

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

URI phân đoạn quảng cáo đã 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 khúc 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 phân khúc đó 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ó chèn giá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
#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 thêm một vài giá trị:

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

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

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

/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)
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 của sự kiệ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_id Giá trị nhận dạng cho điểm chèn quảng cáo. Phải là một số nguyên bắt đầu từ 1 và tăng thêm 1 cho mỗi điểm chèn quảng cáo.

Giá trị này phải giống nhau đối với tất cả người dùng xem cùng một điểm chèn quảng cáo trong sự kiện hiện tại.

profile_name Giá trị nhận dạng của hồ sơ đang được yêu cầu,
segment_number Chỉ mục của phân khúc 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 khúc 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 giả định rằng tất cả các đoạn trước đó đều có cùng thời lượng và độ lệch của 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 điểm chèn quảng cáo không 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 Giá trị 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à false.

Các giá trị tham số truy vấn phải được mã hoá đúng cách để an toàn với 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/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

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

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 biểu thị dưới dạng một chuỗi giai đoạn.

Mẫu khoảng thời gian 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 mẫu này đượ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 với mỗi điểm chèn quảng cáo.

Điểm cuối yêu cầu mẫu khoảng thời gian
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 của ứng dụng.
Phản hồi JSON
dash_period_template Chuỗi XML của mẫu dấu chấm.
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 khoảng thời gian gạch ngang, tính bằng 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 khoảng thời gian

Mẫu khoảng thời gian chứa một số macro mà bạn phải thay thế cho mỗi điểm chèn quảng cáo. 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 Nội dung 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 trong tất cả các phiên xem của người xem. 1
$$period-start$$ Thời điểm bắt đầu khoảng thời gian này trong MPD hiện tại. 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 chiếu 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 phải thay thế macro này bằng một chuỗi trống. start="PT2H33M30S"
$$period-duration$$ Thời lượng của giai đoạn quảng cáo hoàn chỉnh. Bạn nên thay thế một thuộc tính không bắt buộc 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 không cung cấp khoảng thời gian thì 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 được quyết định cho nhóm 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 thời gian quảng cáo (tính bằng mili giây) cho giá trị của segment_duration_ms và làm tròn đế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ị 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 chuỗi 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ó giá trị được cung cấp. Nếu không cần thông tin về scte35, bạn nên thay thế macro này bằng một chuỗi trống. /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ Mã thông báo HMAC đã ký và được mã hoá url. 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 kỳ 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 dấu chấm câu đã đ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, rồi trả về tệp kê khai ghép cuối cùng cho ứng dụng video yêu cầu để phát lại.

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 được ghép
<?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 sự kiện phát trực tiếp DASH với các phân khúc quảng cáo do API Phân phát nhóm DAI cung cấp.

Tài nguyên bổ sung