Search code examples
iosavplayerhttp-live-streamingplaylistsegment

does AVPlayer play the video chunk when number of media segments are less


I'm not sure on this - when AVPlayer receives the Playlist file which does not have sufficient media segments (like only 1 or 2 media segments only there in playlist as shown below). And as per As per the HLS Authoring Specification for Apple Devices document

> 7. Media segmentation requirements

7.6. Segment durations SHOULD be nominally 6 seconds (e.g., NTSC 29.97 may be 6.006 seconds).

7.7. Media segments MUST NOT exceed the target duration by more than 0.5 seconds.

Below are my sample playlist file for VOD

#EXTM3U
   #EXT-X-VERSION:4
   #EXT-X-TARGETDURATION:2
   #EXT-X-MEDIA-SEQUENCE:56
   #EXT-X-ALLOW-CACHE:NO
   #EXT-X-DISCONTINUITY
   #EXTINF:2.009,
   http://media.example.com/first.ts

   #EXTM3U
   #EXT-X-VERSION:4
   #EXT-X-TARGETDURATION:2
   #EXT-X-MEDIA-SEQUENCE:56
   #EXT-X-ALLOW-CACHE:NO
   #EXT-X-DISCONTINUITY
   #EXTINF:2.003,
   http://media.example.com/Second.ts

   #EXTM3U
   #EXT-X-VERSION:4
   #EXT-X-TARGETDURATION:2
   #EXT-X-MEDIA-SEQUENCE:56
   #EXT-X-ALLOW-CACHE:NO
   #EXT-X-DISCONTINUITY
   #EXTINF:2.003,
   http://media.example.com/third.ts

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

   #EXTM3U
   #EXT-X-VERSION:4
   #EXT-X-TARGETDURATION:2
   #EXT-X-MEDIA-SEQUENCE:56
   #EXT-X-ALLOW-CACHE:NO
   #EXT-X-DISCONTINUITY
   #EXTINF:2.004,
   http://media.example.com/first.ts
   #EXTINF:2.007,
   http://media.example.com/second.ts
   #EXTINF:2.003,

======================================================

   #EXTM3U
   #EXT-X-VERSION:4
   #EXT-X-TARGETDURATION:2
   #EXT-X-MEDIA-SEQUENCE:56
   #EXT-X-ALLOW-CACHE:NO
   #EXT-X-DISCONTINUITY
   #EXTINF:2.009,
   http://media.example.com/first.ts
   #EXTINF:2.008,
   http://media.example.com/second.ts
   #EXTINF:2.003,

So my question is - will AVPlayer play content only when all 3 media segments available or will play even when 1 or 2 media segments available as shown above ??


Solution

  • Yes.. AVPlayer will play the playlist which has one or more video chunk or .ts packet.I did try at my end.. by using video chunk of 2 seconds in playlist file and it did work. Below is sample code used for testing.

    let urlStr = URL(string: "http://100.177.1.101/jumpingBunny.m3u8")
    
    let asset = AVAsset(url: (urlStr ?? nil)!)
    let playerItem = AVPlayerItem(asset: asset)
    let player = AVPlayer(playerItem: playerItem)
    
    var playerLayer: AVPlayerLayer?
    playerLayer = AVPlayerLayer(player: player)
    playerLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
    playerLayer!.frame = self.view.frame
    self.view!.layer.addSublayer(playerLayer!)
    
    let playerViewController = AVPlayerViewController()
    playerViewController.player = player
    playerViewController.showsPlaybackControls = true
    
    player.play()