Не удалось получить миниатюру видео из AVPlayer с помощью Fairplay HLS
Я пытаюсь создать пользовательский индикатор выполнения для приложения видеоплеера в tvOS и хотел бы показывать эскизы видео, пока пользователь просматривает видео.
я использую AVPlayer
и Fairplay HLS для воспроизведения удаленных видеофайлов. Я пытался сделать это, используя 2 метода. Один с AVAssetImageGenerator
"s copyCGImage
, а другой с AVPlayerItemVideoOutput
"s 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)
Есть идеи, что я делаю не так или есть другой способ?
Спасибо!
1 ответ
Обычно это делается с использованием потока специализированного режима воспроизведения, связанного с вашим реальным потоком.
https://en.wikipedia.org/wiki/Trick_mode
Вы можете найти его объявленным с ключом EXT-XI-FRAME-STREAM-INF в манифесте вашего потока HLS. Регулярное выражение может потребоваться для анализа его значения.
"#EXT-X-I-FRAME-STREAM-INF[^#]*URI=[^#]*"
Получив URL-адрес потока специализированного режима воспроизведения, вы можете использовать приостановленный экземпляр AVPlayer в качестве эскиза. И когда пользователь проведет пальцем влево и вправо, вы должны искать игрока на миниатюре, чтобы показать правильный кадр.