SlideShare una empresa de Scribd logo
1 de 95
Mobile Movies with
                       HTTP Live Streaming
                           Chris Adamson • @invalidname
                            Oct 26, 2012 • Portland, OR




                           Sides and code available on my blog:
                              http://www.subfurther.com/blog

Saturday, October 27, 12
So Many Streaming
                                Apps!




Saturday, October 27, 12
So Many Streaming
                                Apps!




Saturday, October 27, 12
Netflix




Saturday, October 27, 12
Flixter




Saturday, October 27, 12
ABC




Saturday, October 27, 12
PBS




Saturday, October 27, 12
NBC Olympics Live
                                Extra




Saturday, October 27, 12
DirecTV




Saturday, October 27, 12
UStream




Saturday, October 27, 12
Crunchyroll




Saturday, October 27, 12
TwitchTV




Saturday, October 27, 12
iTunes Festival




Saturday, October 27, 12
Apple Events




Saturday, October 27, 12
Oh, and it can be embedded
                      in the <video> tag




Saturday, October 27, 12
Sounds good? How
                           do I get in on that?




Saturday, October 27, 12
What You'll Learn

                 • What streaming is (and isn't)

                 • Setting up HLS on the server

                 • Using HLS streams in iOS apps

                 • Real-world deployment




Saturday, October 27, 12
HLS: What It Is (and
                                 isn't)




Saturday, October 27, 12
Good Ol' Broadcast




Saturday, October 27, 12
Broadcast Media

                 • Always live on some channel (a band of EM
                   spectrum).

                 • Every client tuned to that channel sees the
                   same thing, at the same time.

                 • One-way, one-to-many model.




Saturday, October 27, 12
Internet
                 • Generally one-to-one (host to host).

                      • Multicast IP is an exception, but is rare on
                        the public Internet.

                 • Two-way communication over sockets.

                 • Routing can take many hops, via multiple
                   transport media (wire, wifi, cellular, etc.).


Saturday, October 27, 12
Impedence Mismatch!




Saturday, October 27, 12
Ye Olde Streaming
                 • Client makes socket connection and keeps it
                   open for duration of program.

                 • Server sends media at playback speed (plus
                   buffering).

                      • Shoutcast: MP3 files served slowly over HTTP.

                 • Typically use a special port number and
                   special server software.


Saturday, October 27, 12
Streaming Problems
                 • Difficult and expensive to scale.

                 • Special port numbers routinely blocked by
                   businesses, ISPs, firewalls, etc.

                 • Competing standards: Real Player, Windows
                   Media, QuickTime (all with their own plugins).

                           • No wonder Flash won.

                 • Good luck holding a socket connection on cellular.


Saturday, October 27, 12
What If…
                 • We didn't need an always-on socket
                   connection?

                 • We could just run over port 80?

                 • We could just adopt industry standards like H.
                   264 and AAC instead of cooking custom
                   codecs?



Saturday, October 27, 12
HTTP Live Streaming
                 • Serves media as a series of short flat files, via
                   HTTP, usually on port 80.

                 • Any web server will do.

                 • Client software reassembles the data into a
                   continuous media stream.

                 • Spec does not specify contents, but Apple uses
                   H.264 and AAC, just like all their media apps.


Saturday, October 27, 12
Serving up HLS


                 • Client URL is an .m3u8 playlist file

                 • Playlist points to the media segment files




Saturday, October 27, 12
Saturday, October 27, 12
The HLS playlist
      #EXTM3U
      #EXT-X-TARGETDURATION:10
      #EXT-X-VERSION:3
      #EXT-X-MEDIA-SEQUENCE:0
      #EXT-X-PLAYLIST-TYPE:VOD
      #EXTINF:9.975,!
      fileSequence0.ts
      #EXTINF:9.975,!
      fileSequence1.ts
      #EXTINF:9.975,!
      fileSequence2.ts
      #EXTINF:9.9767,!
      fileSequence3.ts
      #EXTINF:9.975,!

      [...]

      #EXT-X-ENDLIST

Saturday, October 27, 12
The HLS playlist
      #EXTM3U                        Format: .m3u8 format,
      #EXT-X-TARGETDURATION:10
      #EXT-X-VERSION:3
                                     just a list of files to play
      #EXT-X-MEDIA-SEQUENCE:0
      #EXT-X-PLAYLIST-TYPE:VOD
      #EXTINF:9.975,!
      fileSequence0.ts
      #EXTINF:9.975,!
      fileSequence1.ts
      #EXTINF:9.975,!
      fileSequence2.ts
      #EXTINF:9.9767,!
      fileSequence3.ts
      #EXTINF:9.975,!

      [...]

      #EXT-X-ENDLIST

Saturday, October 27, 12
The HLS playlist
      #EXTM3U                        Format: .m3u8 format,
      #EXT-X-TARGETDURATION:10
      #EXT-X-VERSION:3
                                     just a list of files to play
      #EXT-X-MEDIA-SEQUENCE:0
      #EXT-X-PLAYLIST-TYPE:VOD       Metadata tags describe
      #EXTINF:9.975,!
      fileSequence0.ts               the contents
      #EXTINF:9.975,!
      fileSequence1.ts
      #EXTINF:9.975,!
      fileSequence2.ts
      #EXTINF:9.9767,!
      fileSequence3.ts
      #EXTINF:9.975,!

      [...]

      #EXT-X-ENDLIST

Saturday, October 27, 12
The HLS playlist
      #EXTM3U                        Format: .m3u8 format,
      #EXT-X-TARGETDURATION:10
      #EXT-X-VERSION:3
                                     just a list of files to play
      #EXT-X-MEDIA-SEQUENCE:0
      #EXT-X-PLAYLIST-TYPE:VOD       Metadata tags describe
      #EXTINF:9.975,!
      fileSequence0.ts               the contents
      #EXTINF:9.975,!
      fileSequence1.ts
      #EXTINF:9.975,!                Each segment file
      fileSequence2.ts
      #EXTINF:9.9767,!
                                     preceded by metadata
      fileSequence3.ts               (e.g., duration)
      #EXTINF:9.975,!

      [...]

      #EXT-X-ENDLIST

Saturday, October 27, 12
The HLS playlist
      #EXTM3U                        Format: .m3u8 format,
      #EXT-X-TARGETDURATION:10
      #EXT-X-VERSION:3
                                     just a list of files to play
      #EXT-X-MEDIA-SEQUENCE:0
      #EXT-X-PLAYLIST-TYPE:VOD       Metadata tags describe
      #EXTINF:9.975,!
      fileSequence0.ts               the contents
      #EXTINF:9.975,!
      fileSequence1.ts
      #EXTINF:9.975,!                Each segment file
      fileSequence2.ts
      #EXTINF:9.9767,!
                                     preceded by metadata
      fileSequence3.ts               (e.g., duration)
      #EXTINF:9.975,!

      [...]                         If no end tag, client
      #EXT-X-ENDLIST                refreshes periodically
Saturday, October 27, 12
<video src="prog_index.m3u8" width="640" height="480"
                   controls autoplay>No video tag support</video>
Saturday, October 27, 12
How is this better than
                        a flat .m4v file?
                 • Streams can provide variants for different
                   bandwidths (as we’ll see…)

                 • Segments make it easier to scrub into the
                   video

                 • Streams can be live video




Saturday, October 27, 12
The “Live” in HLS
                 • A playlist is a live stream if it doesn’t have an
                   #EXT-X-ENDLIST tag

                 • Live playlist will generally just contain the last
                   minute or so of segments

                 • Client will refresh playlist every minute or so,
                   download whatever segments it doesn’t already
                   have, queue them locally

                 • “Live” isn’t really “live” (often a minute behind)

Saturday, October 27, 12
Serving up HLS




Saturday, October 27, 12
Saturday, October 27, 12
Saturday, October 27, 12
Saturday, October 27, 12
Saturday, October 27, 12
Saturday, October 27, 12
mediafilesegmenter
                 • Splits an A/V file into segment files, creates
                   the .m3u8 playlist

                 • Source must be .mov or .m4v with H.264 video,
                   AAC audio

                 • Output segments will be MPEG-2 Transport Stream
                   (.ts) files, or .aac if audio-only

                 • Segment paths are relative, use -b to prepend URL
                   stub


Saturday, October 27, 12
Technical Note TN2224
        The following audio and video formats are supported:

        • Video: H.264 Baseline Profile Level 3.0 (iPhone/iPod Touch),
          Main Profile Level 3.1 (iPad 1,2)

        • Audio: HE-AAC or AAC-LC up to 48 kHz, stereo audio OR
          MP3 (MPEG-1 Audio Layer 3) 8 kHz to 48 kHz, stereo audio

        Note: iPhone 3G supports Baseline Profile Level 3.1. If your
        app runs on older iPhones, however, you should use H.264
        Baseline Profile 3.0 for compatibility.


Saturday, October 27, 12
Yuna:HTTP Live Streaming tests cadamson$ mediafilesegmenter
             -f basic source/IMG_0251.MOV
             Jun 24 2012 10:01:24.203: Using floating point is not
             backward compatible to iOS 4.1 or earlier devices
             Jun 24 2012 10:01:24.204: Processing file /Users/cadamson/
             Documents/HTTP Live Streaming tests/source/IMG_0251.MOV
             Jun 24 2012 10:01:24.338: Finalized /Users/cadamson/
             Documents/HTTP Live Streaming tests/basic/fileSequence0.ts
             Jun 24 2012 10:01:24.375: segment bitrate 3.78028e+06 is
             new max
             Jun 24 2012 10:01:24.468: Finalized /Users/cadamson/
             Documents/HTTP Live Streaming tests/basic/fileSequence1.ts
             Jun 24 2012 10:01:24.554: Finalized /Users/cadamson/
             Documents/HTTP Live Streaming tests/basic/fileSequence2.ts
             Jun 24 2012 10:01:24.631: Finalized /Users/cadamson/
             Documents/HTTP Live Streaming tests/basic/fileSequence3.ts
             Jun 24 2012 10:01:24.717: Finalized /Users/cadamson/
             Documents/HTTP Live Streaming tests/basic/fileSequence4.ts




Saturday, October 27, 12
Demo




Saturday, October 27, 12
Variant Playlists
                 • One bitrate does not fit all: Mac on Ethernet
                   versus iPhone on Edge.

                 • Solution: encode your video at multiple bitrates,
                   offer metadata in playlist about what's
                   available, let client figure out which to use.

                 • HLS clients automatically switch to best variant
                   for current network conditions, switch on the fly.



Saturday, October 27, 12
variantplaylistcreator
                 • Creates a playlist that itself points to playlists
                   created with mediafilesegmenter.

                      • Each entry contains metadata describing the
                        bitrate and encoding of the variant.

                 • Tool takes argument pairs: file or URL of a
                   variant .m3u8, and metadata .plist created with
                   mediafilesegmenter -I flag

                 • First entry in variant playlist is default; client will try
                   this one first

Saturday, October 27, 12
Encoding the variants




Saturday, October 27, 12
TN2224
                           Recommendations




Saturday, October 27, 12
Creating variants
            Yuna:HTTP Live Streaming tests cadamson$
            mediafilesegmenter -I -f variants/
            broadband/ source/IMG_0254_Broadband.m4v

            Yuna:HTTP Live Streaming tests cadamson$
            mediafilesegmenter -I -f variants/wifi
            source/IMG_0254_WiFi.m4v

            Yuna:HTTP Live Streaming tests cadamson$
            mediafilesegmenter -I -f variants/
            cellular source/IMG_0254_Cellular.m4v


Saturday, October 27, 12
Creating variant playlist
          Yuna:HTTP Live Streaming tests cadamson$
          variantplaylistcreator -o variants/
          variants.m3u8 variants/broadband/
          prog_index.m3u8 source/
          IMG_0254_Broadband.plist variants/wifi/
          prog_index.m3u8 source/
          IMG_0254_WiFi.plist variants/cellular/
          prog_index.m3u8 source/
          IMG_0254_Cellular.plist



Saturday, October 27, 12
Demo




Saturday, October 27, 12
That's Great, but…
                           How do we keep people from stealing our stream?




Saturday, October 27, 12
Encryption
                 • HLS encrypts files, not transport.

                 • Easy to scale: still serving flat files, but now
                   they're useless without decryption keys.

                 • Serving the keys still needs to be secure.

                 • Necessary, but not sufficient, for DRM.



Saturday, October 27, 12
Encrypting a playlist
    Yuna:HTTP Live Streaming tests cadamson$ mediafilesegmenter -
    I -k keys -f encrypted/cellular source/IMG_0426_Cellular.m4v
    Jun 24 2012 18:59:47.115: Using new key/iv rotation period;
    this is not backward compatible to iOS 3.1.* or earlier
    devices.  Use the "-encrypt-iv=sequence" option for
    compatibility with those devices.
    Jun 24 2012 18:59:47.115: Using floating point is not
    backward compatible to iOS 4.1 or earlier devices
    Jun 24 2012 18:59:47.115: Processing file /Users/cadamson/
    Documents/HTTP Live Streaming tests/source/
    IMG_0426_Cellular.m4v
    Jun 24 2012 18:59:47.152: changing IV
    Jun 24 2012 18:59:47.160: Finalized /Users/cadamson/
    Documents/HTTP Live Streaming tests/encrypted/cellular/
    fileSequence0.ts
    Jun 24 2012 18:59:47.160: segment bitrate 271257 is new max


Saturday, October 27, 12
Encrypted .ts files




Saturday, October 27, 12
Encrypted .ts files




Saturday, October 27, 12
Encrypted .ts files




Saturday, October 27, 12
Encrypted .ts files




Saturday, October 27, 12
Protect those keys




                           /www/protected


                                            /www/hls



Saturday, October 27, 12
Demo




Saturday, October 27, 12
Client-side HLS




Saturday, October 27, 12
Opening an HLS
                              stream

                 • Provide the .m3u8 URL to
                   MPMoviePlayerController or AVPlayer

                 • Add the movie view or layer to your UI,
                   customizing size or scaling if necessary




Saturday, October 27, 12
Create an
                 MPMoviePlayerController

      // create new movie player
      self.moviePlayer = [[MPMoviePlayerController alloc]
      ! ! ! ! ! ! ! ! initWithContentURL:streamURL];
      [self.moviePlayer prepareToPlay];



                 • This is the same as playing a local file or any
                   other URL


Saturday, October 27, 12
Add it to your UI

           [self.moviePlayer.view setFrame:
           ! ! ! ! ! ! ! self.movieContainerView.bounds];
           [self.movieContainerView addSubview:
           ! ! ! ! ! ! ! ! self.moviePlayer.view];
           self.moviePlayer.scalingMode =
           ! ! ! ! ! ! ! ! MPMovieScalingModeFill;


                 • Can inspect the moviePlayer's naturalSize, though it
                   may change during playback (listen for
                   MPMovieNaturalSizeAvailableNotification), or
                   just setFullscreen:animated:

Saturday, October 27, 12
MPMovieScalingMode
                         AspectFit




Saturday, October 27, 12
MPMovieScalingMode
                         AspectFill




Saturday, October 27, 12
MPMovieScalingMode 
                            Fill




Saturday, October 27, 12
Accessing Encrypted
                                Streams
                 • Media Player and AV Foundation can use
                   NSURLCredentials that you've provided

                 • Place credentials in NSURLCredentialStorage

                 • Server can provide the keys securely(*) with
                   HTTP Basic or Digest authentication, an
                   HTTPS script, etc.

                             * - For various values of "secure"

Saturday, October 27, 12
Setting credentials (1)

       NSURLProtectionSpace *protectionSpace =
       ! [[NSURLProtectionSpace alloc]
       ! ! initWithHost:host
       ! ! port:port
       ! ! protocol:protocol
       ! ! realm:realm
       ! ! authenticationMethod:
       ! ! ! NSURLAuthenticationMethodDefault];




Saturday, October 27, 12
Setting credentials (2)

          NSURLCredential *credential =
          ! [NSURLCredential credentialWithUser:username
          ! ! ! ! ! ! ! ! !         password:password
          ! ! ! ! ! ! ! ! ! ! ! persistence:
          ! ! ! NSURLCredentialPersistenceForSession];

          [[NSURLCredentialStorage
          ! sharedCredentialStorage]
          ! ! setDefaultCredential:credential
          ! !    forProtectionSpace:protectionSpace];



Saturday, October 27, 12
Live Streaming




Saturday, October 27, 12
Live Streaming
                 • mediastreamsegmenter mostly works like the
                   file version, but takes its input from UDP stream
                   or a Unix pipe

                      • Only difference is that .m3u8 file doesn't have
                        an EXT-X-ENDLIST tag, so client reloads
                        periodically to fetch new segments

                 • How the heck do you create a UDP A/V
                   stream?


Saturday, October 27, 12
You Don't


                 • None of Apple's tools create the required
                   stream

                      • This is a "third party opportunity"

                      • Which begs the question… buy or build?


Saturday, October 27, 12
Streaming in the Real
                            World
                           It's not all about iPhones…




Saturday, October 27, 12
Streaming Clients
                 • Mobile Devices: iPhone, iPad, iPod Touch…
                   plus Android, Windows Mobile, etc.

                 • Mac and Windows PCs

                 • Over-the-top (OTT) boxes: Apple TV, Roku

                 • Game consoles



Saturday, October 27, 12
Let's Get Practical

                 • What devices do you have to be on?

                 • What devices will you get for free?

                 • How to encode and deliver to the devices you
                   need?




Saturday, October 27, 12
HLS Alternatives
                 • Flash still rules on the desktop/browser
                   space, thanks in part to Mozilla's obstinance
                   about H.264 in <video> (irony alert: H.264 is
                   the de facto standard for Flash video)

                 • Adobe Dynamic Streaming and Microsoft
                   Smooth Streaming are highly similar to HLS:
                   bitrate-adaptive streams over HTTP



Saturday, October 27, 12
MPEG-DASH
                 • Attempt at a standardized approach to HTTP
                   adaptive-bitrate streaming. ISO/IEC 23009-1.




                              http://xkcd.com/927/
Saturday, October 27, 12
Emerging Consensus

                 • Flash for PCs

                 • HTTP Live Streaming for iOS

                 • Plus whatever other devices you need to
                   support




Saturday, October 27, 12
Real-World HLS

                 • Can you competently encode all your media
                   at all the variant bitrates you need?

                 • Do you have a way to QC all your streams?

                 • Can you handle the server load?




Saturday, October 27, 12
Content Delivery
                              Networks




         http://en.wikipedia.org/wiki/Content_delivery_network
Saturday, October 27, 12
Content Delivery
                              Networks
                 • CDNs host your media on edge servers that are
                   closer to your clients. Less strain on your
                   servers and the backbones.

                 • Examples: Akamai, Limelight, EdgeCast

                 • Big media companies may have their own CDN

                 • Most already know how to do HLS



Saturday, October 27, 12
Buy or Build: Encoders




Saturday, October 27, 12
Build or Buy: Services
                 • Provide hosting, transcoding, bandwidth

                      • All-in-one: UStream, LiveStream, Justin.tv /
                        Twitch.tv (all of which have iOS apps)

                      • May provide broadcast tools (Flash applet,
                        Telestream Wirecast, etc.

                      • Often free with ads; you pay to go ad-free,
                        embed on your site, etc.


Saturday, October 27, 12
invalidstream




                       http://www.ustream.tv/channel/invalidstream

Saturday, October 27, 12
Buy or Build:
                             Bandwidth

                 • Each HLS client will consume up to 1GB /
                   hour, depending on variant bitrates, client
                   bandwidth, etc.

                 • Many CDNs charge around $0.20/GB.




Saturday, October 27, 12
Bandwidth Costs




                   Prices from ScaleEngine, UStream, and LiveStream as of
                                       October 2012
Saturday, October 27, 12
Bandwidth Costs




                   Prices from ScaleEngine, UStream, and LiveStream as of
                                       October 2012
Saturday, October 27, 12
Bandwidth Costs




                   Prices from ScaleEngine, UStream, and LiveStream as of
                                       October 2012
Saturday, October 27, 12
Bandwidth Costs




                   Prices from ScaleEngine, UStream, and LiveStream as of
                                       October 2012
Saturday, October 27, 12
Wrap Up




Saturday, October 27, 12
Takeaways
                 • HLS is a very practical streaming solution

                 • Only part of the picture if you're multi-platform

                 • Encoding and serving correctly requires some
                   care and expertise, and a lot of money

                 • Client-side software requirements are fairly
                   simple


Saturday, October 27, 12
Q&A
                           Slides and code will be available on my blog:
                                   http://www.subfurther.com/blog
                               http://www.slideshare.net/invalidname

                                          @invalidname




Saturday, October 27, 12

Más contenido relacionado

Más de Chris Adamson

Firebase: Totally Not Parse All Over Again (Unless It Is)
Firebase: Totally Not Parse All Over Again (Unless It Is)Firebase: Totally Not Parse All Over Again (Unless It Is)
Firebase: Totally Not Parse All Over Again (Unless It Is)Chris Adamson
 
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)Chris Adamson
 
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)Chris Adamson
 
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)Chris Adamson
 
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...Chris Adamson
 
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014Chris Adamson
 
