HLS
Once you complete your Media Services Live: HLS Ingest setup, you need to configure your encoder to capture and push your stream to the entrypoints.
For a list of third-party live encoders and the latest software versions qualified with Media Services Live HLS ingest, see Qualified Encoders (MSL 3.2 & MSL 4.x).
For previously qualified third-party live encoder software versions, contact your account representative.
Media Services Live: HLS Ingest does not honor the live encoder HTTP DELETE requests. The servers return a 200 HTTP status code, but the content is not actually deleted as requested.
To prevent stream vulnerability to potential network problems, you must actively use both primary and backup streams. This adds redundancy by implementing an automatic failover feature should one stream or the other fail. The easiest way to use primary/backup streams is to set them up in a single encoder. Not all third-party encoders support this, however, and with those it becomes necessary to use separate encoders to stream primary and backup.
While primary/backup streaming is possible with dual encoders, it is not automated and requires certain manual steps to enable it. With typical single encoder primary/backup functionality, the encoder automatically creates a variant playlist that includes all primary and backup bitrates. This ensures that the primary and backup streams are always aware of each other's existence and allows for automatic failover from one to the other. With situations that require dual encoders, this automatic playlist generation does not occur. Here, each encoder creates variant playlists for the primary or backup stream only, requiring manual manipulation to create a merged playlist that includes both primary and backup streams. Refer to Create your Media Services Live streams.
In addition, there might be circumstances where you need dual encoders in two separate geographical locations, with one streaming the primary and the other streaming the backup. In this case, even encoders that support primary/backup from a single encoder will require the dual encoder solution with regard to variant playlist generation.
Publish HLS streams
The encoder publishes primary and backup streams for the HLS protocol according to this URL syntax.
Stream type | Hostname | Path | Example |
---|---|---|---|
Primary | p-ep{stream_id}.i.akamaientrypoint.net | {stream_id}/{event_name} | http://p-ep50002.i.akamaientrypoint.net/50002/test79/master.m3u8 |
Backup | b-ep{stream_id}.i.akamaientrypoint.net | {stream_id}-b/{event_name} | http://b-ep50002.i.akamaientrypoint.net/50002-b/test79/master.m3u8 |
To improve security and reduce potential vulnerabilities, Akamai supports TLS 1.2 and above in accordance with Internet Engineering Task Force recommendations.
The MSL system considers a stream as a combination of stream_id
and event_name
. All ingested content, such as variant playlists, bitrate playlists, and segments, should have a common event_name
in the path.
Play HLS streams
To play HLS streams, construct the URL according to this syntax.
https://amd-property-hostname/hls/live/stream-id/event_name/master.m3u8
The amd-property-hostname
depends on the CDN that you use. For Akamai CDN, the hostname is origin.akamaized.net
, so the playback URL is:
http://origin.akamaized.net/hls/live/50002/test79/master.m3u8
Stream | Path | Example |
---|---|---|
Primary | hls/live/[stream_id]/[event_name]/[filename].m3u8 | http://origin.akamaized.net/hls/live/50002/test79/master.m3u8 |
Backup | hls/live/[stream_id]-b/[event_name]/[filename].m3u8 | http://origin.akamaized.net/hls/live/50002-b/test79/master.m3u8 |
Example .m3u8 file
The playback information is embedded in the variant .m3u8
file. Backup URLs are shown in this example, note the -b
in the path.
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=648224,RESOLUTION=640x360,CODECS="avc1.4d401e,mp4a.40.2"
http://origin.akamaized.net/hls/live/50002/test/01.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=648224,RESOLUTION=640x360,CODECS="avc1.4d401e,mp4a.40.2"
http://origin.akamaized.net/hls/live/50002-b/test/01.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=443680,RESOLUTION=400x224,CODECS="avc1.42e00d,mp4a.40.2"
http://origin.akamaized.net/hls/live/500002/test/02.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=443680,RESOLUTION=400x224,CODECS="avc1.42e00d,mp4a.40.2"
http://origin.akamaized.net/hls/live/50002-b/test/02.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=956544,RESOLUTION=640x720,CODECS="avc1.4d401f,mp4a.40.2"
http://origin.akamaized.nett/hls/live/50002/test/03.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=956544,RESOLUTION=640x720,CODECS="avc1.4d401f,mp4a.40.2"
http://origin.akamaized.net/hls/live/50002-b/test/03.m3u8
To check the quality of your HLS streaming content, you can use any iOS device or: http://players.akamai.com/players/hlsjs.
Create a merged variant playlist
To create a merged playlist, you must extract the variant playlists from each encoder and manually merge them. For example, assume a primary variant playlist URL of:
http://origin.akamaized.net/hls/live/50002/event/master.m3u8
Start your encoder, and then use the UNIX curl
command to acquire the variant playlist's contents.
curl http://origin.akamaized.net/hls/live/50002/event/master.m3u8
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=165135
http://origin.akamaized.net/hls/live/50002/event/iphone110.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=262346
http://origin.akamaized.net/hls/live/50002/event/iphone200.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=481677
http://origin.akamaized.net/hls/live/50002/event/iphone400.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=688301
http://origin.akamaized.net/hls/live/50002/event/ipad600.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=894877
http://origin.akamaized.net/hls/live/50002/event/ipad800.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1308077
http://origin.akamaized.net/hls/live/50002/event/ipad1200.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=40000
http://origin.akamaized.net/hls/live/50002/event/iphone110audio.m3u8
Notice that each line denotes a different bitrate.
Now, do the same for the backup variant playlist URL:
http://origin.akamaized.net/hls/live/50002-b/event/master.m3u8
curl http://origin.akamaized.net/hls/live/50002-b/event/master.m3u8
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=165135
http://origin.akamaized.net/hls/live/50002-b/event/iphone110.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=262346
http://origin.akamaized.net/hls/live/50002-b/event/iphone200.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=481677
http://origin.akamaized.net/hls/live/50002-b/event/iphone400.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=688301
http://origin.akamaized.net/hls/live/50002-b/event/ipad600.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=894877
http://origin.akamaized.net/hls/live/50002-b/event/ipad800.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1308077
http://origin.akamaized.net/hls/live/50002-b/event/ipad1200.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=40000
http://origin.akamaized.net/hls/live/50002-b/event/iphone110audio.m3u8
Manually merge the contents of each of these files to produce the following:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=165135
http://origin.akamaized.net/hls/live/50002/event/iphone110.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=165135
http://origin.akamaized.net/hls/live/50002-b/event/iphone110.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=262346
http://origin.akamaized.net/hls/live/50002/event/iphone200.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=262346
http://origin.akamaized.net/hls/live/50002-b/event/iphone200.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=481677
http://origin.akamaized.net/hls/live/50002/event/iphone400.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=481677
http://origin.akamaized.net/hls/live/50002-b/event/iphone400.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=688301
http://origin.akamaized.net/hls/live/50002/event/ipad600.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=688301
http://origin.akamaized.net/hls/live/50002-b/event/ipad600.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=894877
http://origin.akamaized.net/hls/live/50002/event/ipad800.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=894877
http://origin.akamaized.net/hls/live/50002-b/event/ipad800.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1308077
http://origin.akamaized.net/hls/live/50002/event/ipad1200.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1308077
http://origin.akamaized.net/hls/live/50002-b/event/ipad1200.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=40000
http://origin.akamaized.net/hls/live/50002/event/iphone110audio.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=40000
http://origin.akamaized.net/hls/live/50002-b/event/iphone110audio.m3u8
Notice that each bitrate in the list has a primary and a backup associated with it.
Finally, use the curl
command to post the file to the primary ingress URL.
curl -T master.m3u8 http://p-ep50002.i.akamaientrypoint.net/50002/event/index.m3u8
As shown in the
curl
upload example, ensure that the merged variant playlist name is different from existing playlist names so that it is not overwritten. For example, ifmaster.m3u8
is used by your primary and backup, you can rename the merged playlist toindex.m3u8
orplaylist.m3u8
. Ifmaster.m3u8
is used by your primary andplaylist.m3u8
is used by your backup, you could rename the merged playlist toindex.m3u8
.
Options for HLS streams
Use HTTPS
Media Services Live lets you ingest and deliver all content over HTTPS or HTTP. Live encoders that are able to broadcast using the HTTPS protocol are compatible with Media Services Live: HLS Ingest under these conditions.
-
Ingest. You can upload the master variant playlist, child playlist, audio and video (ts, aac) segments, and keys over both HTTP and HTTPS.
-
Playback. You can deliver all content over HTTP or HTTPS. You can deliver the child playlist and audio and video content over HTTP or HTTPS and the keys and master variant playlist over HTTPS. Token authentication for delivery is supported. Primary/backup failover is supported.
Once your key file is published, it is cached for 24 hours. If you need to upload a new key, use a different file name. If you fail to do this, your stream viewers may experience temporary playback failures. You should rotate your keys either every 30 segments if you are using 10-second segments, or every 5 minutes of stream time.
Add subtitles
Subtitling is a process of overlaying video with text. This can be done for accessibility for hearing-impaired people, language translation, or any other reason a producer chooses. Subtitles can be passed to a viewer in an accompanying "sidecar" file.
The supported file formats are WebVTT (Web Video Text Tracks) and VTT. The sidecar format WebVTT or VTT is specified by W3C at: http://dev.w3.org/html5/webvtt/.
Unique segment numbering
Segments generated by the encoder must be created with sequentially increasing segment numbers such as 1, 2, and 3.
If you’re using flexible segment numbering, you can ignore the sequence of the segment numbers. However, you need to ensure the segment names are unique.
For example:
https://p-ep{stream_id}.i.akamaientrypoint.net/<stream_id>/<uniquesourcename>/<sessionID>/<bitrateID>/<OPTIONAL_PATH>/<somename>_<sequence#>.ts
https://p-ep{stream_id}.i.akamaientrypoint.net/<stream_id>/<uniquesourcename>/<sessionID>/<bitrateID>/<OPTIONAL_PATH>/segment_0001.ts
https://p-ep{stream_id}.i.akamaientrypoint.net/<stream_id>/<uniquesourcename>/<sessionID>/<bitrateID>/<OPTIONAL_PATH>/segment_0002.ts
https://p-ep{stream_id}.i.akamaientrypoint.net/<stream_id>/<uniquesourcename>/<sessionID>/<bitrateID>/<OPTIONAL_PATH>/segment_0003.ts
The segment number must be extractable from the upload URL using regex. Ensure that you separate the string and the numbers of a segment. Segment names can contain alphanumeric characters and the hyphen (-) as delimiters. Other special characters are not supported. The last item before the prefix must be a unique, sequentially increasing number. You cannot use symbols, special characters, or alphabets. For example:
bitrate1000-00012.ts
<sessionId>/bitrateA_12.ts
<sessionId>/1-123.ts
<sessionId>_1_123.ts
<sessionId>/P2-2-1001.ts
(with directory rollover)
The path and segment number are treated as one entity; therefore, they must not repeat. Archived data becomes corrupted when the encoder restarts and attempts to use the previous sequence number and path.
You can use either a unique segment number or a unique session ID. The encoder must not introduce any other changing parameters such as frequently changing time stamps in the URL path. For example, if the URL path format was: eventname/sessionID/bitrateID/post-timestamp_sequence#.ts
Introducing the post-timestamp
parameter creates another set of directories for each .ts
file — a condition that would cause excess directories and possible timeouts over long periods of time.
Ideally, create the URL path like this: eventname/sessionID/bitrateID/somename-starttime-sequence#.ts
In this case, only the sequence#
changes, which is the desired behavior.
Updated over 1 year ago