Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <h3>Update</h3> <p>Looks like Apple made an IETF draft proposal, and some people are already working on segmenters:</p> <p>HTTP Live Streaming - draft-pantos-http-live-streaming-01<br> <a href="http://tools.ietf.org/id/draft-pantos-http-live-streaming-01.txt" rel="noreferrer">http://tools.ietf.org/id/draft-pantos-http-live-streaming-01.txt</a></p> <p>iPhone HTTP Streaming with FFMpeg and an Open Source Segmenter<br> <a href="http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/" rel="noreferrer">http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/</a></p> <hr> <p>Looks like the HTTP server acts simply as a dumb HTTP server. Poking around the example website provided by Akamai gives me enough info to get started with static content streaming.</p> <p><a href="http://iphone.akamai.com/" rel="noreferrer">http://iphone.akamai.com/</a></p> <p>The whitepaper ( <a href="http://www.akamai.com/dl/akamai/iphone_wp.pdf" rel="noreferrer">http://www.akamai.com/dl/akamai/iphone_wp.pdf</a> ) provides information about the transport stream encoding, so the .ts streams are straightforward.</p> <blockquote> <p>The encoder (or a separate segmenter process) will produce H.264/AAC content in a sequence of small content segments, in MPEG-2 TS format (.ts). There is also an M3U8 index file that references the segments; in the case of live content the M3U8 is continuously updated to reflect the latest content.</p> <p>H.264 Encoding should be single-pass Baseline Profile, frame re-ordering disabled. Key frames are suggested every 5 seconds, ideally an even divisor of the chosen segment length.</p> </blockquote> <p>The website provides an M3U8 file, which is simply an M3U playlist, but in the UTF-8 character encoding format.</p> <p>That file then links to an M3U8 file for each bitrate. I assume they must all have cuts at the same positions (every 2 or 10 seconds, for instance) so that switching can be seamless. It appears to be completely client driven - the client decides how to measure bandwidth and which version it's going to get.</p> <p>The contents of the main file are:</p> <pre><code>#EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=860000 hi/prog_index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=512000 med/prog_index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=160000 lo/prog_index.m3u8 </code></pre> <p>Then each of the other files are:</p> <p>hi/prog_index.m3u8</p> <pre><code>#EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10, fileSequence0.ts #EXTINF:10, fileSequence1.ts #EXTINF:10, fileSequence2.ts #EXTINF:10, fileSequence3.ts #EXTINF:1, fileSequence4.ts #EXT-X-ENDLIST </code></pre> <p>med/prog_index.m3u8</p> <pre><code>#EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10, fileSequence0.ts #EXTINF:10, fileSequence1.ts #EXTINF:10, fileSequence2.ts #EXTINF:10, fileSequence3.ts #EXTINF:1, fileSequence4.ts #EXT-X-ENDLIST </code></pre> <p>lo/prog_index.m3u8</p> <pre><code>#EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10, fileSequence0.ts #EXTINF:10, fileSequence1.ts #EXTINF:10, fileSequence2.ts #EXTINF:10, fileSequence3.ts #EXTINF:1, fileSequence4.ts #EXT-X-ENDLIST </code></pre> <p>This works with the HTML 5 video tag:</p> <pre><code>&lt;video width="640" height="480"&gt; &lt;source src="content1/content1.m3u8" /&gt; &lt;/video&gt; </code></pre> <p>There are still a lot of unanswered questions, but this is probably enough to get started.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload