duration Attribute in the
SegmentTemplate
In a default DASH manifest, SegmentTemplate holds a
SegmentTimeline. The timeline describes all the segments in
Representation, including their duration and their start time. With
live events, AWS Elemental MediaPackage adds segments to the timeline as it receives them from
your encoder. To be aware of newly available segments, the playback device must
regularly request an updated manifest from MediaPackage.
If all the segments in a representation have the same duration, you can help to reduce
latency and shorten the manifest by enabling MediaPackage to remove the
SegmentTimeline objects. In their place, MediaPackage adds a
duration attribute to the SegmentTemplate properties. The
playback device calculates when segments are available by using duration
and startNumber. Because the playback device doesn't have to rely on an
updated manifest to know about segments, it doesn't have to constantly request updates
to maintain playback. For information about how the duration attribute
works, see the following sections.
How the duration attribute
works
Enable the $duration$ attribute through the Segment
template format setting on the DASH endpoint, as described in Creating a DASH endpoint. This is what happens
with the manifest:
-
When AWS Elemental MediaPackage generates the DASH manifest, it adds the
durationattribute to theSegmentTemplateobject, as shown in the following example:<SegmentTemplate timescale="30000" media="index_video_1_0_$Number$.mp4?m=1535562908" initialization="index_video_1_0_init.mp4?m=1535562908" startNumber="175032" duration="90000" presentationTimeOffset="62061"/>A segment timeline and individual segment descriptions are not included in the segment template.
Important
Except for the final segment, segments must be no more than 50% deviation from the value of the duration. With a 90000 duration, segments must be between 45000 and 135000 (1.5 to 4.5 seconds with a 30000 timescale).
The following is an example of an adaptation set that uses the
durationin the segment template:<AdaptationSet mimeType="video/mp4" segmentAlignment="true" subsegmentAlignment="true" startWithSAP="1" subsegmentStartsWithSAP="1" bitstreamSwitching="true"> <Representation id="1" width="852" height="480" frameRate="30/1" bandwidth="1200000" codecs="avc1.4D401F"> <SegmentTemplate timescale="30000" media="index_video_1_0_$Number$.mp4?m=1535562908" initialization="index_video_1_0_init.mp4?m=1535562908" startNumber="175032" duration="90000" presentationTimeOffset="62061"/> </Representation> <Representation id="2" width="640" height="360" frameRate="30/1" bandwidth="800000" codecs="avc1.4D401E"> <SegmentTemplate timescale="30000" media="index_video_3_0_$Number$.mp4?m=1535562908" initialization="index_video_3_0_init.mp4?m=1535562908" startNumber="175032" duration="90000" presentationTimeOffset="62061"/> </Representation> <Representation id="3" width="320" height="240" frameRate="30/1" bandwidth="499968" codecs="avc1.4D400D"> <SegmentTemplate timescale="30000" media="index_video_5_0_$Number$.mp4?m=1535562908" initialization="index_video_5_0_init.mp4?m=1535562908" startNumber="175032" duration="90000" presentationTimeOffset="62061"/> </Representation> </AdaptationSet> -
The playback device requests segments using the URL that's defined in the
mediaattribute. In the URL, it replaces the$Number$variable with the number of the segment, starting with the value of thestartNumberin theSegmentTemplatefor the first segment. -
If your playback device needs to determine the most recent segment, it uses this formula:
((wall clock time -
availabilityStartTime) / (duration/timescale)) +startNumberA playback device is calculating the most recent segment with the following values:
-
Wall clock time from the playback device: 2018-11-16T19:18:30Z
-
availabilityStartTime- Attribute from theMPDobject of the manifest: 2018-11-16T19:08:30Z -
duration- Attribute from theSegmentTemplateobject of the manifest: 90000 -
timescale- Attribute from theSegmentTemplate: 30000 -
startNumber- Attribute from theSegmentTemplate: 175032
The calculation it uses is ((2018-11-16T19:18:30Z - 2018-11-16T19:08:30Z) / (90000/30000)) + 175032
This calculation then becomes (600 seconds elapsed time) / (3 second segment durations) = 200 elapsed segments. Adding those segments to the 175032 start segment makes the most recent segment 175232.
-
duration Attribute
limitations
To ensure proper playback and help prevent issues with conflicting segment
durations, AWS Elemental MediaPackage enforces the following limitations for the
duration attribute:
-
You can enable the feature only when you create the endpoint.
You can't modify the endpoint to later add the
durationattribute to your DASH manifests. This includes changing from one segment template format to one that usesduration. For example, you can't create an endpoint that uses the$Time$variable withSegmentTimeline, and then edit the endpoint to use the$Number$variable withduration. -
You must keep the segment duration value that you set when you create the endpoint.
You can't edit the endpoint to modify the segment duration.
-
You must produce single period DASH manifests from endpoints that use
duration.You can't use multi-period DASH with the
durationattribute. -
Your ingest stream must use a regular segmentation cadence.
-
You can't use variable segment length in the ingest stream. For example, resulting of a SCTE-35-related segmentation.
duration Attribute with compacted
DASH manifests
Combining compacted manifests with the duration attribute will
further reduce the size of the manifest, but not by much. Compacted manifests have
one SegmentTemplate and SegmentTimeline per adaptation
set. When you use the duration attribute, AWS Elemental MediaPackage removes the
segment timeline. With both treatments, the manifest has one
SegmentTemplate per adaptation set, and no
SegmentTimeline. See the following examples.
For more information about compacted manifests, see Compacted DASH manifests.
Important
If the segments in a representation intentionally have varying sizes of
segments, don't use the duration attribute. This treatment works
only when the segments are a consistent size.
- The following is an example of a compacted manifest:
-
<AdaptationSet mimeType="video/mp4" segmentAlignment="true" subsegmentAlignment="true" startWithSAP="1" subsegmentStartsWithSAP="1" bitstreamSwitching="true"> <SegmentTemplate timescale="30000" media="index_video_$RepresentationID$_0_$Number$.mp4?m=1543947824" initialization="index_video_$RepresentationID$_0_init.mp4?m=1543947824" startNumber="1"> <SegmentTimeline> <S t="62000" d="60000" r="9"/> </SegmentTimeline> </SegmentTemplate> <Representation id="1" width="640" height="360" frameRate="30/1" bandwidth="749952" codecs="avc1.640029"/> <Representation id="2" width="854" height="480" frameRate="30/1" bandwidth="1000000" codecs="avc1.640029"/> <Representation id="3" width="1280" height="720" frameRate="30/1" bandwidth="2499968" codecs="avc1.640029"/> </AdaptationSet> - The following is an example of a compacted manifest with the
durationattribute: -
<AdaptationSet mimeType="video/mp4" segmentAlignment="true" subsegmentAlignment="true" startWithSAP="1" subsegmentStartsWithSAP="1" bitstreamSwitching="true"> <SegmentTemplate timescale="30000" media="index_video_$RepresentationID$_0_$Number$.mp4?m=1543947824" initialization="index_video_$RepresentationID$_0_init.mp4?m=1543947824" startNumber="1" duration="60000"/> <Representation id="1" width="640" height="360" frameRate="30/1" bandwidth="749952" codecs="avc1.640029"/> <Representation id="2" width="854" height="480" frameRate="30/1" bandwidth="1000000" codecs="avc1.640029"/> <Representation id="3" width="1280" height="720" frameRate="30/1" bandwidth="2499968" codecs="avc1.640029"/> </AdaptationSet>