Stupid Video Tricks, CocoaConf Seattle 2014
Stupid Video Tricks, CocoaConf Seattle 2014Stupid Video Tricks, CocoaConf Seattle 2014
Stupid Video Tricks, CocoaConf Seattle 2014Chris Adamson
 
Stupid Video Tricks, CocoaConf Las Vegas
Stupid Video Tricks, CocoaConf Las VegasStupid Video Tricks, CocoaConf Las Vegas
Stupid Video Tricks, CocoaConf Las VegasChris Adamson
 
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)Chris Adamson
 
Stupid Video Tricks (CocoaConf DC, March 2014)
Stupid Video Tricks (CocoaConf DC, March 2014)Stupid Video Tricks (CocoaConf DC, March 2014)
Stupid Video Tricks (CocoaConf DC, March 2014)Chris Adamson
 
Introduction to the Roku SDK
Introduction to the Roku SDKIntroduction to the Roku SDK
Introduction to the Roku SDKChris Adamson
 
Get On The Audiobus (CocoaConf Atlanta, November 2013)
Get On The Audiobus (CocoaConf Atlanta, November 2013)Get On The Audiobus (CocoaConf Atlanta, November 2013)
Get On The Audiobus (CocoaConf Atlanta, November 2013)Chris Adamson
 
