首页 > 解决方案 > 当媒体段数较少时,AVPlayer 是否播放视频块

问题描述

我对此不确定 - 当 AVPlayer 收到没有足够媒体段的播放列表文件时(如播放列表中只有 1 或 2 个媒体段,如下所示)。并根据 Apple 设备文档的 HLS 创作规范

> 7. 媒体细分要求

7.6. 段持续时间名义上应该是 6 秒(例如,NTSC 29.97 可能是 6.006 秒)。

7.7. 媒体片段不得超过目标持续时间超过 0.5 秒。

以下是我的 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,

所以我的问题是 - AVPlayer 是否会仅在所有 3 个媒体片段都可用时播放内容,或者即使 1 或 2 个媒体片段都可用,如上图所示?

标签: iosavplayerhttp-live-streamingplaylistsegment

解决方案


是的.. AVPlayer 将播放具有一个或多个视频块或 .ts 数据包的播放列表。我在最后尝试过.. 通过在播放列表文件中使用 2 秒的视频块,它确实有效。下面是用于测试的示例代码。

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()

推荐阅读