manumateos.dev

Obtener capturas de pantalla de un vídeo

La funcionalidad que estoy intentando implementar implica una cuestión muy concreta: necesito mostrar miniaturas de momentos aleatorios de un vídeo en streaming HLS. El ejemplo es el reproductor de YouTube: cuando se arrastra la barra atrás o adelante, se muestra una miniatura para indicar qué parte del vídeo es la afectada.

El método recomendado, en principio, es tener un AVPlayer con el rate establecido a 0, de manera que el propio AVPlayer se encargue de llevar el vídeo a esos momentos, pararlo y mostrar la imagen en la pantalla. Ese player ya puede estar incrustado en cualquier AVPlayerViewController (y la view de este controller, como una subview de cualquier otra vista), sin ningún problema.

Failed to get video thumbnail from AVPlayer using Fairplay HLS

AVAssetImageGenerator

El método AVAssetImageGenerator.copyCGImageAtTime en principio debería funcionar, pero aparentemente no genera resultados para assets que sean remotos y no locales. No descarto que el problema estuviera relacionado con el DRM que utilizan los streams que manejo, y que en ese momento no estaba tratando de ninguna manera.

Generating Video Thumbnails at Runtime in iOS (Swift)

Además, tendría una penalización de rendimiento bastante fuerte (el método funciona de manera síncrona; para este caso habría que generar determinadas capturas en segundo plano y cachearlas de alguna manera).

Este método podría servir para tener marcas de capítulos, pero para ir generando capturas en vivo, que es el caso que necesito resolver. Habría otro método específico que podría servir todavía mejor: [generateCGImagesAsynchronously(forTimes:completionHandler:)](https://developer.apple.com/documentation/avfoundation/avassetimagegenerator/1388100-generatecgimagesasynchronously).