tool - UIImagePickerController miniatura del video que es recogido de la biblioteca
palabras mas buscadas en youtube (4)
Estoy tratando de obtener la miniatura del video que se recoge de la biblioteca utilizando el UIImagePickerController.
Aquí está mi código. Puedo obtener la miniatura del video si uso la cámara para grabar un video. Pero no puedo obtener la miniatura si recojo un video de la biblioteca. ¿Alguien sabe por qué?
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])
{
NSURL *mediaUrl = [info objectForKey:UIImagePickerControllerMediaURL];
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:mediaUrl];
moviePlayer.shouldAutoplay = NO;
UIImage *thumbnail = [[moviePlayer thumbnailImageAtTime:0.0 timeOption:MPMovieTimeOptionNearestKeyFrame] retain];
[imageView setImage:thumbnail]; //imageView is a UIImageView
[moviePlayer release];
[thumbnail release];
[self dismissModalViewControllerAnimated:YES];
}
}
El marco de AssetsLibrary tiene exactamente lo que necesita con las clases ALAssetsLibrary
y ALAsset
. Este código funciona tanto para fotos como para videos y la imagen en miniatura es exactamente la misma que se ve en el selector.
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[[ALAssetsLibrary new] assetForURL:info[UIImagePickerControllerReferenceURL] resultBlock:^(ALAsset *asset) {
imageView.image = [UIImage imageWithCGImage:asset.thumbnail];
} failureBlock:^(NSError *error) {
// handle error
}];
[self dismissViewControllerAnimated:YES completion:nil];
}
Tenga en cuenta que hay un error en iOS 8 con los álbumes de Photo Stream, consulte ALAssetsLibrary assetForURL: siempre devuelve nil para las fotos en "My Photo Stream" en iOS 8.1 para una solución alternativa.
Swift 3.1
He creado una función de clase y paso tu url en param
class func captureThumbnail(withVideoURL videoURL:URL,secs:Int,preferredTimeScale scale:Int,completionHandler:((UIImage?) ->Void)?) -> Void
{
//let seconds : Int64 = 10
// let preferredTimeScale : Int32 = 1
DispatchQueue.global().async {
do
{
let asset = AVURLAsset(url: videoURL)
let imgGenerator = AVAssetImageGenerator(asset: asset)
imgGenerator.appliesPreferredTrackTransform = true
let cgImage = try imgGenerator.copyCGImage(at:CMTimeMake(Int64(secs), Int32(scale)),actualTime: nil)
let thumbnail = UIImage(cgImage: cgImage)
completionHandler?(thumbnail)
}
catch let error as NSError
{
print("Error generating thumbnail: /(error)")
completionHandler?(nil)
}
}
}
Tuve un problema semi relacionado y finalmente abandoné el uso de MPMoviePlayer para generar miniaturas. Pruebe usar AVAssetImageGenerator en AVAssetImageGenerator lugar. Apple analiza el uso de AVAssetImageGenerator para crear miniaturas here . Aquí está mi propio código de muestra, que toma una única imagen en miniatura. Deberá incluir el marco AVFoundation.
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:vidPath options:nil];
AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
gen.appliesPreferredTrackTransform = YES;
CMTime time = CMTimeMakeWithSeconds(0.0, 600);
NSError *error = nil;
CMTime actualTime;
CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
UIImage *thumb = [[UIImage alloc] initWithCGImage:image];
CGImageRelease(image);
[gen release];
func videoSnapshot(filePathLocal:URL) -> UIImage? {
do
{
let asset = AVURLAsset(url: filePathLocal)
let imgGenerator = AVAssetImageGenerator(asset: asset)
imgGenerator.appliesPreferredTrackTransform = true
let cgImage = try imgGenerator.copyCGImage(at:CMTimeMake(Int64(0), Int32(1)),actualTime: nil)
let thumbnail = UIImage(cgImage: cgImage)
return thumbnail
}
catch let error as NSError
{
print("Error generating thumbnail: /(error)")
return nil
}
}