optimized - thumbnailImageAtTime: ahora en desuso-¿Cuál es la alternativa?
seo images (7)
Hasta iOS7 actualización que estaba usando ...
UIImage *image = [moviePlayer thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
... con gran éxito, para que mi aplicación pudiera mostrar el video que el usuario acaba de tomar.
Entiendo que este método, a partir de iOS7 ahora se ha desaprobado y necesito una alternativa. Veo que hay un método de
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option
sin embargo, ¿cómo devuelvo la imagen para poder ubicarla dentro de la imagen del botón videoReview?
Gracias de antemano, Jim.
**** Pregunta editada, después de intentar el método de centro de notificación ***
Use el siguiente código -
[moviePlayer requestThumbnailImagesAtTimes:times timeOption:MPMovieTimeOptionNearestKeyFrame];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification::) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];
Hice los tiempos de NSArray de dos objetos NSNumber 1 y 2.
Luego traté de capturar la notificación en el siguiente método
-(void)MPMoviePlayerThumbnailImageRequestDidFinishNotification: (NSDictionary*)info{
UIImage *image = [info objectForKey:MPMoviePlayerThumbnailImageKey];
Luego procedió a usar esta imagen en miniatura como imagen del botón como una vista previa ... pero no funcionó.
Si puede ver desde mi codificación donde he fallado, su ayuda será apreciada nuevamente. Aclamaciones
Acabo de buscar una solución para este problema y obtuve una buena ayuda de su pregunta. Consiguió su código anterior para trabajar con un pequeño cambio, eliminó un punto ...
Cambio
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification::) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];
a
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];
Tengo esto para trabajar bien. Además, descubrí que no puedes llamar a un método para confiar en NotificationCenter si ya estás en un selector de notificaciones. Algo que intenté al principio: intenté llamar a requestThumbnailImagesAtTimes
dentro del selector de notificación para MPMoviePlayerPlaybackDidFinishNotification
, algo que no funcionará. Creo que porque la notificación no se activará.
El código en Swift 2.1 se vería así:
do{
let asset1 = AVURLAsset(URL: url)
let generate1: AVAssetImageGenerator = AVAssetImageGenerator(asset: asset1)
generate1.appliesPreferredTrackTransform = true
let time: CMTime = CMTimeMake(3, 1) //TO CATCH THE THIRD SECOND OF THE VIDEO
let oneRef: CGImageRef = try generate1.copyCGImageAtTime(time, actualTime: nil)
let resultImage = UIImage(CGImage: oneRef)
}
catch let error as NSError{
print(error)
}
El método requestThumbnailImagesAtTimes: timeOption: publicará una notificación MPMoviePlayerThumbnailImageRequestDidFinishNotification
cuando se complete una solicitud de imagen. El código que necesita la imagen en miniatura debe suscribirse a esta notificación mediante NSNotificationCenter
y utilizar la imagen cuando reciba la notificación.
El problema es que debe especificar valores flotantes en requestThumbnailImagesAtTimes
.
Por ejemplo, esto funcionará
[self.moviePlayer requestThumbnailImagesAtTimes:@[@14.f] timeOption:MPMovieTimeOptionNearestKeyFrame];
pero esto no funcionará :
[self.moviePlayer requestThumbnailImagesAtTimes:@[@14] timeOption:MPMovieTimeOptionNearestKeyFrame];
Jeely proporciona un buen trabajo, pero requiere una biblioteca adicional que no es necesaria cuando MPMoviePlayer ya proporciona funciones para esta tarea. Noté un error de sintaxis en el código del póster original. El controlador de notificación de miniaturas espera un objeto de tipo NSNotification, no un objeto de diccionario. Aquí hay un ejemplo corregido:
-(void)MPMoviePlayerThumbnailImageRequestDidFinishNotification: (NSNotification*)note
{
NSDictionary * userInfo = [note userInfo];
UIImage *image = (UIImage *)[userInfo objectForKey:MPMoviePlayerThumbnailImageKey];
if(image!=NULL)
[thumbView setImage:image];
}
La forma de hacerlo, al menos en iOS7 es usar flotadores para su tiempo
NSNumber *timeStamp = @1.f;
[moviePlayer requestThumbnailImagesAtTimes:timeStamp timeOption:MPMovieTimeOptionNearestKeyFrame];
Espero que esto ayude
Logré encontrar una excelente manera de usar AVAssetImageGenerator, por favor vea el código a continuación ...
AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:partOneUrl options:nil];
AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
generate1.appliesPreferredTrackTransform = YES;
NSError *err = NULL;
CMTime time = CMTimeMake(1, 2);
CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
UIImage *one = [[UIImage alloc] initWithCGImage:oneRef];
[_firstImage setImage:one];
_firstImage.contentMode = UIViewContentModeScaleAspectFit;
Dentro del archivo de encabezado, por favor importe
#import <AVFoundation/AVFoundation.h>
Funciona perfecto y he podido llamarlo desde viewDidLoad, que fue más rápido que llamar al desaprobado thumbNailImageAtTime: desde viewDidAppear.
Espero que esto ayude a cualquier otra persona que tenga el mismo problema.