J'essaie d'acquérir une vignette à partir d'une URL de vidéo. La vidéo est un flux (HLS) au format m3u8 ... J'ai déjà essayé requestThumbnailImagesAtTimes du MPMoviePlayerController, mais cela n'a pas fonctionné. Quelqu'un at-il une solution à ce problème? Si oui comment l'avez-vous fait?
Si vous ne voulez pas utiliser MPMoviePlayerController
, vous pouvez faire ceci:
AVAsset *asset = [AVAsset assetWithURL:sourceURL];
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
CMTime time = CMTimeMake(1, 1);
CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef); // CGImageRef won't be released by ARC
Voici un exemple dans Swift:
func thumbnail(sourceURL sourceURL:NSURL) -> UIImage {
let asset = AVAsset(URL: sourceURL)
let imageGenerator = AVAssetImageGenerator(asset: asset)
let time = CMTime(seconds: 1, preferredTimescale: 1)
do {
let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
return UIImage(CGImage: imageRef)
} catch {
print(error)
return UIImage(named: "some generic thumbnail")!
}
}
Je préfère utiliser AVAssetImageGenerator
plutôt que MPMoviePlayerController
car il s'agit d'un thread-safe et vous pouvez avoir plus d'une instance à la fois.
-(UIImage *)loadThumbNail:(NSURL *)urlVideo
{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:urlVideo options:nil];
AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generate.appliesPreferredTrackTransform=TRUE;
NSError *err = NULL;
CMTime time = CMTimeMake(1, 60);
CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
NSLog(@"err==%@, imageRef==%@", err, imgRef);
return [[UIImage alloc] initWithCGImage:imgRef];
}
Ajoutez le cadre AVFoundation
dans votre projet et n'oubliez pas d'importer <AVFoundation/AVFoundation.h>
. Vous devez ensuite indiquer le chemin d'accès de votre vidéo enregistrée dans le répertoire de documents et recevoir l'image sous la forme UIImage
.
vous pouvez obtenir la vignette de votre URL de vidéo avec l'utilisation du code ci-dessous
MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease];
UIImage *thumbnail = [player thumbnailImageAtTime:0.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
Swift 3 Version:
func createThumbnailOfVideoFromFileURL(videoURL: String) -> UIImage? {
let asset = AVAsset(url: URL(string: videoURL)!)
let assetImgGenerate = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
let time = CMTimeMakeWithSeconds(Float64(1), 100)
do {
let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
let thumbnail = UIImage(cgImage: img)
return thumbnail
} catch {
// Set a default image if Image is not acquired
return UIImage(named: "ico_placeholder")
}
}
Pour Swift 3.0:
func generateThumbnailForVideoAtURL(filePathLocal: NSString) -> UIImage? {
let vidURL = NSURL(fileURLWithPath:filePathLocal as String)
let asset = AVURLAsset(url: vidURL as URL)
let generator = AVAssetImageGenerator(asset: asset)
generator.appliesPreferredTrackTransform = true
let timestamp = CMTime(seconds: 1, preferredTimescale: 60)
do {
let imageRef = try generator.copyCGImage(at: timestamp, actualTime: nil)
let frameImg : UIImage = UIImage(cgImage: imageRef)
return frameImg
} catch let error as NSError {
print("Image generation failed with error ::\(error)")
return nil
}
}
C'est peut-être utile pour quelqu'un d'autre qui fait face au même problème. J'avais besoin d'une solution simple pour créer une vignette pour les images, les PDF et les vidéos. Pour résoudre ce problème, j'ai créé la bibliothèque suivante (dans Swift).
https://github.com/prine/ROThumbnailGenerator
L'utilisation est très simple: Var thumbnailImage = ROThumbnail.getThumbnail (url)
Il a en interne trois implémentations différentes et en fonction de l’extension du fichier, il crée la vignette. Vous pouvez facilement ajouter votre propre implémentation si vous avez besoin d'un créateur de vignettes pour une autre extension de fichier.
Code Swift 2 avec AVAssetImageGenerator:
func thumbnailImageForVideo(url:NSURL) -> UIImage?
{
let asset = AVAsset(URL: url)
let imageGenerator = AVAssetImageGenerator(asset: asset)
imageGenerator.appliesPreferredTrackTransform = true
var time = asset.duration
//If possible - take not the first frame (it could be completely black or white on camara's videos)
time.value = min(time.value, 2)
do {
let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
return UIImage(CGImage: imageRef)
}
catch let error as NSError
{
print("Image generation failed with error \(error)")
return nil
}
}