我正在尝试为tvOS中的视频播放器应用构建自定义进度条,并希望在用户扫描视频时显示视频的缩略图。
我正在使用AVPlayer
和Fairplay HLS来播放远程视频文件。我试过用2种方法做到这一点。一个用AVAssetImageGenerator
的copyCGImage
,另一个用AVPlayerItemVideoOutput
的copyPixelBuffer
方法。两者都归零。
当我尝试使用本地视频文件时,第一种方法有效。
方法1:
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)
}
方法2:
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-X-I-FRAME-STREAM-INF声明的声明。可能需要正则表达式来解析其值。
"#EXT-X-I-FRAME-STREAM-INF[^#]*URI=[^#]*"
获得特技播放流的URL后,可以使用暂停的AVPlayer实例作为缩略图。当用户向左和向右滑动时,您应该在缩略图中查找播放器以显示正确的帧。