Get On The Audiobus (CocoaConf Boston, October 2013)
Get On The Audiobus (CocoaConf Boston, October 2013)Get On The Audiobus (CocoaConf Boston, October 2013)
Get On The Audiobus (CocoaConf Boston, October 2013)Chris Adamson
 
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)Chris Adamson
 
iOS Media APIs (MobiDevDay Detroit, May 2013)
iOS Media APIs (MobiDevDay Detroit, May 2013)iOS Media APIs (MobiDevDay Detroit, May 2013)
iOS Media APIs (MobiDevDay Detroit, May 2013)Chris Adamson
 
Core Audio in iOS 6 (CocoaConf San Jose, April 2013)
Core Audio in iOS 6 (CocoaConf San Jose, April 2013) Core Audio in iOS 6 (CocoaConf San Jose, April 2013)
Core Audio in iOS 6 (CocoaConf San Jose, April 2013) Chris Adamson
 
Core Audio in iOS 6 (CocoaConf DC, March 2013)
Core Audio in iOS 6 (CocoaConf DC, March 2013)Core Audio in iOS 6 (CocoaConf DC, March 2013)
Core Audio in iOS 6 (CocoaConf DC, March 2013)Chris Adamson
 
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)Chris Adamson
 
Core Audio in iOS 6 (CocoaConf Chicago, March 2013)
Core Audio in iOS 6 (CocoaConf Chicago, March 2013)Core Audio in iOS 6 (CocoaConf Chicago, March 2013)
Core Audio in iOS 6 (CocoaConf Chicago, March 2013)Chris Adamson
 

