2013-10-14 10 views
5

ich diese Referenz bin mit: Getting thumbnail from a video url or data in IPhone SDKGenerieren von Thumbnail von Video - ios7

Das Verfahren der MPMoviePlayerController Klasse wird anstelle des AVFoundation, und ich glaube, ich möchte, dass auch benutzen, weil die Leute sagten, dass MPMoviePlayer Weg ist schneller als der AVFoundation Weg.

Das Problem ist, das Verfahren verwendet, um die Vorschaubilder zu erstellen, wird [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame] in iOS 7.0 veraltet.

Wenn Sie sich die Apple-Dokumente ansehen, sind die verbleibenden unterstützten Möglichkeiten zum Erstellen von Miniaturansichten die Methoden (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option und . Aber wie die Methodensignaturen vorschreiben, geben diese Methoden nichts zurück. Wie greife ich auf die Thumbnail , die durch diese Methoden erstellt wird?

Wenn es hilft, ist es das, was ich bisher in Form von Code haben:

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 = ??? 

Wie kann ich auf das Bild, um eine UIImage Referenz bekommen?

EDIT ich herausgefunden, wie eine Benachrichtigung für die Thumbnail-Bild Anfrage erstellen (this question als Referenz). Allerdings stelle ich fest, dass diese Methode asynchron von dem Hauptthread arbeitet, und so meine Benachrichtigungs-Handhabungs-Methode scheint nicht immer genannt werden.

Dies ist, was ich jetzt habe. meine Handler-Methode

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]; 

Und dann:

-(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]; 
} 

Aber die Handler nie aufgerufen werden (oder so scheint es).

Antwort

1

Wenn Ihre URL an einen HTTP-Live-Stream ist, dann wird es nichts zurück, pro der Dokumentation. Bei einer Datei-URL habe ich festgestellt, dass ich die Anfrage nach dem Abspielen des Films starten musste, sonst würde sie nie aufgerufen werden.

14

Versuchen Sie, diese Art und Weise.

import AVFoundation framework 

in * .h

#import <AVFoundation/AVFoundation.h> 

in * .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

Werke, danke. – c0d3Junk13

+0

@ c0d3Junk13 Sie sind herzlich willkommen :) – sankalp

3

Hier ist ein Code, der eine Miniaturansicht des Videos zu machen und die Bilder auf die DocumentDirectory speichern ..

//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]; 
Verwandte Themen