Chuyển đến: Yêu cầu về tệp kê khai và nội dung | Gói, nền tảng và trình phát
Tệp kê khai nhiều giai đoạn so với tệp kê khai một giai đoạn
Ad Manager hỗ trợ nhập cả tệp kê khai nhiều giai đoạn và tệp kê khai một giai đoạn cho DASH.
Với tệp kê khai một khoảng thời gian, nhà xuất bản cung cấp luồng DASH với một giai đoạn duy nhất chứa tất cả nội dung và cơ hội chèn quảng cáo, thay vì nhiều giai đoạn phân biệt chúng. DAI hỗ trợ tệp kê khai một giai đoạn bằng cách chuyển đổi các tệp kê khai đó thành nhiều giai đoạn mỗi lần tìm nạp.
Bạn có thể chọn tệp kê khai được cung cấp dưới dạng một hay nhiều giai đoạn khi thiết lập một luồng trực tiếp trong Google Ad Manager và chọn "DASH" làm định dạng phát trực tuyến.
Hãy tham khảo hướng dẫn này để nắm được kỳ vọng về tệp kê khai nhiều giai đoạn và tệp kê khai một giai đoạn. Ngoài ra, nếu bạn đang sử dụng tệp kê khai một giai đoạn, thì phụ lục sẽ minh hoạ cách DAI chuyển đổi tệp kê khai một giai đoạn thành tệp kê khai nhiều giai đoạn.
Yêu cầu về tệp kê khai và nội dung
Đối với tệp kê khai nhiều giai đoạnYêu cầu về tệp kê khai MPEG-DASH nhiều giai đoạn
DAI Google thực hiện các xác thực sau trên MPD thô:
- Xác thực phần tử MPD
- Xác thực phần tử Period
- Xác thực phần tử AdaptationSet
- Xác thực phần tử Representation
- Xác thực SegmentTemplate có thời gian
- Xác thực thành phần thời gian
Xác thực phần tử MPD
Type
được đặt thànhdynamic
Profile
được đặt thànhurn:mpeg:dash:profile:isoff-live:2011
availabilityStartTime
phải khác 0 và giá trị không được thay đổi giữa các lần truy vấn MPD liên tiếpPublishTime
phải khác 0 và giá trị của này phải được tăng lên hoặc giữ nguyên giữa các lần truy vấn liên tiếp. Tuy nhiên, mỗi lần cập nhật, thuộc tínhpublishTime
phải được đặt thành thời điểm hiện tại.- Bạn phải sử dụng HTTPS cho toàn bộ nội dung DASH được tham chiếu trong cùng một MPD
Ví dụ:
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="dynamic"
profiles="urn:mpeg:dash:profile:isoff-live:2011"
availabilityStartTime="2022-01-01T10:00:00Z"
publishTime="2022-01-01T10:00:00Z"
minimumUpdatePeriod="PT25S" timeShiftBufferDepth="PTM0S" maxSegmentDuration="PT2S"
minBufferTime="PT2S">
<Period …>
…
</Period>
…
</MPD>
Xác thực phần tử Period
-
Start
phải lớn hơn hoặc bằng 0Cách này cho phép hỗ trợ khoảng thời gian ISO-8601 có thể tuỳ ý bao gồm một trường ngày dạng số nguyên. Ví dụ:P3DT3H1M30S
thể hiện 3 ngày, 3 giờ, 1 phút và 30 giây.Hiện tại, chúng tôi không hỗ trợ các dấu chỉ định giai đoạn Năm, Tháng và Tuần theo ISO-8601.
Period
có ít nhất một phần tửAdaptationSet
- Bạn chỉ có thể sử dụng các mẫu có địa chỉ theo số và thời gian làm lược đồ địa chỉ
Ví dụ:
<Period start="PT0S">
<AdaptationSet …>
…
</AdaptationSet>
<AdaptationSet …>
…
</AdaptationSet>
</Period>
Giữa các lần truy vấn MPD liên tiếp:
- Chỉ có thể xoá các phần tử
Period
khỏi phần đầu của MPD - Bạn chỉ có thể thêm các phần tử
Period
vào phần cuối của MPD - Chỉ có thể cập nhật giai đoạn đầu tiên và giai đoạn cuối cùng trong MPD. Không được sửa đổi các giai đoạn khác trong MPD. Bản cập nhật chỉ dành cho:
- Xoá các phân đoạn hoặc sự kiện khỏi đầu giai đoạn đầu tiên
- Thêm những phân đoạn hoặc sự kiện mới vào cuối giai đoạn cuối
Xác thực phần tử AdaptationSet
AdaptationSet
có ít nhất một phần tửRepresentation
- Nếu có, các phần tử
ContentProtection
trongAdaptationSet
và các phần tử phụ không được thay đổi giữa các lần truy vấn MPD liên tiếp
Ví dụ:
<AdaptationSet mimeType="video/mp4" startWithSAP="1"
contentType="video" par="16:9"
minWidth="640" maxWidth="640" minHeight="360" maxHeight="360"
maxFrameRate="60/2"
segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<ContentComponent id="0" contentType="video" />
<Representation …>
…
</Representation>
<Representation …>
…
</Representation>
</AdaptationSet>
Xác thực phần tử Representation
- Không được để trống
id
- Không được có phần tử
SegmentBase
hoặcSegmentList
Ví dụ:
<Representation width="640" height="360" sar="1:1" frameRate="60/2"
codecs="avc1.64001e" id="V300" bandwidth="300000">
…
</Representation>
Xác thực SegmentTemplate có thời gian
- Phần tử
SegmentTimeline
S
có thể chứa thuộc tínht
— được dùng cho URL nội dung đa phương tiện- Nếu không được cung cấp, giá trị sẽ được giả định là
0
đối với phần tửS
đầu tiên và đối với các phần tửS
tiếp theo, thì giá trị được giả định là tổng thời gian trình bày sớm nhất của phần tửS
trước đó và thời lượng liền kề — giá trị của [t
+d
× (r
+ 1) ] của phần tửS
trước đó). $Time$
và$Number$
đều được hỗ trợ trong tệp kê khai nhiều giai đoạnS
tartNumber
củaSegmentTemplate
không được sử dụng
- Nếu không được cung cấp, giá trị sẽ được giả định là
- Giữa các lần truy vấn MPD liên tiếp:
- Bạn chỉ có thể xoá các phân đoạn khỏi đầu
SegmentTimeline
khi chúng di chuyển ra khỏi ảnh chụp nhanh của phần ghi bằng DVR - Bạn chỉ có thể nối các phân đoạn ở cuối
SegmentTimeline
- Bạn chỉ có thể xoá các phân đoạn khỏi đầu
Ví dụ:
<SegmentTemplate timescale="90000" initialization="$RepresentationID$/init.mp4"
media="$RepresentationID$/$Time$.m4s">
<SegmentTimeline>
<S t="0" d="270000" r="20" />
</SegmentTimeline>
</SegmentTimeline>
Xác thực thành phần thời gian
DAI Google hỗ trợ thành phần thời gian của thời lượng ISO-8601 và hỗ trợ thành phần ngày dạng số nguyên tuỳ chọn: P0Y0M[n]DT[n]H[n]M[n]S. Thành phần ngày được chuyển đổi thành thời lượng bằng cách xem xét 1 ngày = 24 giờ và được thêm vào thành phần thời gian. Nano giây là độ chi tiết thấp nhất được công nhận.
Ví dụ về định dạng thời gian hợp lệ
P0Y0M
P0Y0M2D
P2D
PT3H
PT0H3M
P0Y0M0DT0H0M1.000S
P0Y0M1DT2H4M10S
PT0.000000001S
Ví dụ về định dạng thời gian không hợp lệ
P
PT
2007-03-01
P5Y0M1DT2H4M1.000S
P0Y1.5M1DT2H4M1.000S
P0YiM1DT2H4M1.000S
P0Y0M.3DT0H0M1.000S
3h
PT100,000H
Yêu cầu đối với các sự kiện thông báo điểm bắt đầu quảng cáo và điểm kết thúc quảng cáo
DAI Google thực hiện các xác thực sau đối với các sự kiện thông báo điểm bắt đầu quảng cáo và điểm kết thúc quảng cáo. Bạn phải điều chỉnh trước nội dung dựa trên những yêu cầu sau:
- Phải chia bản trình bày nội dung nghe nhìn thành nhiều giai đoạn, trong đó mỗi điểm
CUE-OUT
vàCUE-IN
của quảng cáo trong video nằm trên một ranh giới của giai đoạn. - Các phân đoạn nội dung ở đầu và cuối của mỗi giai đoạn phải được chuẩn bị sao cho mọi khung trong phân đoạn đều nằm trong giai đoạn đó.
- Khung hình chính/khung IDR phải theo điểm dừng và phải ở đầu giai đoạn. Để đáp ứng yêu cầu này, bạn có thể phải kết thúc giai đoạn bằng một phân đoạn ngắn khi điểm dừng không nằm trên ranh giới tự nhiên.
Báo hiệu điểm chèn quảng cáo
- Tất cả nội dung liên quan đến một điểm chèn quảng cáo đều phải nằm trong một hoặc nhiều khoảng thời gian liên tiếp. Những giai đoạn đó chỉ được chứa các phân đoạn nội dung cần thay thế.
-
Bạn phải báo hiệu bộ chỉ báo điểm chèn quảng cáo
CUE-OUT
trong tệp kê khai MPD như một trong các ví dụ sau:Ví dụ 1
- Phần tử SCTE-35
EventStream
SchemeIdUri="urn:scte:scte35:2014:xml+bin"
- Được xác định trong tiêu chuẩn DASH.
<MPD>
<Period start="PT0S" id="1">
<!-- Giai đoạn nội dung -->
...
</Period>
<Period start="PT32S" id="2">
<!-- Giai đoạn chèn quảng cáo -->
<!-- Phân đoạn đầu tiên của giai đoạn này là thời điểm bắt đầu điểm chèn quảng cáo
và điểm chèn quảng cáo kết thúc bằng phân đoạn cuối cùng -->
<EventStream timescale="90000"
schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<!-- Thời lượng được chỉ định trong sự kiện này phải khớp với thời lượng thực tế
của giai đoạn càng chính xác càng tốt -->
<Signal xmlns="http://www.scte.org/schemas/35/2016"
<Binary>
/DAlAAAAAAAAAP/wFAUAAAAEf+/+kybGyP4BSvaQAAEBAQAArky/3g==
<Binary>
</Signal>
</Event>
</EventStream>
</Period>
<Period start="PT60S" id="3">
<!-- Giai đoạn nội dung -->
...
</Period>
</MPD>
Ví dụ 2
- Phần tử SCTE-35
EventStream
SchemeIdUri="urn:scte:scte35:2013:xml"
- Được xác định trong tiêu chuẩn DASH.
<MPD>
<Period start="PT0S" id="1">
<!-- Giai đoạn nội dung -->
...
</Period>
<Period start="PT32S" id="2">
<!-- Giai đoạn chèn quảng cáo -->
<!-- Phân đoạn đầu tiên của giai đoạn này là thời điểm bắt đầu điểm chèn quảng cáo
và điểm chèn quảng cáo kết thúc bằng phân đoạn cuối cùng -->
<EventStream timescale="90000"
schemeIdUri="urn:scte:scte35:2013:xml">
<Event duration="2520000" id="1">
<!-- Thời lượng được chỉ định trong sự kiện này phải khớp với thời lượng thực tế
của giai đoạn càng chính xác càng tốt -->
<SpliceInfoSection xmlns="urn:scte:scte35:2013:xml">
<SpliceInsert outOfNetworkIndicator="true"
spliceImmediateFlag="true">
<BreakDuration autoReturn="true"
duration="2520000"/>
</SpliceInsert>
</SpliceInfoSection>
</Event>
</EventStream>
</Period>
<Period start="PT60S" id="3">
<!-- Giai đoạn nội dung -->
...
</Period>
</MPD>
- Phần tử SCTE-35
- Thời lượng chèn quảng cáo chỉ định trong sự kiện
CUE-OUT
phải bằng tổng thời lượng của tất cả phân đoạn trong các giai đoạn chèn quảng cáo.
Điểm đánh dấu quảng cáo được hỗ trợ
Trong DASH, mã đánh dấu CUE đi kèm với ranh giới phần tử XML Period
. Thẻ đánh dấu CUE được cung cấp dưới dạng phần tử Event
trong các phần tử EventStream
bên trong Period
. Ranh giới bổ sung này đủ để xác định mã đánh dấu. Ngoài ra, do các điểm chèn quảng cáo được đánh dấu theo ranh giới Period
, nên không cần điểm đánh dấu CUE-IN rõ ràng.
Ví dụ này là một loại đánh dấu SCTE35 dựa trên XML cho DASH. Loại này tương tự như SCTE35 Binary Splice Insert, ngoại trừ dữ liệu được phân tích cú pháp và trình bày dưới dạng XML thay vì dạng tệp nhị phân.
Ví dụ:
<Period>
<EventStream timescale="90000" schemeIdUri="urn:scte:scte35:2013:xml">
<Event duration="2520000" id="1">
<SpliceInfoSection xmlns="urn:scte:scte35:2013:xml">
<SpliceInsert outOfNetworkIndicator="true" spliceImmediateFlag="true">
<BreakDuration autoReturn="true" duration="2520000"/>
</SpliceInsert>
</SpliceInfoSection>
</Event>
</EventStream>
</Period>
Trong DASH, thẻ đánh dấu CUE đi kèm với ranh giới phần tử XML Period
. Thẻ đánh dấu CUE được cung cấp dưới dạng phần tử Event
trong các phần tử EventStream
bên trong Period
. Ranh giới bổ sung này đủ để xác định mã đánh dấu. Ngoài ra, do các điểm chèn quảng cáo được đánh dấu theo ranh giới Period
, nên không cần điểm đánh dấu CUE-IN rõ ràng.
Ví dụ này là một loại mã đánh dấu SCTE35 dựa trên XML cho DASH. Loại này tương tự như Tín hiệu thời gian nhị phân SCTE35
, ngoại trừ việc dữ liệu được phân tích cú pháp và trình bày dưới dạng tệp XML thay vì tệp nhị phân.
Ví dụ:
<Period>
<EventStream timescale="90000" schemeIdUri="urn:scte:scte35:2013:xml">
<Event duration="2520000" id="1">
<SpliceInfoSection xmlns="urn:scte:scte35:2013:xml">
<TimeSignal outOfNetworkIndicator="true" spliceImmediateFlag="true">
<SpliceTime ptsTime="123123"/>
</TimeSignal>
<SegmentationDescriptor segmentationEventId="123123" segmentationEventCancelIndicator="false" segmentationDuration="123123">
<DeliveryRestrictions webDeliveryAllowedFlag="false" noRegionalBlackoutFlag="true" archiveAllowedFlag="false" deviceRestrictions="3"/>
<SegmentationUpid segmentationUpidType="14" segmentationTypeId="52" >11111</SegmentationUpid>
</SegmentationDescriptor>
</SpliceInfoSection>
</Event>
</EventStream>
</Period>
SegmentationTypeId
cho biết loại tín hiệu thời gian.
Giá trị SegmentationTypeId
sau đây được ghi nhận là tín hiệu thời gian CUE-OUT (bắt đầu quảng cáo) hợp lệ:
34
: Break Start (Bắt đầu điểm chèn quảng cáo)
48
: Provider Advertisement Start (Bắt đầu quảng cáo của nhà cung cấp)
52
: Provider Placement Opportunity Start (Bắt đầu cơ hội cho vị trí của nhà cung cấp)
Giá trị SegmentationTypeId
sau đây được ghi nhận là tín hiệu thời gian CUE-IN (kết thúc quảng cáo) hợp lệ:
35
: Break End (Kết thúc điểm chèn quảng cáo)
49
: Provider Advertisement End (Kết thúc quảng cáo của nhà cung cấp)
53
: Provider Placement Opportunity End (Kết thúc cơ hội cho vị trí của nhà cung cấp)
Trong DASH, mã đánh dấu CUE đi kèm với ranh giới phần tử XML Period
. Thẻ đánh dấu CUE được cung cấp dưới dạng phần tử Event
trong các phần tử EventStream
bên trong Period
. Ranh giới bổ sung này đủ để xác định mã đánh dấu. Ngoài ra, do các điểm chèn quảng cáo được đánh dấu theo ranh giới Period
, nên không cần điểm đánh dấu CUE-IN rõ ràng.
Ví dụ này thể hiện mã đánh dấu SCTE35 cho DASH.
Ví dụ:
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>
/DAlAAAAAAAAAP/wFAUAAAAEf+/+kybGyP4BSvaQAAEBAQAArky/3g==
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
Dữ liệu tệp nhị phân SCTE-35 (mã hóa base64) phải được giải mã và phân tích cú pháp để xác định liệu dữ liệu này có chứa CUE-OUT/CUE-IN hợp lệ, cùng với bất kỳ thông tin nhắm mục tiêu điểm chèn nào hay không.
Ví dụ: dữ liệu tệp nhị phân sau đây chứa tín hiệu CUE-OUT hợp lệ:
Ví dụ:
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>
/DAsAAAAAyiYAP/wBQb/PVbrDQAWAhRDVUVJB48zWH//AAEuGvsAACIAAdRJqiI=
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
Khi đã được giải mã, thông báo có chứa các trường sau:
splice_command_type
, khi được đặt thành giá trị 6, cho biết đây là tín hiệu thời giansegment_type_id
cho biết loại tín hiệu thời gian
Giá trị segment_type_id
sau đây được công nhận là tín hiệu thời gian CUE-OUT hợp lệ:
34
: Bắt đầu chèn quảng cáo
Giá trị segmentation_type_id
sau đây (khi splice_command_type = 6
) được công nhận là tín hiệu thời gian CUE-IN hợp lệ:
35
: Kết thúc chèn quảng cáo
Dữ liệu tệp nhị phân SCTE-35 (mã hóa base64) phải được giải mã và phân tích cú pháp để xác định liệu dữ liệu này có chứa CUE-OUT/CUE-IN hợp lệ, cùng với bất kỳ thông tin nhắm mục tiêu điểm chèn nào hay không.
Ví dụ: dữ liệu tệp nhị phân sau đây chứa tín hiệu CUE-OUT hợp lệ:
Ví dụ:
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>
/DBcAAAAAAAAAP/wBQb//ciI8QBGAh1DVUVJXQk9EX+fAQ5FUDAxODAzODQwMDY2NiEEZAIZQ1VFSV0JPRF/3wABLit7AQVDMTQ2NDABAQEKQ1VFSQCAMTUwKnPhdcU=
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
Khi đã được giải mã, thông báo có chứa các trường sau:
splice_command_type
, khi được đặt thành giá trị 6, cho biết đây là tín hiệu thời giansegment_type_id
cho biết loại tín hiệu thời gian
Giá trị segment_type_id
sau đây được công nhận là tín hiệu thời gian CUE-OUT hợp lệ:
48
: Provider Advertisement Start
Giá trị segmentation_type_id
sau đây (khi splice_command_type = 6
) được công nhận là tín hiệu thời gian CUE-IN hợp lệ:
49
: Provider Advertisement End (Quảng cáo của nhà cung cấp kết thúc)
Dữ liệu tệp nhị phân SCTE-35 (mã hóa base64) phải được giải mã và phân tích cú pháp để xác định liệu dữ liệu này có chứa CUE-OUT/CUE-IN hợp lệ, cùng với bất kỳ thông tin nhắm mục tiêu điểm chèn nào hay không.
Ví dụ: dữ liệu tệp nhị phân sau đây chứa tín hiệu CUE-OUT hợp lệ:
Ví dụ:
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>
/DA0AAAAAAAA///wBQb+cr0AUAAeAhxDVUVJSAAAjn/PAAGlmbAICAAAAAAsoKGKNAIAmsnRfg==
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
Khi đã được giải mã, thông báo có chứa các trường sau:
splice_command_type
, khi được đặt thành giá trị 6, cho biết đây là tín hiệu thời giansegment_type_id
cho biết loại tín hiệu thời gian
Giá trị segment_type_id
sau đây được công nhận là tín hiệu thời gian CUE-OUT hợp lệ:
52
: Provider Placement Opportunity Start
Giá trị segmentation_type_id
sau đây (khi splice_command_type = 6
) được công nhận là tín hiệu thời gian CUE-IN hợp lệ:
53
: Provider Placement Opportunity End (Kết thúc cơ hội vị trí nhà cung cấp)
Macro cho thẻ đánh dấu SCTE-35
Nếu nguồn cấp dữ liệu của bạn có mã đánh dấu EXT-OATCLS-SCTE35
hoặc EXT-X-DATERANGE
, thì siêu dữ liệu sẽ tự động được trích xuất và cung cấp thông qua khoá-giá trị tuỳ chỉnh. Bạn cần phải thiết lập khoá-giá trị tuỳ chỉnh rồi chèn khoá đó dưới dạng macro khi tạo thẻ quảng cáo.
Khi bạn thiết lập khóa-giá trị tùy chỉnh mới cho trường SCTE-35, hãy sử dụng khóa tùy chỉnh (ví dụ: "scte35") và đặt giá trị cho (các) macro tương ứng với loại trường có sẵn trong nguồn cấp dữ liệu của bạn:
Macro | Nội dung mô tả |
---|---|
%%SPLICE_INSERT_EVENT_ID%% |
Số nguyên không dấu trong thông báo SCTE35 được chuyển đổi thành các chuỗi dưới dạng số thập phân. |
%%SPLICE_INSERT_UPID%% |
|
%%TIME_SIGNAL_EVENT_ID%% |
|
%%TIME_SIGNAL_UPID%% |
Hiển thị dưới dạng số thập lục phân viết thường, không có tiền tố 0x . |
%%TIME_SIGNAL_UPID_RAW%% |
Chèn byte thô từ thông báo SCTE mà không cần chuyển đổi số thập lục phân (chuỗi ban đầu phải là chuỗi được mã hoá UTF-8 hợp lệ). |
%%AFMM_CBC%% |
Trích xuất mã điểm chèn quảng cáo từ thông tin điểm ghép nối (đây là yêu cầu đối với quy cách AF2M của Pháp). |
Dự kiến về tệp kê khai MPEG-DASH một giai đoạn
DAI Google thực hiện các xác thực sau trên MPD thô:
- Xác thực phần tử MPD
- Xác thực phần tử Period
- Xác thực phần tử EventStream
- Xác thực phần tử AdaptationSet
- Xác thực phần tử Representation
- Xác thực SegmentTemplate có thời gian
- Xác thực thành phần thời gian
Xác thực phần tử MPD
Type
được đặt thànhdynamic
Profiles
được đặt thànhurn:mpeg:dash:profile:isoff-live:2011
AvailabilityStartTime
phải khác 0 và giá trị không được thay đổi giữa các lần truy vấn MPD liên tiếpPublishTime
phải khác 0 và giá trị của này phải được tăng lên hoặc giữ nguyên giữa các lần truy vấn liên tiếp- MPD có đúng một phần tử
Period
- Bạn phải sử dụng HTTPS cho toàn bộ nội dung DASH được tham chiếu trong cùng một MPD
Ví dụ:
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="dynamic"
profiles="urn:mpeg:dash:profile:isoff-live:2011"
availabilityStartTime="2022-01-01T10:00:00Z"
publishTime="2022-01-01T10:00:00Z"
minimumUpdatePeriod="PT25S" timeShiftBufferDepth="PTM0S" maxSegmentDuration="PT2S"
minBufferTime="PT2S">
<Period …>
…
</Period>
…
</MPD>
Xác thực phần tử Period
Start
phải lớn hơn hoặc bằng 0Period
có ít nhất một phần tửAdaptationSet
Ví dụ:
<Period start="PT0S">
<AdaptationSet …>
…
</AdaptationSet>
<AdaptationSet …>
…
</AdaptationSet>
</Period>
Xác thực phần tử EventStream
Giữa các lần truy vấn MPD liên tiếp:
- Bạn chỉ có thể xoá các phần tử
Event
khỏi đầuEventStream
- Bạn chỉ có thể thêm các phần tử
Event
vào cuốiEventStream
Xác thực phần tử AdaptationSet
AdaptationSet
có ít nhất một phần tửRepresentation
- Nếu có, các phần tử
ContentProtection
trongAdaptationSet
và các phần tử phụ không được thay đổi giữa các lần truy vấn MPD liên tiếp
Ví dụ:
<AdaptationSet mimeType="video/mp4" startWithSAP="1"
contentType="video" par="16:9"
minWidth="640" maxWidth="640" minHeight="360" maxHeight="360"
maxFrameRate="60/2"
segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<ContentComponent id="0" contentType="video" />
<Representation …>
…
</Representation>
<Representation …>
…
</Representation>
</AdaptationSet>
Xác thực phần tử Representation
- Không được để trống
id
- Không được có phần tử
SegmentBase
hoặcSegmentList
Ví dụ:
<Representation width="640" height="360" sar="1:1" frameRate="60/2"
codecs="avc1.64001e" id="V300" bandwidth="300000">
…
</Representation>
Xác thực SegmentTemplate có $Time$
- Phần tử
SegmentTimeline
S
có thể chứa thuộc tínht
— được dùng cho URL nội dung đa phương tiện- Nếu không được cung cấp, giá trị sẽ được giả định là
0
đối với phần tửS
đầu tiên và đối với các phần tửS
tiếp theo, thì giá trị được giả định là tổng thời gian trình bày sớm nhất của phần tửS
trước đó và thời lượng liền kề — giá trị của [t
+d
× (r
+ 1) ] của phần tửS
trước đó). $Time$
được hỗ trợ cho tệp kê khai một giai đoạn;$Number$
chưa được hỗ trợS
tartNumber
củaSegmentTemplate
không được sử dụng
- Nếu không được cung cấp, giá trị sẽ được giả định là
- Giữa các lần truy vấn MPD liên tiếp:
- Bạn chỉ có thể xoá các phân đoạn khỏi đầu
SegmentTimeline
khi chúng di chuyển ra khỏi ảnh chụp nhanh của phần ghi bằng DVR - Bạn chỉ có thể nối các phân đoạn ở cuối
SegmentTimeline
- Bạn chỉ có thể xoá các phân đoạn khỏi đầu
Ví dụ:
<SegmentTemplate timescale="90000" initialization="$RepresentationID$/init.mp4"
media="$RepresentationID$/$Time$.m4s">
<SegmentTimeline>
<S t="0" d="270000" r="20" />
</SegmentTimeline>
</SegmentTimeline>
Xác thực thành phần thời gian
DAI Google hỗ trợ thành phần thời gian của thời lượng ISO-8601 và hỗ trợ thành phần ngày dạng số nguyên tuỳ chọn: P0Y0M[n]DT[n]H[n]M[n]S. Thành phần ngày được chuyển đổi thành thời lượng bằng cách xem xét 1 ngày = 24 giờ và được thêm vào thành phần thời gian. Nano giây là độ chi tiết thấp nhất được công nhận.
Ví dụ về định dạng thời gian hợp lệ
P0Y0M
P0Y0M2D
P2D
PT3H
PT0H3M
P0Y0M0DT0H0M1.000S
P0Y0M1DT2H4M10S
PT0.000000001S
Ví dụ về định dạng thời gian không hợp lệ
P
PT
2007-03-01
P5Y0M1DT2H4M1.000S
P0Y1.5M1DT2H4M1.000S
P0YiM1DT2H4M1.000S
P0Y0M.3DT0H0M1.000S
3h
PT100,000H
Yêu cầu đối với các điểm đánh dấu SCTE-35 đầu vào
DAI Google thực hiện các xác thực sau trên các điểm đánh dấu SCTE-35 đầu vào:
- Xác thực điểm nối
- Splice_insert validations
- Xác thực time_signal
- Xác thực thời gian trình bày
- Giai đoạn, sự kiện thông báo điểm bắt đầu quảng cáo và điểm kết thúc quảng cáo
Xác thực điểm nối
DAI Google chỉ nhận ra điểm nối khi các điểm đánh dấu SCTE-35 được mang trong các phần tử Event
DASH MPD nếu các điểm này vượt qua các quá trình xác thực sau:
- Dữ liệu SCTE-35 được mã hoá Base64 phải được chứa trong phần tử
Binary
của phần tửSignal
của sự kiện- Có hỗ trợ
Splice_insert
- Hỗ trợ
Time_signal
có lệnhsegmentation_descriptor
- Có hỗ trợ
- Các phần tử
EventStream
chứa các sự kiện có điểm đánh dấu SCTE-35 phải đặtschemeIdUri
thànhurn:scte:scte35:2014:xml+bin
- Bạn phải đặt vùng chứa tên
Signal
thànhhttp://www.scte.org/schemas/35/2016
- Đối với điểm bắt đầu quảng cáo, bạn phải đặt
presentationTime
trongEvent
- Đối với điểm kết thúc quảng cáo, bạn phải đặt
presentationTime
trongEvent
và không đặt thời lượng - Các phần tử
Event
trongEventStream
phải được sắp xếp thứ tự theopresentationTime
Trong bối cảnh này, các điểm nối được dùng để chia Period
thành nội dung riêng biệt và ngắt các phần tử Period
dựa trên thời gian trình bày và/hoặc thời lượng của các điểm nối. Các điểm nối này do các phần tử Event
chứa các điểm đánh dấu SCTE-35 cung cấp.
xác thực splice_insert
- Điểm bắt đầu quảng cáo là
splice_insert
cóout_of_network_indicator
được đặt thành1
- Điểm kết thúc quảng cáo là
splice_insert
cóout_of_network_indicator
được đặt thành0
- Điểm kết thúc quảng cáo là không bắt buộc khi và chỉ khi
Event
chứa điểm bắt đầu quảng cáo làsplice_insert
vàduration
có giá trị khác 0- DAI Google diễn giải điểm kết thúc quảng cáo
splice_insert
ngầm định với thời gian trình bày làpresentationTime
+duration
của điểm bắt đầu quảng cáo - Sự kiện điểm kết thúc quảng cáo rõ ràng có thể kết thúc điểm bắt đầu quảng cáo trước khi hết thời lượng. Đây là cách kích hoạt chế độ trả về sớm.
- DAI Google diễn giải điểm kết thúc quảng cáo
xác thực time_signal
- Điểm bắt đầu quảng cáo là một
time_signal
cósegmentation_descriptor
và cósegmentation_type_id
khớp với:- 34 — Bắt đầu chèn quảng cáo
- 48 — Bắt đầu quảng cáo của nhà cung cấp
- 52 — Bắt đầu cơ hội đặt quảng cáo của nhà cung cấp
- Điểm kết thúc quảng cáo là
time_signal
cósegmentation_descriptor
và cósegmentation_type_id
khớp với:- 35 — Kết thúc chèn quảng cáo
- 49 — Kết thúc quảng cáo của nhà cung cấp
- 53 — Kết thúc cơ hội đặt quảng cáo của nhà cung cấp
- Tất cả
segmentation_type_ids
khác không được hỗ trợ Time_signal
không hỗ trợ tính năng tự động trả về từ điểm chèn quảng cáo với điểm kết thúc quảng cáo rõ ràng
Xác thực thời gian trình bày
DAI Google không hỗ trợ chia tách các phân đoạn nên chỉ cho phép sai số 100 mili giây đối với cách tính thời lượng trình bày tối đa của điểm nối tính từ ranh giới phân đoạn gần nhất.
-
Thời gian trình bày của một điểm nối có liên quan đến
availabilityStartTime
củaMPD
bằng cách thêmpresentationTime
củaEvent
được điều chỉnh theotimescale
củaEventStream
đếnstart
củaPeriod
.Bạn có thể tính thời gian trình bày của điểm bắt đầu quảng cáo ngầm định bằng cách cộng thời lượng với thời gian trình bày của điểm bắt đầu quảng cáo có liên quan. Thời lượng của một điểm nối được tính toán bằng
duration
củaEvent
/timescale
củaEventStream
.Trong trường hợp này, thời gian và thời lượng PTS được cung cấp trong tín hiệu SCTE-35 không được dùng để tính thời gian hoặc thời lượng trình bày.
- Điểm bắt đầu quảng cáo không được ở cùng ranh giới
Segment
như điểm bắt đầu quảng cáo khác hoặc điểm kết thúc quảng cáo - Một hoặc nhiều điểm kết thúc quảng cáo có thể ở cùng một ranh giới của
Segment
(ví dụ: điểm chèn sớm được kích hoạt cùng lúc với thời điểm thực tế của điểm chèn). Điểm kết thúc quảng cáo trùng lặp trên thực tế sẽ bị bỏ qua.
Giai đoạn, sự kiện thông báo điểm bắt đầu quảng cáo và điểm kết thúc quảng cáo
Period
mới sẽ được chèn cả ở thời điểm bắt đầu và kết thúc sự kiện điểm bắt đầu quảng cáo (hoặc bắt đầu sự kiện điểm bắt đầu quảng cáo và điểm kết thúc quảng cáo) khi tạo bản trình bày nhiều giai đoạn của tệp kê khai một giai đoạn.
- Thời điểm bắt đầu của
Period
mới đầu tiên được biểu thị bằng thời gian trình bày của điểm bắt đầu quảng cáo và thời điểm bắt đầu củaPeriod
mới thứ hai là tổng củapresentationTime
vàduration
của điểm bắt đầu quảng cáo hoặcpresentationTime
của điểm kết thúc quảng cáo, nếu được cung cấp.- Nếu điểm kết thúc quảng cáo được cung cấp cho điểm bắt đầu quảng cáo có
duration
, thìPeriod
sẽ được chia tách theo điểm nối trước đó
- Nếu điểm kết thúc quảng cáo được cung cấp cho điểm bắt đầu quảng cáo có
- DAI Google bỏ qua các trường
splice_time
,break_duration
,auto_return
vàsplice_immediate_flag
trong thông báo SCTE-35
Phải có một Event
báo hiệu thông báo điểm bắt đầu quảng cáo trong suốt thời lượng chèn quảng cáo.
Điều này không có nghĩa là Event
đầu tiên trong EventStream
luôn là một thông báo điểm bắt đầu quảng cáo. Khi có phần ghi bằng DVR đầu vào đủ lâu, có thể có những sự kiện thuộc về những điểm chèn trước đó trong phần này.
Thông báo điểm bắt đầu quảng cáo sẽ kết thúc bằng thông báo điểm kết thúc quảng cáo tiếp theo.
- Mã nối SCTE-35 (
splice_event_id
hoặcsegmentation_event_id
) và thuộc tínhid
của sự kiện bị bỏ qua - Thông báo điểm bắt đầu quảng cáo
splice_insert
dự kiến chỉ kết thúc bằng một thông báo điểm kết thúc quảng cáosplice_insert
, nếuauto_return
không được đặt - Thông báo điểm bắt đầu quảng cáo
time_signal
dự kiến chỉ kết thúc bằng một thông báo điểm kết thúc quảng cáotime_signal
có cùngsegmentation_type_id
Period
mới).Ví dụ:
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin" timescale="600" presentationTimeOffset="991724821200">
<Event presentationTime="992568282204" duration="18073" id="1615447966">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAbAAAAAAAAAP/wCgUAAAAAf98AAAAAAAAHeq0Q</Binary>
</Signal>
</Event>
<Event presentationTime="992568300277" id="1085695472">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAbAAAAAAAAAP/wCgUAAAAAf18AAAAAAAAqqkN1</Binary>
</Signal>
</Event>
</EventStream>
Nền tảng, trình đóng gói và trình phát được hỗ trợ
Nền tảng |
||
---|---|---|
Thiết bị/trình duyệt |
Phiên bản |
DRM |
Trình duyệt Chrome |
66 trở lên |
Widevine |
Trình duyệt Firefox |
60 trở lên |
Widevine |
Microsoft Edge |
18 |
PlayReady |
Android |
4.4 trở lên |
Widevine |
Chromecast |
Gen2, Ultra (CAF API) |
Widevine |
Roku |
3, 4 (chương trình cơ sở 8.1) |
PlayReady |
Trình tạo gói |
||
---|---|---|
2.1.0 |
Hỗ trợ nhiều giai đoạn |
|
1.47.3 |
Hỗ trợ nhiều giai đoạn |
|
1.11.17 | Hỗ trợ một giai đoạn |
Trình phát |
||
---|---|---|
Shaka |
Nên dùng để kiểm tra |
|
Bitmovin |
||
Exo-Player |
||
Dash.js |
Phụ lục
Nếu bạn đang sử dụng tệp kê khai một giai đoạn, những ví dụ này minh hoạ cách DAI chuyển đổi tệp kê khai một giai đoạn thành tệp kê khai nhiều giai đoạn.
Ví dụ về nhập tệp kê khai một giai đoạn
<?xml version="1.0" encoding="UTF-8"?>
<MPD availabilityStartTime="2017-01-01T10:00:00Z" id="id1" maxSegmentDuration="PT2S" minBufferTime="PT2S" minimumUpdatePeriod="PT25S" profiles="urn:mpeg:dash:profile:isoff-live:2011" publishTime="2017-01-01T10:00:00Z" timeShiftBufferDepth="PT5M" type="dynamic" ns1:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance">
<BaseURL>http://example.com/dash/</BaseURL>
<Period id="1" start="PT0S">
<EventStream timescale="90000" schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2700000" presentationTime="270000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAlAAAAAAAAAP/wFAUAAA+if+/+INAJ0P4AKTLgAAAAAAAA9UTkTA==</Binary>
</Signal>
</Event>
<Event presentationTime="2970000" id="2">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAgAAAAAAAAAP/wDwUAAA+if0/+IPk8sAAAAAAAAH3XbUE=</Binary>
</Signal>
</Event>
</EventStream>
<AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
<SegmentTemplate timescale="44100" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/$Number$.m4s">
<SegmentTimeline>
<S t="0" d="132300" r="20" />
</SegmentTimeline>
</SegmentTemplate>
<Representation audioSamplingRate="48000" bandwidth="48000" codecs="mp4a.40.2" id="A48">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
</Representation>
</AdaptationSet>
<AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640" mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true" startWithSAP="1">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
<SegmentTemplate timescale="90000" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/$Number$.m4s">
<SegmentTimeline>
<S t="0" d="270000" r="20" />
</SegmentTimeline>
</SegmentTemplate>
<Representation bandwidth="300000" codecs="avc1.64001e" frameRate="60/2" height="360" id="V300" sar="1:1" width="640" />
</AdaptationSet>
</Period>
</MPD>
Ví dụ về kết quả tệp kê khai nhiều giai đoạn
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:XMLSchema-instance="http://www.w3.org/2001/XMLSchema-instance" XMLSchema-instance:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" id="id1" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="dynamic" availabilityStartTime="2017-01-01T10:00:00Z" publishTime="2017-01-01T10:00:00Z" minimumUpdatePeriod="PT25S" minBufferTime="PT2S" timeShiftBufferDepth="PT5M0S" maxSegmentDuration="PT2S">
<BaseURL>http://example.com/dash/</BaseURL>
<Period id="0s" start="PT0S">
<AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="eng" contentType="audio" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="44100" presentationTimeOffset="0" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S d="132300"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="A48" bandwidth="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="video/mp4" startWithSAP="1" contentType="video" par="16:9" minWidth="640" maxWidth="640" minHeight="360" maxHeight="360" maxFrameRate="60/2" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="90000" presentationTimeOffset="0" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S d="270000"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation width="640" height="360" sar="1:1" frameRate="60/2" codecs="avc1.64001e" id="V300" bandwidth="300000"></Representation>
</AdaptationSet>
</Period>
<Period id="3s" start="PT3S">
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin" timescale="90000">
<Event duration="2700000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAlAAAAAAAAAP/wFAUAAA+if+/+INAJ0P4AKTLgAAAAAAAA9UTkTA==</Binary>
</Signal>
</Event>
</EventStream>
<AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="eng" contentType="audio" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="44100" presentationTimeOffset="132300" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S t="132300" d="132300" r="9"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="A48" bandwidth="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="video/mp4" startWithSAP="1" contentType="video" par="16:9" minWidth="640" maxWidth="640" minHeight="360" maxHeight="360" maxFrameRate="60/2" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="90000" presentationTimeOffset="270000" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S t="270000" d="270000" r="9"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation width="640" height="360" sar="1:1" frameRate="60/2" codecs="avc1.64001e" id="V300" bandwidth="300000"></Representation>
</AdaptationSet>
</Period>
<Period id="33s" start="PT33S">
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin" timescale="90000">
<Event id="2">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAgAAAAAAAAAP/wDwUAAA+if0/+IPk8sAAAAAAAAH3XbUE=</Binary>
</Signal>
</Event>
</EventStream>
<AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="eng" contentType="audio" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="44100" presentationTimeOffset="1455300" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S t="1455300" d="132300" r="9"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="A48" bandwidth="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="video/mp4" startWithSAP="1" contentType="video" par="16:9" minWidth="640" maxWidth="640" minHeight="360" maxHeight="360" maxFrameRate="60/2" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="90000" presentationTimeOffset="2970000" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S t="2970000" d="270000" r="9"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation width="640" height="360" sar="1:1" frameRate="60/2" codecs="avc1.64001e" id="V300" bandwidth="300000"></Representation>
</AdaptationSet>
</Period>
</MPD>