Не удалось получить миниатюру видео из 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 в качестве эскиза. И когда пользователь проведет пальцем влево и вправо, вы должны искать игрока на миниатюре, чтобы показать правильный кадр.

Другие вопросы по тегам