para miniaturas crear como ios objective-c thumbnails video-thumbnails

crear - Creando miniaturas para video en iOS



como crear miniaturas para youtube 2019 (5)

Código para la solución que usa AVFoundation framework y Swift 3.0 (el código comentado no es necesario y se describe debajo del código; debe decidir si lo necesita o no):

import AVFoundation func generateThumbnailForVideo(at url: URL) -> UIImage? { let kPreferredTimescale: Int32 = 1000 let asset = AVURLAsset(url: url) let generator = AVAssetImageGenerator(asset: asset) generator.appliesPreferredTrackTransform = true //generator.requestedTimeToleranceBefore = kCMTimeZero //generator.requestedTimeToleranceAfter = kCMTimeZero //generator.maximumSize = CGSize(width: 100, height: 100) var actualTime: CMTime = CMTime(seconds: 0, preferredTimescale: kPreferredTimescale) //generates thumbnail at first second of the video let cgImage = try? generator.copyCGImage(at: CMTime(seconds: 1, preferredTimescale: kPreferredTimescale), actualTime: &actualTime) return cgImage.flatMap() { return UIImage(cgImage: $0, scale: UIScreen.main.scale, orientation: .up) } }

Tenga en cuenta que puede considerar ejecutar este código en un subproceso en segundo plano, ya que la creación de miniaturas puede ser potencialmente una operación costosa.

Además, eche un vistazo a algunas de las propiedades de la clase AVAssetImageGenerator :

  1. requestedTimeToleranceBefore ( documentación de Apple ):

El tiempo máximo antes de un tiempo solicitado para el cual se puede generar una imagen.

El valor predeterminado es kCMTimePositiveInfinity.

Establezca los valores de requiredTimeToleranceBefore y requestTimeToleranceAfter en kCMTimeZero para solicitar la generación de imágenes con precisión de trama; esto puede incurrir en un retraso de decodificación adicional.

  1. requestedTimeToleranceAfter ( documentación de Apple ):

El tiempo máximo después de un tiempo solicitado para el cual se puede generar una imagen.

El valor predeterminado es kCMTimePositiveInfinity.

Establezca los valores de requiredTimeToleranceBefore y requestTimeToleranceAfter en kCMTimeZero para solicitar la generación de imágenes con precisión de trama; esto puede incurrir en un retraso de decodificación adicional.

  1. maximumSize ( documentación de Apple ):

Especifica las dimensiones máximas para la imagen generada.

El valor predeterminado es CGSizeZero, que especifica las dimensiones sin escala del activo.

AVAssetImageGenerator escala las imágenes de modo que se ajusten al cuadro delimitador definido. Las imágenes nunca se amplían. La relación de aspecto de la imagen escalada está definida por la propiedad apertureMode.

Tengo una aplicación que estoy desarrollando para el iPhone. Lo que hace es capturar el video de la cámara y almacenar el archivo de video en el Sistema de archivos.

Necesito crear una imagen en miniatura de este archivo de video antes de guardar la imagen en el sistema de archivos. Mi motivo es mostrar una lista de miniaturas del video creado para que el usuario pueda seleccionar una miniatura específica para reproducir el archivo deseado.

¿Podría alguien avisarme sobre cómo puedo crear una imagen en miniatura de un archivo de video que ha sido capturado por la cámara?

Además, ¿puede avisarme si puedo crear una miniatura de un archivo de video existente con el SDK de iOS?


Prueba esto (en realidad no muestra el reproductor de películas):

+ (UIImage *)imageFromMovie:(NSURL *)movieURL atTime:(NSTimeInterval)time { // set up the movie player MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; mp.shouldAutoplay = NO; mp.initialPlaybackTime = time; mp.currentPlaybackTime = time; // get the thumbnail UIImage *thumbnail = [mp thumbnailImageAtTime:time timeOption:MPMovieTimeOptionNearestKeyFrame]; // clean up the movie player [mp stop]; [mp release]; return(thumbnail); }

Se supone que es una llamada sincrónica, por lo que podría bloquear el hilo principal, pero parece que se ejecuta de forma bastante instantánea para mí cuando uso un tiempo al principio de la película. Si estás haciendo esto mucho, puedes agregarlo como una categoría en UIImage, que es lo que hice.

Por su pregunta, veo que desea hacer esto antes de que se guarde la película, y supongo que podría no funcionar sin una URL de archivo. Sin embargo, si está utilizando UIImagePickerController para la captura de la cámara, puede pasar esta función a la URL devuelta en el diccionario de información de imagePickerController: didFinishPickingMediaWithInfo: con la clave UIImagePickerControllerMediaURL.


Prueba esto :

generate.requestedTimeToleranceBefore = kCMTimeZero; generate.requestedTimeToleranceAfter = kCMTimeZero;

Necesita agregarse para obtener el marco correcto.


Una solución mejor en realidad es usar el marco de AVFoundation para hacer esto. Evita la necesidad de construir un MPMoviePlayerController que cause el problema de que el Iris de la cámara permanezca cerrado si se usa junto con el UIImagePickerController (al menos eso es lo que experimenté).

El código que utilizo:

+ (UIImage *)thumbnailFromVideoAtURL:(NSURL *)contentURL { UIImage *theImage = nil; AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:contentURL options:nil]; AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; generator.appliesPreferredTrackTransform = YES; NSError *err = NULL; CMTime time = CMTimeMake(1, 60); CGImageRef imgRef = [generator copyCGImageAtTime:time actualTime:NULL error:&err]; theImage = [[[UIImage alloc] initWithCGImage:imgRef] autorelease]; CGImageRelease(imgRef); [asset release]; [generator release]; return theImage; }


Muy simple prueba esto ...

Paso 1 : Importar encabezado #import <MediaPlayer/MediaPlayer.h>

Paso 2 : Obtener ruta url

NSURL *videoURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Sample" ofType:@"m4v"]];

Paso 3 : Finalmente obtener miniatura

- (UIImage *)VideoThumbNail:(NSURL *)videoURL { MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL]; UIImage *thumbnail = [player thumbnailImageAtTime:52.0 timeOption:MPMovieTimeOptionNearestKeyFrame]; [player stop]; return thumbnail; }