【问题标题】:does AVPlayer play the video chunk when number of media segments are less当媒体段数较少时,AVPlayer 是否播放视频块
【发布时间】:2020-06-10 00:55:17
【问题描述】:

对此我不确定 - 当 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 个媒体片段可用时播放内容,如上所示??

【问题讨论】:

  • AVPlayer 会逐个下载片段并相应地播放。因此,播放列表中有多少段可用并不重要。请注意,下载是基于网络带宽的。如果基于应用程序设置的可用网络带宽和缓冲区,它还可以缓冲段。
  • @lloydTheCoder - 根据 HLS 文档,每个媒体播放列表必须至少为 6 秒,因此如果段数少于 6 秒.. AVPlayer 是否会渲染??

标签: ios avplayer http-live-streaming playlist segment


【解决方案1】:

是的.. 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()

【讨论】:

    猜你喜欢
    • 2018-04-13
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多