[FFmpeg-devel] [PATCH] Add Apple HTTP Live Streaming protocol handler

Martin Storsjö martin
Mon Jul 26 18:07:32 CEST 2010


On Mon, 26 Jul 2010, Ronald S. Bultje wrote:

> So, my impression is that these playlists list "uri" + "bitrate",
> maybe some more (can you cp a sample playlist so we can assess?).

It's quite a bit more than that.

There are two kinds of playlists in this setup, variant playlists and 
normal segment playlists. A variant playlist points to one or more segment 
playlists, specifying their bitrate. It looks like this:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000
gear1/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111
gear2/prog_index.m3u8

At this level, you most definitely don't want to play this as a normal 
playlist, since you should just play one of them.

The normal segment playlists, e.g. gear1/prog_index.m3u8 in this case, 
looks like this:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10, no desc
fileSequence0.ts
#EXTINF:10, no desc
fileSequence1.ts
#EXTINF:10, no desc
fileSequence2.ts
...
#EXT-X-ENDLIST

This points to many mpegts segment files that should be played back to 
back without resetting the decoder inbetween.

Every bitrate variant should be segmented into similar segments, so if you 
want to switch to another bitrate variant, you just start reading from the 
corresponding segment in that variant instead.

For live streams, you don't have the "#EXT-X-ENDLIST" tag at the end, to 
indicate that there are more segments, and you should poll the playlist 
with the interval specified in #EXT-X-TARGETDURATION. For live streams, 
you may not always want to keep all the old segments available, so then 
you can drop files off from the start of the playlist and increment the 
#EXT-X-MEDIA-SEQUENCE counter, to indicate where in the stream the 
playlist starts.

It could e.g. look like this:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:42
#EXTINF:10, no desc
fileSequence42.ts
#EXTINF:10, no desc
fileSequence43.ts
#EXTINF:10, no desc
fileSequence44.ts


> What if I want to backup all of them?

Then wget (or something similar) may be the best choice, I'd say...

> For example, so I can restream it with bitrate selection from my own 
> server later on. With RTSP (e.g. RDT/Realmedia), this is possible in 
> FFmpeg (though not in Xine, Mplayer or any of the others). It's tested 
> and works. That wouldn't work in your setup, unless you implement it as 
> a demuxer-with-chains...

Umm, you can have multiple bitrates in RTSP? Do you receive them all at 
the same time if you want to backup them, as you say?

And how would that work for this setup? Do you mean that all the parallel 
streams should be available in the demuxer, so that I'd have high bitrate 
video in stream 0, high bitrate audio in stream 1, low bitrate video in 
stream 2 and low bitrate audio in stream 3? While it could be useful in 
some cases, I don't see that as a necessity. If you really want to get all 
of them, grab one bitrate per session, with many invocations in parallel.

If you want to restream it in the same format, wget (or something similar 
that handles .m3u8) is simply the easiest way - you get the content 
exactly as it was on the server, just copy to a folder on your server and 
you're done. If you pull it through ffmpeg, you'd lose all the segmenting, 
which you'd have to redo in one way or another, even if you'd have it all 
in a demuxer.

// Martin



More information about the ffmpeg-devel mailing list