Más de Chris Adamson (20)

Firebase: Totally Not Parse All Over Again (Unless It Is)
Firebase: Totally Not Parse All Over Again (Unless It Is)Firebase: Totally Not Parse All Over Again (Unless It Is)
Firebase: Totally Not Parse All Over Again (Unless It Is)
 
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
 
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
 
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
 
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
 
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
 
Stupid Video Tricks, CocoaConf Seattle 2014
Stupid Video Tricks, CocoaConf Seattle 2014Stupid Video Tricks, CocoaConf Seattle 2014
Stupid Video Tricks, CocoaConf Seattle 2014
 
Stupid Video Tricks, CocoaConf Las Vegas
Stupid Video Tricks, CocoaConf Las VegasStupid Video Tricks, CocoaConf Las Vegas
Stupid Video Tricks, CocoaConf Las Vegas
 
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
 
Stupid Video Tricks (CocoaConf DC, March 2014)
Stupid Video Tricks (CocoaConf DC, March 2014)Stupid Video Tricks (CocoaConf DC, March 2014)
Stupid Video Tricks (CocoaConf DC, March 2014)
 
Stupid Video Tricks
Stupid Video TricksStupid Video Tricks
Stupid Video Tricks
 
Introduction to the Roku SDK
Introduction to the Roku SDKIntroduction to the Roku SDK
Introduction to the Roku SDK
 
