Ich versuche, den ersten Frame aus dem ausgewählten Video in einer UIImagePickerController
in einer UIImageView
zu zeigen, aber ich weiß nicht, ob es möglich ist. Wenn ja, wie würde ich es tun?Ergreifung des ersten Frames eines Videos von UIImagePickerController?
Antwort
Sie können dies auf zwei Arten tun. Der erste Weg ist die MPMoviePlayerController
zu verwenden, um das Bild um es zu packen:
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc]
initWithContentURL:videoURL];
moviePlayer.shouldAutoplay = NO;
UIImage *thumbnail = [moviePlayer thumbnailImageAtTime:time
timeOption:MPMovieTimeOptionNearestKeyFrame];
Dies funktioniert, aber MPMoviePlayerController
ist keine besonders leichte Aufgabe und nicht besonders schnell greifen Thumbnails.
Der bevorzugte Weg ist die Verwendung der neuen AVAssetImageGenerator
in AVFoundation. Das ist schnell, leicht und flexibler als früher. Hier ist eine Hilfsmethode, die ein automatisch freigegebenes Bild aus dem Video zurückgibt.
+ (UIImage *)thumbnailImageForVideo:(NSURL *)videoURL
atTime:(NSTimeInterval)time
{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
NSParameterAssert(asset);
AVAssetImageGenerator *assetIG =
[[AVAssetImageGenerator alloc] initWithAsset:asset];
assetIG.appliesPreferredTrackTransform = YES;
assetIG.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;
CGImageRef thumbnailImageRef = NULL;
CFTimeInterval thumbnailImageTime = time;
NSError *igError = nil;
thumbnailImageRef =
[assetIG copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60)
actualTime:NULL
error:&igError];
if (!thumbnailImageRef)
NSLog(@"thumbnailImageGenerationError %@", igError);
UIImage *thumbnailImage = thumbnailImageRef
? [[UIImage alloc] initWithCGImage:thumbnailImageRef]
: nil;
return thumbnailImage;
}
Asynchronous Nutzung
- (void)thumbnailImageForVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time completion:(void (^)(UIImage *)) completion
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
NSParameterAssert(asset);
AVAssetImageGenerator *assetIG =
[[AVAssetImageGenerator alloc] initWithAsset:asset];
assetIG.appliesPreferredTrackTransform = YES;
assetIG.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;
CGImageRef thumbnailImageRef = NULL;
CFTimeInterval thumbnailImageTime = time;
NSError *igError = nil;
thumbnailImageRef =
[assetIG copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60)
actualTime:NULL
error:&igError];
if (!thumbnailImageRef)
NSLog(@"thumbnailImageGenerationError %@", igError);
UIImage *thumbnailImage = thumbnailImageRef
? [[UIImage alloc] initWithCGImage:thumbnailImageRef]
: nil;
dispatch_async(dispatch_get_main_queue(), ^{
completion(thumbnailImage);
});
});
}
Sie müssen das Framework "Core Media" auch zu Ihrem Ziel hinzufügen. –
+1 Mein Kollege war nicht in der Lage, etwas zu schreiben, aber thx zu dir ... –
für andere, die versucht, dies zu verwenden: achten Sie darauf, wenn die videoURL von fileURLWithPath oder URLWithString erstellt wurde (wenn Sie den Pfad in NSString haben *) – user1105951
ähnliche Frage http://stackoverflow.com/questions/1347562/getting-thumbnail-from-a-video-url-or-data-in-iphone-sdk –