5

Я использую это для справки: Getting thumbnail from a video url or data in IPhone SDKСоздание эскизов из видео - ios7

метод использует класс MPMoviePlayerController вместо AVFoundation, и я думаю, что я хочу использовать это, а также потому, что люди говорили, что MPMoviePlayer путь быстрее, чем AVFoundation.

Проблема заключается в том, что метод, используемый для создания миниатюр, [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame] устарел в iOS 7.0.

Просмотрев документы яблока, оставшиеся поддерживаемые способы создания миниатюр - это методы (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option и (void)cancelAllThumbnailImageRequests. Но, как диктует подписи методов, эти методы ничего не возвращают. Итак, как мне получить доступ к миниатюре UIImage, созданной этими методами?

Если это помогает, это то, что я до сих пор с точки зрения кода:

self.videoURL = info[UIImagePickerControllerMediaURL]; 
    NSData *videoData = [NSData dataWithContentsOfURL:self.videoURL]; 

    //Create thumbnail image 
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:self.videoURL]; 
    [player requestThumbnailImagesAtTimes:@[@1] timeOption:MPMovieTimeOptionNearestKeyFrame]; 
    //UIImage *thumbnail = ??? 

Как получить ссылку UIImage в миниатюре?

EDIT Я понял, как создать уведомление для запроса миниатюрного изображения (с использованием this question в качестве ссылки). Однако я понимаю, что этот метод работает асинхронно из основного потока, и поэтому мой метод обработчика уведомлений, похоже, никогда не называется.

Это то, что у меня есть сейчас.

self.videoURL = info[UIImagePickerControllerMediaURL]; 
    NSData *videoData = [NSData dataWithContentsOfURL:self.videoURL]; 
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:self.videoURL]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleThumbnailImageRequestFinishNotification:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:player]; 
    [player requestThumbnailImagesAtTimes:@[@1] timeOption:MPMovieTimeOptionNearestKeyFrame]; 

И тогда мой метод обработчика:

-(void)handleThumbnailImageRequestFinishNotification:(NSNotification*)notification 
{ 
    NSDictionary *userinfo = [notification userInfo]; 
    NSError* value = [userinfo objectForKey:MPMoviePlayerThumbnailErrorKey]; 
if (value != nil) 
{ 
    NSLog(@"Error creating video thumbnail image. Details: %@", [value debugDescription]); 
} 
else 
{ 
    UIImage *thumbnail = [userinfo valueForKey:MPMoviePlayerThumbnailImageKey]; 
} 

Но обработчик никогда не вызывается (или так кажется).

ответ

1

Если ваш URL-адрес является потоком в прямом эфире HTTP, он ничего не вернет в соответствии с документами. Для URL-адреса файла я обнаружил, что мне пришлось запустить запрос после воспроизведения фильма, или он никогда не будет вызван.

14

Попробуйте этот путь.

import AVFoundation framework 

в * .h

#import <AVFoundation/AVFoundation.h> 

в * .m

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:self.urlForConevW options:nil]; 
AVAssetImageGenerator *generateImg = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
NSError *error = NULL; 
CMTime time = CMTimeMake(1, 65); 
CGImageRef refImg = [generateImg copyCGImageAtTime:time actualTime:NULL error:&error]; 
NSLog(@"error==%@, Refimage==%@", error, refImg); 

UIImage *FrameImage= [[UIImage alloc] initWithCGImage:refImg]; 
+1

Работает, спасибо. – c0d3Junk13

+0

@ c0d3Junk13 приветствую :) – sankalp

3

Вот код, чтобы сделать миниатюру видео и сохранять изображения в DocumentDirectory ..

//pass the video_path to NSURL 
NSURL *videoURL = [NSURL fileURLWithPath:strVideoPath]; 

AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:videoURL options:nil]; 
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset1]; 
generator.appliesPreferredTrackTransform = YES; 

//Set the time and size of thumbnail for image 
NSError *err = NULL; 
CMTime thumbTime = CMTimeMakeWithSeconds(0,30); 
CGSize maxSize = CGSizeMake(425,355); 
generator.maximumSize = maxSize; 

CGImageRef imgRef = [generator copyCGImageAtTime:thumbTime actualTime:NULL error:&err]; 
UIImage *thumbnail = [[UIImage alloc] initWithCGImage:imgRef]; 

//And you can save the image to the DocumentDirectory 
NSData *data = UIImagePNGRepresentation(thumbnail); 

//Path for the documentDirectory 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
[data writeToFile:[documentsDirectory stringByAppendingPathComponent:currentFileName] atomically:YES]; 
Смежные вопросы