Get On The Audiobus (CocoaConf Atlanta, November 2013)
Get On The Audiobus (CocoaConf Atlanta, November 2013)Get On The Audiobus (CocoaConf Atlanta, November 2013)
Get On The Audiobus (CocoaConf Atlanta, November 2013)
 
Get On The Audiobus (CocoaConf Boston, October 2013)
Get On The Audiobus (CocoaConf Boston, October 2013)Get On The Audiobus (CocoaConf Boston, October 2013)
Get On The Audiobus (CocoaConf Boston, October 2013)
 
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
 
iOS Media APIs (MobiDevDay Detroit, May 2013)
iOS Media APIs (MobiDevDay Detroit, May 2013)iOS Media APIs (MobiDevDay Detroit, May 2013)
iOS Media APIs (MobiDevDay Detroit, May 2013)
 
Core Audio in iOS 6 (CocoaConf San Jose, April 2013)
Core Audio in iOS 6 (CocoaConf San Jose, April 2013) Core Audio in iOS 6 (CocoaConf San Jose, April 2013)
Core Audio in iOS 6 (CocoaConf San Jose, April 2013)
 
Core Audio in iOS 6 (CocoaConf DC, March 2013)
Core Audio in iOS 6 (CocoaConf DC, March 2013)Core Audio in iOS 6 (CocoaConf DC, March 2013)
Core Audio in iOS 6 (CocoaConf DC, March 2013)
 
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
 
Core Audio in iOS 6 (CocoaConf Chicago, March 2013)
Core Audio in iOS 6 (CocoaConf Chicago, March 2013)Core Audio in iOS 6 (CocoaConf Chicago, March 2013)
Core Audio in iOS 6 (CocoaConf Chicago, March 2013)
 

Último

Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 

Último (20)

Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 

