【问题标题】:Failed to get video thumbnail from AVPlayer using Fairplay HLS无法使用 Fairplay HLS 从 AVPlayer 获取视频缩略图
【发布时间】:2019-07-04 04:19:14
【问题描述】:

我正在尝试为 tvOS 中的视频播放器应用构建自定义进度条,并希望在用户扫描视频时显示视频的缩略图。

我正在使用 AVPlayer 和 Fairplay HLS 播放远程视频文件。我尝试使用 2 种方法来做到这一点。一个使用AVAssetImageGenerator 的copyCGImage,另一个使用AVPlayerItemVideoOutput 的copyPixelBuffer 方法。两者都返回 nil。

当我尝试使用本地视频文件时,第一种方法有效。

方法一:

let imageGenerator = AVAssetImageGenerator(asset: playerItem.asset)
let progressSeconds = playerItem.duration.seconds * Double(progress)
let time = CMTime(seconds: progressSeconds, preferredTimescale: 5)
if let imageRef = try? imageGenerator.copyCGImage(at: time, actualTime: nil) {
   image = UIImage(cgImage:imageRef)
}

方法二:

let videoThumbnailsOutput = AVPlayerItemVideoOutput(pixelBufferAttributes: [String(kCVPixelBufferPixelFormatTypeKey): NSNumber(value: kCVPixelFormatType_32BGRA)])
player?.currentItem?.add(videoThumbnailsOutput)

if let pixelBuffer = videoThumbnailsOutput.copyPixelBuffer(forItemTime: time, itemTimeForDisplay: nil) {
   let ciImage = CIImage(cvPixelBuffer: pixelBuffer)

任何想法我做错了什么或有其他方法吗?

谢谢!

【问题讨论】:

  • 我认为这通常是在服务器端完成的,缩略图是清单的一部分......
  • 如果是这样,如何从清单中获取缩略图?

标签: swift avfoundation tvos http-live-streaming fairplay


【解决方案1】:

这通常是通过使用与您的实际流相关联的特技播放流来完成的。

https://en.wikipedia.org/wiki/Trick_mode

您可以在 HLS 流的清单中找到使用键 EXT-X-I-FRAME-STREAM-INF 声明的它。可能需要一个正则表达式来解析它的值。

"#EXT-X-I-FRAME-STREAM-INF[^#]*URI=[^#]*"

获得特技播放流的 URL 后,您可以使用暂停的 AVPlayer 实例作为缩略图。并且当用户左右滑动时,您应该在缩略图中寻找播放器以显示正确的帧。

【讨论】:

  • 问题是每次搜索需要一两秒钟,我想像苹果播放器提供的那样立即获得。您是否知道一种方法,可以预加载所有(缩小的)视频,以便更快地发生?
  • 我是 AVPlayer 的新手,想像 YouTube 一样添加特技播放。我浏览了许多文档,但找不到任何东西。 AVPlayer for iOS 是否支持特技播放功能? Apple TV 支持:developer.apple.com/videos/play/techtalks-apple-tv/6
  • 即使 I-FRAME-STREAM 受 Apple Fairplay DRM 保护,这仍然有效?
猜你喜欢
  • 1970-01-01
  • 2019-02-23
  • 2013-08-31
  • 2017-10-21
  • 2011-05-25
  • 2011-10-12
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
相关资源
最近更新 更多