web-dev-qa-db-fra.com

Créer une vignette à partir d'une URL de vidéo dans IPhone SDK

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?

27
TheRock

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.

46
Aaron Brager
-(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.

8
Ankit Goyal

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];
4
D-eptdeveloper

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")
    }
}
2
Ankit Kumar Gupta

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
    }
}
2
Disha

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.

2
Prine

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
    }
}
0
Avt