Jump to: Manifest & content requirements | Packages, platforms, and players
Multi-period versus single-period manifests
Ad Manager supports ingesting both multi-period manifests and single-period manifests for DASH.
With single period manifests, publishers provide a DASH stream with a single period that contains all content and ad break opportunities, rather than multiple periods differentiating them. DAI supports single-period manifests by converting them to multi-period on every fetch.
You can select whether the manifest is provided as a single or multi-period when you set up a live stream in Google Ad Manager and select "DASH" as the streaming format.
Use this guide to see the expectations for multi-period manifests and single-period manifests. Additionally, if you are using a single-period manifest, the appendix demonstrates how DAI converts a single-period manifest to a multi-period manifest.
Manifest and content requirements
For multi-period manifestsExpectations for a multi-period MPEignoredDASH manifest
Google DAI performs the following validations on the raw MPD:
- MPD element validations
- Period element validations
- AdaptationSet element validations
- Representation element validations
- SegmentTemplate with time validations
- Time component validations
MPD element validations
Type
is set todynamic
Profile
is set tourn:mpeg:dash:profile:isoff-live:2011
availabilityStartTime
must be non-zero and its value must not change between successive polls of the MPDPublishTime
must be non-zero and its value should either increment or remain the same between successive polls. However, thepublishTime
attribute should be set to the current time at each update.- HTTPS must be used for the entirety of the DASH content referenced in the same MPD
Example
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
xmlns:xsi="http://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>
Period element validations
-
Start
must be greater than or equal to zeroThis allows for support of ISO-8601 durations that may optionally include an integer day field. For example,P3DT3H1M30S
would represent 3 days, 3 hours, 1 minute, and 30 seconds.The ISO-8601 Year, Month, and Week duration designators are currently not supported.
Period
has at least oneAdaptationSet
element- Audio and video adaption sets have to be consistent across periods
- Addressing schemes are restricted to templates with number and time-based addressing
Example
<Period start="PT0S">
<AdaptationSet …>
…
</AdaptationSet>
<AdaptationSet …>
…
</AdaptationSet>
</Period>
Between successive polls of the MPD:
Period
elements can only be removed from the top of the MPDPeriod
elements can only be appended to the bottom of the MPD- Only the first and last periods in the MPD can be updated. No other periods in the MPD should be modified. Updates should only be for:
- Removing segments or events from the top of the first period
- Adding new segments or events to the bottom of the last period
AdaptationSet element validations
AdaptationSet
has at least oneRepresentation
element- If present,
ContentProtection
elements in anAdaptationSet
and sub-elements must not change between successive polls of the MPD
Example
<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>
Representation element validations
Id
must be non-empty- There must be no
SegmentBase
orSegmentList
elements
Example
<Representation width="640" height="360" sar="1:1" frameRate="60/2"
codecs="avc1.64001e" id="V300" bandwidth="300000">
…
</Representation>
SegmentTemplate with time validations
SegmentTimeline
S
elements may contain thet
attribute–used for media URLs- If not provided, the value is assumed to be
0
for the firstS
element and for subsequentS
elements, the value is assumed to be the sum of the previousS
element's earliest presentation time and contiguous duration—the value of [t
+d
× (r
+ 1) ] of the previousS
element). $Time$
and$Number$
are both supported for multi-period manifestsS
tartNumber
of theSegmentTemplate
is not used
- If not provided, the value is assumed to be
- Between successive polls of the MPD:
- Segments can only be removed from the top of the
SegmentTimeline
when they move out of the DVR window snapshots - Segments can only be appended to the bottom of the
SegmentTimeline
- Segments can only be removed from the top of the
Example
<SegmentTemplate timescale="90000" initialization="$RepresentationID$/init.mp4"
media="$RepresentationID$/$Time$.m4s">
<SegmentTimeline>
<S t="0" d="270000" r="20" />
</SegmentTimeline>
</SegmentTimeline>
Time component validations
Google DAI supports the time component part of the ISO-8601 duration and supports the optional integer day component: P0Y0M[n]DT[n]H[n]M[n]S. The days component is converted to a duration by considering 1 day = 24 hours and is added to the time component. Nanosecond is the lowest granularity that is recognized.
Valid time format examples
P0Y0M
P0Y0M2D
P2D
PT3H
PT0H3M
P0Y0M0DT0H0M1.000S
P0Y0M1DT2H4M10S
PT0.000000001S
Invalid time format examples
P
PT
2007-03-01
P5Y0M1DT2H4M1.000S
P0Y1.5M1DT2H4M1.000S
P0YiM1DT2H4M1.000S
P0Y0M.3DT0H0M1.000S
3h
PT100,000H
Expectations for cue-out and cue-in message events
Google DAI performs the following validations on cue-out and cue-in message events. The content should be preconditioned based on the following:
- Media presentation must be broken into multiple periods with each mid-roll
CUE-OUT
andCUE-IN
falling on a period boundary. - Content segments at the beginning and end of each period must be prepared so that every frame in the segment is included in the period.
- A keyframe/IDR frame should follow a cue point and must be at the beginning of the period. This may require ending periods with a short segment when the cue point does not fall on a natural boundary.
Ad break signaling
- All content related to a single ad break, must be included in one or more consecutive periods. Those periods must only contain the content segments to be replaced.
-
Ad break
CUE-OUT
indicators should be signaled in the MPD manifest as shown in one of the following examples:Example 1
- SCTE-35
EventStream
elements SchemeIdUri="urn:scte:scte35:2014:xml+bin"
- Defined in the DASH standard.
<MPD>
<Period start="PT0S" id="1">
<!-- Content Period -->
...
</Period>
<Period start="PT32S" id="2">
<!-- Ad Break Period -->
<!-- The first segment of this period is the start of the ad break
and the ad break ends with the last segment -->
<EventStream timescale="90000"
schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<!-- The duration specified in this event should match the actual
duration of the period as close as possible -->
<Signal xmlns="http://scte.org/schemas/35/2016"
<Binary>
/DAlAAAAAAAAAP/wFAUAAAAEf+/+kybGyP4BSvaQAAEBAQAArky/3g==
<Binary>
</Signal>
</Event>
</EventStream>
</Period>
<Period start="PT60S" id="3">
<!-- Content Period -->
...
</Period>
</MPD>
Example 2
- SCTE-35
EventStream
elements SchemeIdUri="urn:scte:scte35:2013:xml"
- Defined in the DASH standard.
<MPD>
<Period start="PT0S" id="1">
<!-- Content Period -->
...
</Period>
<Period start="PT32S" id="2">
<!-- Ad Break Period -->
<!-- The first segment of this period is the start of the ad break
and the ad break ends with the last segment -->
<EventStream timescale="90000"
schemeIdUri="urn:scte:scte35:2013:xml">
<Event duration="2520000" id="1">
<!-- The duration specified in this event should match the actual
duration of the period as close as possible -->
<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">
<!-- Content Period -->
...
</Period>
</MPD>
- SCTE-35
- The duration of the ad break specified in the
CUE-OUT
event should be equal to the total duration of all the segments in the ad break periods.
Supported ad markers
In DASH, CUE markups are accompanied by XML Period
element boundaries. CUE markups are provided as Event
elements within EventStream
elements inside a Period
. This additional boundary sufficiently functions to identify the markup. Additionally, since ad breaks are marked by Period
boundaries, an explicit CUE-IN marker is not required.
This example shows an XML-based SCTE35 markup for DASH. This is similar to SCTE35 Binary Splice Insert, except that the data is parsed and presented as XML instead of binary.
Example
<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>
In DASH, CUE markups are accompanied by XML Period
element boundaries. CUE markups are provided as Event
elements within EventStream
elements inside a Period
. This additional boundary sufficiently functions to identify the markup. Additionally, since ad breaks are marked by Period
boundaries, an explicit CUE-IN marker is not required.
This example shows an XML-based SCTE35 markup for DASH. This is similar to SCTE35 Binary Time Signal
, except that the data is parsed and presented as XML instead of binary.
Example
<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
indicates the type of time signal.
The following SegmentationTypeId
value is recognized as a valid CUE-OUT time signal:
34
: Break Start
48
: Provider Advertisement Start
52
: Provider Placement Opportunity Start
The following SegmentationTypeId
value is recognized as a valid CUE-IN time signal:
35
: Break End
49
: Provider Advertisement End
53
: Provider Placement Opportunity End
In DASH, CUE markups are accompanied by XML Period
element boundaries. CUE markups are provided as Event
elements within EventStream
elements inside a Period
. This additional boundary sufficiently functions to identify the markup. Additionally, since ad breaks are marked by Period
boundaries, an explicit CUE-IN marker is not required.
This example shows a binary SCTE35 markup for DASH.
Example
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://scte.org/schemas/35/2016">
<Binary>
/DAlAAAAAAAAAP/wFAUAAAAEf+/+kybGyP4BSvaQAAEBAQAArky/3g==
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
SCTE-35 binary (base64 encoded) data has to be decoded and parsed in order to determine if it contains valid CUE-OUT/CUE-IN, along with any break targeting information.
For example, the following binary data contains a valid CUE-OUT signal:
Example
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://scte.org/schemas/35/2016">
<Binary>
/DAsAAAAAyiYAP/wBQb/PVbrDQAWAhRDVUVJB48zWH//AAEuGvsAACIAAdRJqiI=
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
Once decoded, the message contains the following fields:
Splice_command_type
set to a value of 6 indicates this is a time signalSegmentation_type_id
indicates the type of time signal
The following segmentation_type_id
value is recognized as a valid CUE-OUT time signal:
34
: Break Start
The following segmentation_type_id
value (when splice_command_type = 6
) is recognized as a valid CUE-IN time signal:
35
: Break End
SCTE-35 binary (base64 encoded) data has to be decoded and parsed in order to determine if it contains valid CUE-OUT/CUE-IN, along with any break targeting information.
For example, the following binary data contains a valid CUE-OUT signal:
Example
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://scte.org/schemas/35/2016">
<Binary>
/DBcAAAAAAAAAP/wBQb//ciI8QBGAh1DVUVJXQk9EX+fAQ5FUDAxODAzODQwMDY2NiEEZAIZQ1VFSV0JPRF/3wABLit7AQVDMTQ2NDABAQEKQ1VFSQCAMTUwKnPhdcU=
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
Once decoded, the message contains the following fields:
Splice_command_type
set to a value of 6 indicates this is a time signalSegmentation_type_id
indicates the type of time signal
The following segmentation_type_id
value is recognized as a valid CUE-OUT time signal:
48
: Provider Advertisement Start
The following segmentation_type_id
value (when splice_command_type = 6
) is recognized as a valid CUE-IN time signal:
49
: Provider Advertisement End
SCTE-35 binary (base64 encoded) data has to be decoded and parsed in order to determine if it contains valid CUE-OUT/CUE-IN, along with any break targeting information.
For example, the following binary data contains a valid CUE-OUT signal:
Example
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://scte.org/schemas/35/2016">
<Binary>
/DA0AAAAAAAA///wBQb+cr0AUAAeAhxDVUVJSAAAjn/PAAGlmbAICAAAAAAsoKGKNAIAmsnRfg==
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
Once decoded, the message contains the following fields:
Splice_command_type
set to a value of 6 indicates this is a time signalSegmentation_type_id
indicates the type of time signal
The following segmentation_type_id
value is recognized as a valid CUE-OUT time signal:
52
: Provider Placement Opportunity Start
The following segmentation_type_id
value (when splice_command_type = 6
) is recognized as a valid CUE-IN time signal:
53
: Provider Placement Opportunity End
Macros for SCTE-35 markup
If your feed includes EXT-OATCLS-SCTE35
, or EXT-X-DATERANGE
markup, the metadata is automatically extracted and made available through custom key-values. You need to set up the custom key-values, and insert them as macros when you generate ad tags.
When you set up the new custom key-values for the SCTE-35 fields, use a custom key (for example, "scte35") and set the value to the macro(s) that correspond to which type of field is available in your feed:
Macro | Description |
---|---|
%%SPLICE_INSERT_EVENT_ID%% |
Unsigned integers in the SCTE35 message, are converted to strings as decimal numbers. |
%%SPLICE_INSERT_UPID%% |
|
%%TIME_SIGNAL_EVENT_ID%% |
|
%%TIME_SIGNAL_UPID%% |
Rendered as lowercase hexadecimal, with no 0x prefix. |
%%TIME_SIGNAL_UPID_RAW%% |
Inserts raw bytes from the SCTE message without hexadecimal conversion (the initial string must be a valid UTF-8 encoded string). |
%%AFMM_CBC%% |
Extracts the commercial break code from the splice info (this is a requirement for the French AF2M specification). |
Expectations for a single-period MPEignoredDASH manifest
Google DAI performs the following validations on the raw MPD:
- MPD element validations
- Period element validations
- EventStream element validations
- AdaptationSet element validations
- Representation element validations
- SegmentTemplate with time validations
- Time component validations
MPD element validations
Type
is set todynamic
Profiles
is set tourn:mpeg:dash:profile:isoff-live:2011
AvailabilityStartTime
must be non-zero and its value must not change between successive polls of the MPDPublishTime
must be non-zero and its value should either increment or remain the same between successive polls- MPD has exactly one
Period
element - HTTPS must be used for the entirety of the DASH content referenced in the same MPD
Example
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
xmlns:xsi="http://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>
Period element validations
Start
must be greater than or equal to zeroPeriod
has at least oneAdaptationSet
element
Example
<Period start="PT0S">
<AdaptationSet …>
…
</AdaptationSet>
<AdaptationSet …>
…
</AdaptationSet>
</Period>
EventStream element validations
Between successive polls of the MPD:
Event
elements can only be removed from the top of anEventStream
Event
elements can only be appended to the bottom of anEventStream
AdaptationSet element validations
AdaptationSet
has at least oneRepresentation
element- If present,
ContentProtection
elements in anAdaptationSet
and sub-elements must not change between successive polls of the MPD
Example
<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>
Representation element validations
Id
must be non-empty- There must be no
SegmentBase
orSegmentList
elements
Example
<Representation width="640" height="360" sar="1:1" frameRate="60/2"
codecs="avc1.64001e" id="V300" bandwidth="300000">
…
</Representation>
SegmentTemplate with $Time$ validations
SegmentTimeline
S
elements may contain thet
attribute–used for media URLs- If not provided, the value is assumed to be
0
for the firstS
element and for subsequentS
elements, the value is assumed to be the sum of the previousS
element's earliest presentation time and contiguous duration—the value of [t
+d
× (r
+ 1) ] of the previousS
element). $Time$
is supported for single-period manifests;$Number$
is not yet supportedS
tartNumber
of theSegmentTemplate
is not used
- If not provided, the value is assumed to be
- Between successive polls of the MPD:
- Segments can only be removed from the top of the
SegmentTimeline
when they move out of the DVR window snapshots - Segments can only be appended to the bottom of the
SegmentTimeline
- Segments can only be removed from the top of the
Example
<SegmentTemplate timescale="90000" initialization="$RepresentationID$/init.mp4"
media="$RepresentationID$/$Time$.m4s">
<SegmentTimeline>
<S t="0" d="270000" r="20" />
</SegmentTimeline>
</SegmentTimeline>
Time component validations
Google DAI supports the time component part of the ISO-8601 duration and supports the optional integer day component: P0Y0M[n]DT[n]H[n]M[n]S. The days component is converted to a duration by considering 1 day = 24 hours and is added to the time component. Nanosecond is the lowest granularity that is recognized.
Valid time format examples
P0Y0M
P0Y0M2D
P2D
PT3H
PT0H3M
P0Y0M0DT0H0M1.000S
P0Y0M1DT2H4M10S
PT0.000000001S
Invalid time format examples
P
PT
2007-03-01
P5Y0M1DT2H4M1.000S
P0Y1.5M1DT2H4M1.000S
P0YiM1DT2H4M1.000S
P0Y0M.3DT0H0M1.000S
3h
PT100,000H
Expectations for the input SCTE-35 markers
Google DAI performs the following validations on input SCTE-35 markers:
- Splice point validations
- Splice_insert validations
- Time_signal validations
- Presentation time validations
- Periods, cue-out and cue-in message events
Splice point validations
Google DAI only recognizes splice points as SCTE-35 markers carried in DASH MPD Event
elements if they pass the following validations:
- Base64 encoded SCTE-35 data must be contained in the
Binary
element of an event'sSignal
elementSplice_insert
is supportedTime_signal
withsegmentation_descriptor
commands are supported
EventStream
elements containing events with SCTE-35 markers must haveschemeIdUri
set tourn:scte:scte35:2014:xml+bin
- The
Signal
namespace must be set tohttp://scte.org/schemas/35/2016
- For cue-outs, the
presentationTime
in theEvent
must be set - For cue-ins, the
presentationTime
in theEvent
must be set and duration must not be set Event
elements in theEventStream
must be in sorted order by thepresentationTime
In this context, the splice points are used to split the Period
into separate content and break Period
elements based on the presentation times and/or durations of the splice points. These splice points are provided by Event
elements with SCTE-35 markers.
splice_insert validations
- A cue-out is a
splice_insert
without_of_network_indicator
set to1
- A cue-in is a
splice_insert
without_of_network_indicator
set to0
- Cue-ins are optional if and only if the
Event
containing the cue-out is asplice_insert
and has a non-zero value set forduration
- Google DAI interprets an implicit
splice_insert
cue-in with a presentation time of the cue-out'spresentationTime
+duration
- An explicit cue-in event can end a cue-out before the end of its duration. This is how an early return can be triggered.
- Google DAI interprets an implicit
time_signal validations
- A cue-out is a
time_signal
withsegmentation_descriptor
withsegmentation_type_id
matching:- 34 - Break Start
- 48 - Provider Advertisement Start
- 52 - Provider Placement Opportunity Start
- A cue-in is a
time_signal
withsegmentation_descriptor
withsegmentation_type_id
matching:- 35 - Break End
- 49 - Provider Advertisement End
- 53 - Provider Placement Opportunity End
- All other
segmentation_type_ids
are not supported Time_signal
does not support automatically returning from an ad break with an explicit cue-in
Presentation time validations
Google DAI does not support splitting segments and therefore only allows a 100ms tolerance for how far a splice point's presentation time can be from the closest segment boundary.
-
A splice point's presentation time is relative to the
availabilityStartTime
of theMPD
by adding thepresentationTime
of theEvent
adjusted by thetimescale
of theEventStream
to thestart
of thePeriod
.An implicit cue-in's presentation time can be calculated by adding the duration to the associated cue-out's presentation time. A splice point's duration is calculated with the
duration
of theEvent
/timescale
of theEventStream
.In this context, the PTS time and durations provided in the SCTE-35 signal are not used to calculate the presentation time or duration.
- A cue-out must not be at the same
Segment
boundary as another cue-out or cue-in - One or more cue-ins may be at the same
Segment
boundary (for example, an early break is triggered at the same time as the breaks' actual end). The duplicate cue-in is effectively ignored.
Periods, cue-out and cue-in message events
New Periods
will be inserted both at the time of the start and end of the cue-out event (or start of the cue-out and cue-in events) when creating a multi-period presentation of the single-period manifest.
- The start of the first new
Period
is represented by presentation time of the cue-out and the start of the second newPeriod
is the sum ofpresentationTime
andduration
of the cue-out or thepresentationTime
of the cue-in, if provided.- If a cue-in is provided for a cue-out that has a
duration
, thePeriod
will be split using the earlier splice point
- If a cue-in is provided for a cue-out that has a
- Google DAI ignores the
splice_time
,break_duration
,auto_return
, andsplice_immediate_flag
fields in the SCTE-35 messages
An Event
signaling a cue-out message must be present for the complete break duration.
This doesn't mean that the first Event
in the EventStream
is always a cue-out message. With a sufficiently long input DVR window, there may be events belonging to previous breaks in the window.
A cue-out message is ended by the next cue-in message.
- SCTE-35 splice ID (
splice_event_id
orsegmentation_event_id
), and the event'sid
attribute are ignored - A
splice_insert
cue-out message is expected to be ended only by asplice_insert
cue-in message, ifauto_return
isn't set - A
time_signal
cue-out message is expected to be ended only by atime_signal
cue-in message with the samesegmentation_type_id
Period
).Example
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin" timescale="600" presentationTimeOffset="991724821200">
<Event presentationTime="992568282204" duration="18073" id="1615447966">
<Signal xmlns="http://scte.org/schemas/35/2016">
<Binary>/DAbAAAAAAAAAP/wCgUAAAAAf98AAAAAAAAHeq0Q</Binary>
</Signal>
</Event>
<Event presentationTime="992568300277" id="1085695472">
<Signal xmlns="http://scte.org/schemas/35/2016">
<Binary>/DAbAAAAAAAAAP/wCgUAAAAAf18AAAAAAAAqqkN1</Binary>
</Signal>
</Event>
</EventStream>
Supported platforms, packagers, and players
Platforms |
||
---|---|---|
Devices/browsers |
Version |
DRM |
Chrome Browser |
66+ |
Widevine |
Firefox Browser |
60+ |
Widevine |
Microsoft Edge |
18 |
PlayReady |
Android |
4.4+ |
Widevine |
Chromecast |
Gen2, Ultra (CAF API) |
Widevine |
Roku |
3, 4 (firmware 8.1) |
PlayReady |
Packagers |
||
---|---|---|
2.1.0 |
Multi-period Support |
|
1.47.3 |
Multi-period Support |
|
1.11.17 | Single-period support |
Players |
||
---|---|---|
Shaka |
Recommended for testing |
|
Bitmovin |
||
Exo-Player |
||
Dash.js |
Appendix
If you are using a single-period manifest, these examples demonstrate how DAI converts a single-period manifest to a multi-period manifest.
Single-period manifest input example
<?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://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://scte.org/schemas/35/2016">
<Binary>/DAlAAAAAAAAAP/wFAUAAA+if+/+INAJ0P4AKTLgAAAAAAAA9UTkTA==</Binary>
</Signal>
</Event>
<Event presentationTime="2970000" id="2">
<Signal xmlns="http://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>
Multi-period manifest output example
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:XMLSchema-instance="http://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://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://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>