swift - 无法使用 Fairplay HLS 从 AVPlayer 获取视频缩略图
问题描述
我正在尝试为 tvOS 中的视频播放器应用程序构建自定义进度条,并希望在用户扫描视频时显示视频的缩略图。
我正在使用AVPlayer
Fairplay HLS 来播放远程视频文件。我尝试使用 2 种方法来做到这一点。一个带有AVAssetImageGenerator
's copyCGImage
,另一个带有AVPlayerItemVideoOutput
'copyPixelBuffer
方法。两者都返回零。
当我尝试使用本地视频文件时,第一种方法有效。
方法一:
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)
有什么想法我做错了什么还是有其他方法?
谢谢!
解决方案
这通常是通过使用与您的实际流相关联的特技播放流来完成的。
https://en.wikipedia.org/wiki/Trick_mode
您可以在 HLS 流的清单中找到使用键 EXT-XI-FRAME-STREAM-INF 声明的它。可能需要一个正则表达式来解析它的值。
"#EXT-X-I-FRAME-STREAM-INF[^#]*URI=[^#]*"
获得特技播放流的 URL 后,您可以使用暂停的 AVPlayer 实例作为缩略图。当用户左右滑动时,您应该在缩略图中寻找播放器以显示右帧。
推荐阅读
- go - GoTa 系列显示 NaN,但调试器显示值
- amazon-cloudformation - 如何生成 YAML 格式的 Canformation 模板?
- php - 在 PHP 中使用接口有什么好处,它的真正用途在哪里?
- microservices - 理想的速率限制行为
- android - AdMob 广告检查器无法在 Android 10 设备上启动
- android - Android自动备份不适用于三星手机
- android - 在 API 级别 30 之后,您的应用程序中还能以某种方式使用 toast 吗?
- scala - 什么时候实现了自动 Spark RDD 分区缓存驱逐?
- python - 参数字典包含方法的不可空类型“System.Int32”的参数“okres”的空条目
- swift - 以团队名称为类别的 Xcode 应用发布