Mobile Movies with HTTP Live Streaming (CocoaConf Portland, Oct. '12)

  • 1. Mobile Movies with HTTP Live Streaming Chris Adamson • @invalidname Oct 26, 2012 • Portland, OR Sides and code available on my blog: http://www.subfurther.com/blog Saturday, October 27, 12
  • 2. So Many Streaming Apps! Saturday, October 27, 12
  • 3. So Many Streaming Apps! Saturday, October 27, 12
  • 8. NBC Olympics Live Extra Saturday, October 27, 12
  • 15. Oh, and it can be embedded in the <video> tag Saturday, October 27, 12
  • 16. Sounds good? How do I get in on that? Saturday, October 27, 12
  • 17. What You'll Learn • What streaming is (and isn't) • Setting up HLS on the server • Using HLS streams in iOS apps • Real-world deployment Saturday, October 27, 12
  • 18. HLS: What It Is (and isn't) Saturday, October 27, 12
  • 20. Broadcast Media • Always live on some channel (a band of EM spectrum). • Every client tuned to that channel sees the same thing, at the same time. • One-way, one-to-many model. Saturday, October 27, 12
  • 21. Internet • Generally one-to-one (host to host). • Multicast IP is an exception, but is rare on the public Internet. • Two-way communication over sockets. • Routing can take many hops, via multiple transport media (wire, wifi, cellular, etc.). Saturday, October 27, 12
  • 23. Ye Olde Streaming • Client makes socket connection and keeps it open for duration of program. • Server sends media at playback speed (plus buffering). • Shoutcast: MP3 files served slowly over HTTP. • Typically use a special port number and special server software. Saturday, October 27, 12
  • 24. Streaming Problems • Difficult and expensive to scale. • Special port numbers routinely blocked by businesses, ISPs, firewalls, etc. • Competing standards: Real Player, Windows Media, QuickTime (all with their own plugins). • No wonder Flash won. • Good luck holding a socket connection on cellular. Saturday, October 27, 12
  • 25. What If… • We didn't need an always-on socket connection? • We could just run over port 80? • We could just adopt industry standards like H. 264 and AAC instead of cooking custom codecs? Saturday, October 27, 12
  • 26. HTTP Live Streaming • Serves media as a series of short flat files, via HTTP, usually on port 80. • Any web server will do. • Client software reassembles the data into a continuous media stream. • Spec does not specify contents, but Apple uses H.264 and AAC, just like all their media apps. Saturday, October 27, 12
  • 27. Serving up HLS • Client URL is an .m3u8 playlist file • Playlist points to the media segment files Saturday, October 27, 12
  • 29. The HLS playlist #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.975,! fileSequence0.ts #EXTINF:9.975,! fileSequence1.ts #EXTINF:9.975,! fileSequence2.ts #EXTINF:9.9767,! fileSequence3.ts #EXTINF:9.975,! [...] #EXT-X-ENDLIST Saturday, October 27, 12
  • 30. The HLS playlist #EXTM3U Format: .m3u8 format, #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 just a list of files to play #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.975,! fileSequence0.ts #EXTINF:9.975,! fileSequence1.ts #EXTINF:9.975,! fileSequence2.ts #EXTINF:9.9767,! fileSequence3.ts #EXTINF:9.975,! [...] #EXT-X-ENDLIST Saturday, October 27, 12
  • 31. The HLS playlist #EXTM3U Format: .m3u8 format, #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 just a list of files to play #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD Metadata tags describe #EXTINF:9.975,! fileSequence0.ts the contents #EXTINF:9.975,! fileSequence1.ts #EXTINF:9.975,! fileSequence2.ts #EXTINF:9.9767,! fileSequence3.ts #EXTINF:9.975,! [...] #EXT-X-ENDLIST Saturday, October 27, 12
  • 32. The HLS playlist #EXTM3U Format: .m3u8 format, #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 just a list of files to play #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD Metadata tags describe #EXTINF:9.975,! fileSequence0.ts the contents #EXTINF:9.975,! fileSequence1.ts #EXTINF:9.975,! Each segment file fileSequence2.ts #EXTINF:9.9767,! preceded by metadata fileSequence3.ts (e.g., duration) #EXTINF:9.975,! [...] #EXT-X-ENDLIST Saturday, October 27, 12
  • 33. The HLS playlist #EXTM3U Format: .m3u8 format, #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 just a list of files to play #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD Metadata tags describe #EXTINF:9.975,! fileSequence0.ts the contents #EXTINF:9.975,! fileSequence1.ts #EXTINF:9.975,! Each segment file fileSequence2.ts #EXTINF:9.9767,! preceded by metadata fileSequence3.ts (e.g., duration) #EXTINF:9.975,! [...] If no end tag, client #EXT-X-ENDLIST refreshes periodically Saturday, October 27, 12
  • 34. <video src="prog_index.m3u8" width="640" height="480" controls autoplay>No video tag support</video> Saturday, October 27, 12
  • 35. How is this better than a flat .m4v file? • Streams can provide variants for different bandwidths (as we’ll see…) • Segments make it easier to scrub into the video • Streams can be live video Saturday, October 27, 12
  • 36. The “Live” in HLS • A playlist is a live stream if it doesn’t have an #EXT-X-ENDLIST tag • Live playlist will generally just contain the last minute or so of segments • Client will refresh playlist every minute or so, download whatever segments it doesn’t already have, queue them locally • “Live” isn’t really “live” (often a minute behind) Saturday, October 27, 12
  • 37. Serving up HLS Saturday, October 27, 12
  • 43. mediafilesegmenter • Splits an A/V file into segment files, creates the .m3u8 playlist • Source must be .mov or .m4v with H.264 video, AAC audio • Output segments will be MPEG-2 Transport Stream (.ts) files, or .aac if audio-only • Segment paths are relative, use -b to prepend URL stub Saturday, October 27, 12
  • 44. Technical Note TN2224 The following audio and video formats are supported: • Video: H.264 Baseline Profile Level 3.0 (iPhone/iPod Touch), Main Profile Level 3.1 (iPad 1,2) • Audio: HE-AAC or AAC-LC up to 48 kHz, stereo audio OR MP3 (MPEG-1 Audio Layer 3) 8 kHz to 48 kHz, stereo audio Note: iPhone 3G supports Baseline Profile Level 3.1. If your app runs on older iPhones, however, you should use H.264 Baseline Profile 3.0 for compatibility. Saturday, October 27, 12
  • 45. Yuna:HTTP Live Streaming tests cadamson$ mediafilesegmenter -f basic source/IMG_0251.MOV Jun 24 2012 10:01:24.203: Using floating point is not backward compatible to iOS 4.1 or earlier devices Jun 24 2012 10:01:24.204: Processing file /Users/cadamson/ Documents/HTTP Live Streaming tests/source/IMG_0251.MOV Jun 24 2012 10:01:24.338: Finalized /Users/cadamson/ Documents/HTTP Live Streaming tests/basic/fileSequence0.ts Jun 24 2012 10:01:24.375: segment bitrate 3.78028e+06 is new max Jun 24 2012 10:01:24.468: Finalized /Users/cadamson/ Documents/HTTP Live Streaming tests/basic/fileSequence1.ts Jun 24 2012 10:01:24.554: Finalized /Users/cadamson/ Documents/HTTP Live Streaming tests/basic/fileSequence2.ts Jun 24 2012 10:01:24.631: Finalized /Users/cadamson/ Documents/HTTP Live Streaming tests/basic/fileSequence3.ts Jun 24 2012 10:01:24.717: Finalized /Users/cadamson/ Documents/HTTP Live Streaming tests/basic/fileSequence4.ts Saturday, October 27, 12
  • 47. Variant Playlists • One bitrate does not fit all: Mac on Ethernet versus iPhone on Edge. • Solution: encode your video at multiple bitrates, offer metadata in playlist about what's available, let client figure out which to use. • HLS clients automatically switch to best variant for current network conditions, switch on the fly. Saturday, October 27, 12
  • 48. variantplaylistcreator • Creates a playlist that itself points to playlists created with mediafilesegmenter. • Each entry contains metadata describing the bitrate and encoding of the variant. • Tool takes argument pairs: file or URL of a variant .m3u8, and metadata .plist created with mediafilesegmenter -I flag • First entry in variant playlist is default; client will try this one first Saturday, October 27, 12
  • 50. TN2224 Recommendations Saturday, October 27, 12
  • 51. Creating variants Yuna:HTTP Live Streaming tests cadamson$ mediafilesegmenter -I -f variants/ broadband/ source/IMG_0254_Broadband.m4v Yuna:HTTP Live Streaming tests cadamson$ mediafilesegmenter -I -f variants/wifi source/IMG_0254_WiFi.m4v Yuna:HTTP Live Streaming tests cadamson$ mediafilesegmenter -I -f variants/ cellular source/IMG_0254_Cellular.m4v Saturday, October 27, 12
  • 52. Creating variant playlist Yuna:HTTP Live Streaming tests cadamson$ variantplaylistcreator -o variants/ variants.m3u8 variants/broadband/ prog_index.m3u8 source/ IMG_0254_Broadband.plist variants/wifi/ prog_index.m3u8 source/ IMG_0254_WiFi.plist variants/cellular/ prog_index.m3u8 source/ IMG_0254_Cellular.plist Saturday, October 27, 12
  • 54. That's Great, but… How do we keep people from stealing our stream? Saturday, October 27, 12
  • 55. Encryption • HLS encrypts files, not transport. • Easy to scale: still serving flat files, but now they're useless without decryption keys. • Serving the keys still needs to be secure. • Necessary, but not sufficient, for DRM. Saturday, October 27, 12
  • 56. Encrypting a playlist Yuna:HTTP Live Streaming tests cadamson$ mediafilesegmenter - I -k keys -f encrypted/cellular source/IMG_0426_Cellular.m4v Jun 24 2012 18:59:47.115: Using new key/iv rotation period; this is not backward compatible to iOS 3.1.* or earlier devices.  Use the "-encrypt-iv=sequence" option for compatibility with those devices. Jun 24 2012 18:59:47.115: Using floating point is not backward compatible to iOS 4.1 or earlier devices Jun 24 2012 18:59:47.115: Processing file /Users/cadamson/ Documents/HTTP Live Streaming tests/source/ IMG_0426_Cellular.m4v Jun 24 2012 18:59:47.152: changing IV Jun 24 2012 18:59:47.160: Finalized /Users/cadamson/ Documents/HTTP Live Streaming tests/encrypted/cellular/ fileSequence0.ts Jun 24 2012 18:59:47.160: segment bitrate 271257 is new max Saturday, October 27, 12
  • 61. Protect those keys /www/protected /www/hls Saturday, October 27, 12
  • 64. Opening an HLS stream • Provide the .m3u8 URL to MPMoviePlayerController or AVPlayer • Add the movie view or layer to your UI, customizing size or scaling if necessary Saturday, October 27, 12
  • 65. Create an MPMoviePlayerController // create new movie player self.moviePlayer = [[MPMoviePlayerController alloc] ! ! ! ! ! ! ! ! initWithContentURL:streamURL]; [self.moviePlayer prepareToPlay]; • This is the same as playing a local file or any other URL Saturday, October 27, 12
  • 66. Add it to your UI [self.moviePlayer.view setFrame: ! ! ! ! ! ! ! self.movieContainerView.bounds]; [self.movieContainerView addSubview: ! ! ! ! ! ! ! ! self.moviePlayer.view]; self.moviePlayer.scalingMode = ! ! ! ! ! ! ! ! MPMovieScalingModeFill; • Can inspect the moviePlayer's naturalSize, though it may change during playback (listen for MPMovieNaturalSizeAvailableNotification), or just setFullscreen:animated: Saturday, October 27, 12
  • 67. MPMovieScalingMode AspectFit Saturday, October 27, 12
  • 68. MPMovieScalingMode AspectFill Saturday, October 27, 12
  • 69. MPMovieScalingMode  Fill Saturday, October 27, 12
  • 70. Accessing Encrypted Streams • Media Player and AV Foundation can use NSURLCredentials that you've provided • Place credentials in NSURLCredentialStorage • Server can provide the keys securely(*) with HTTP Basic or Digest authentication, an HTTPS script, etc. * - For various values of "secure" Saturday, October 27, 12
  • 71. Setting credentials (1) NSURLProtectionSpace *protectionSpace = ! [[NSURLProtectionSpace alloc] ! ! initWithHost:host ! ! port:port ! ! protocol:protocol ! ! realm:realm ! ! authenticationMethod: ! ! ! NSURLAuthenticationMethodDefault]; Saturday, October 27, 12
  • 72. Setting credentials (2) NSURLCredential *credential = ! [NSURLCredential credentialWithUser:username ! ! ! ! ! ! ! ! !         password:password ! ! ! ! ! ! ! ! ! ! ! persistence: ! ! ! NSURLCredentialPersistenceForSession]; [[NSURLCredentialStorage ! sharedCredentialStorage] ! ! setDefaultCredential:credential ! ! forProtectionSpace:protectionSpace]; Saturday, October 27, 12
  • 74. Live Streaming • mediastreamsegmenter mostly works like the file version, but takes its input from UDP stream or a Unix pipe • Only difference is that .m3u8 file doesn't have an EXT-X-ENDLIST tag, so client reloads periodically to fetch new segments • How the heck do you create a UDP A/V stream? Saturday, October 27, 12
  • 75. You Don't • None of Apple's tools create the required stream • This is a "third party opportunity" • Which begs the question… buy or build? Saturday, October 27, 12
  • 76. Streaming in the Real World It's not all about iPhones… Saturday, October 27, 12
  • 77. Streaming Clients • Mobile Devices: iPhone, iPad, iPod Touch… plus Android, Windows Mobile, etc. • Mac and Windows PCs • Over-the-top (OTT) boxes: Apple TV, Roku • Game consoles Saturday, October 27, 12
  • 78. Let's Get Practical • What devices do you have to be on? • What devices will you get for free? • How to encode and deliver to the devices you need? Saturday, October 27, 12
  • 79. HLS Alternatives • Flash still rules on the desktop/browser space, thanks in part to Mozilla's obstinance about H.264 in <video> (irony alert: H.264 is the de facto standard for Flash video) • Adobe Dynamic Streaming and Microsoft Smooth Streaming are highly similar to HLS: bitrate-adaptive streams over HTTP Saturday, October 27, 12
  • 80. MPEG-DASH • Attempt at a standardized approach to HTTP adaptive-bitrate streaming. ISO/IEC 23009-1. http://xkcd.com/927/ Saturday, October 27, 12
  • 81. Emerging Consensus • Flash for PCs • HTTP Live Streaming for iOS • Plus whatever other devices you need to support Saturday, October 27, 12
  • 82. Real-World HLS • Can you competently encode all your media at all the variant bitrates you need? • Do you have a way to QC all your streams? • Can you handle the server load? Saturday, October 27, 12
  • 83. Content Delivery Networks http://en.wikipedia.org/wiki/Content_delivery_network Saturday, October 27, 12
  • 84. Content Delivery Networks • CDNs host your media on edge servers that are closer to your clients. Less strain on your servers and the backbones. • Examples: Akamai, Limelight, EdgeCast • Big media companies may have their own CDN • Most already know how to do HLS Saturday, October 27, 12
  • 85. Buy or Build: Encoders Saturday, October 27, 12
  • 86. Build or Buy: Services • Provide hosting, transcoding, bandwidth • All-in-one: UStream, LiveStream, Justin.tv / Twitch.tv (all of which have iOS apps) • May provide broadcast tools (Flash applet, Telestream Wirecast, etc. • Often free with ads; you pay to go ad-free, embed on your site, etc. Saturday, October 27, 12
  • 87. invalidstream http://www.ustream.tv/channel/invalidstream Saturday, October 27, 12
  • 88. Buy or Build: Bandwidth • Each HLS client will consume up to 1GB / hour, depending on variant bitrates, client bandwidth, etc. • Many CDNs charge around $0.20/GB. Saturday, October 27, 12
  • 89. Bandwidth Costs Prices from ScaleEngine, UStream, and LiveStream as of October 2012 Saturday, October 27, 12
  • 90. Bandwidth Costs Prices from ScaleEngine, UStream, and LiveStream as of October 2012 Saturday, October 27, 12
  • 91. Bandwidth Costs Prices from ScaleEngine, UStream, and LiveStream as of October 2012 Saturday, October 27, 12
  • 92. Bandwidth Costs Prices from ScaleEngine, UStream, and LiveStream as of October 2012 Saturday, October 27, 12
  • 94. Takeaways • HLS is a very practical streaming solution • Only part of the picture if you're multi-platform • Encoding and serving correctly requires some care and expertise, and a lot of money • Client-side software requirements are fairly simple Saturday, October 27, 12
  • 95. Q&A Slides and code will be available on my blog: http://www.subfurther.com/blog http://www.slideshare.net/invalidname @invalidname Saturday, October 27, 12