【问题标题】:How to show paused video instead of black screen when starting AVPlayer启动 AVPlayer 时如何显示暂停的视频而不是黑屏
【发布时间】:2017-04-20 22:26:34
【问题描述】:

我能够成功创建播放器,但对最初的黑屏感到恼火。我决定覆盖 UIImageView 并在播放器启动后将其隐藏。这行得通,但我不想为我的所有视频创建和维护图像的麻烦。

通过播放并在实例化播放器后立即暂停播放器,我能够获得我想要的确切结果。唯一的问题是有时播放器的状态记录不正确,所以当我再次启动播放器时,即使播放器暂停,状态也列为“正在播放”。

我开始研究使用 AVPlayerItem seekToTime,但没有找到任何可行的解决方案。有没有一种“非 hacky”的方式来实现这一点?

【问题讨论】:

  • 我认为 Larme 提到的链接会给你一个正确的方向。按需创建缩略图,并将其覆盖在播放器顶部(可能还有播放按钮),这样您就不必立即播放和暂停
  • 在我必须构建的项目中,我需要在另一个没有黑屏或缩略图的情况下播放新视频。客户要求我从第一个视频传递到第二个,就好像第二个是下一帧一样,没有中断

标签: ios avfoundation avplayer


【解决方案1】:

如果您使用的是AVPlayerViewController,这是对播放器控制器contentOverlayView 属性的完美使用。这是播放器层和为此目的而公开的控件之间的UIView:

首先,创建截图:

let asset = AVAsset(URL: URL(string: "")!) // link to some video
let imageGenerator = AVAssetImageGenerator(asset: asset)
let screenshotTime = CMTime(seconds: 1, preferredTimescale: 1)
if let imageRef = try? imageGenerator.copyCGImageAtTime(screenshotTime, actualTime: nil) {

    let image = UIImage(CGImage: imageRef)

    // see part 2 below
}

现在,将图像添加为播放器控制器中contentOverlayView 的子视图:

// in the same try block

let imageView = UIImageView(image: image)
let playerVC = AVPlayerViewController()
let playerItem = AVPlayerItem(asset: asset)
playerVC.player = AVPlayer(playerItem: playerItem)

self.presentViewController(playerVC, animated: true) { 
    playerVC.contentOverlayView?.addSubview(imageView)
    // adjust the frame of your imageView to fit on the player controller's contentOverlayView
}

然后,在播放器开始播放资源或缓冲完成时移除 imageView 子视图。

【讨论】:

    【解决方案2】:

    与播放器关联的 AVPlayerLayer 有一个 readyForDisplay 属性。

    您可以尝试让您的主机视图成为该值的观察者,并在它设置为 true 后立即进行刷新。

    当第一帧准备好渲染时设置为true,因此在播放器有足够的数据播放之前将其状态设置为readyToPlay。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      相关资源
      最近更新 更多