63

iPhone 3GS カメラで撮影したビデオから (最初のフレームの) サムネイルを取得して表示できるようにしようとしています。これを行う方法?

4

12 に答える 12

73
-(UIImage *)generateThumbImage : (NSString *)filepath
{
    NSURL *url = [NSURL fileURLWithPath:filepath];

    AVAsset *asset = [AVAsset assetWithURL:url];
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
    imageGenerator.appliesPreferredTrackTransform = YES;
    CMTime time = [asset duration];
    time.value = 0;
    CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
    UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);  // CGImageRef won't be released by ARC

    return thumbnail;
}

time.value を使用してフレームを取得できます。1 秒のフレームにしたい場合は、

time.value = 1000 //Time in milliseconds
于 2014-01-20T09:44:52.070 に答える
69

この質問に対する答えは、iOS 4.0 では、AVFoundation を使用してサムネイルを取得できるようになったということです。クラス プロパティ URL が映画の URL である次のコードは、このトリックを実行します (いつでもサムネイルを取得できます。この例では、時間 0)

-(void)generateImage
{
    AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:self.url options:nil];
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generator.appliesPreferredTrackTransform=TRUE;
    [asset release];
    CMTime thumbTime = CMTimeMakeWithSeconds(0,30);

    AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
        if (result != AVAssetImageGeneratorSucceeded) {
            NSLog(@"couldn't generate thumbnail, error:%@", error);
        }
        [button setImage:[UIImage imageWithCGImage:im] forState:UIControlStateNormal];
        thumbImg=[[UIImage imageWithCGImage:im] retain];
        [generator release];
    };

    CGSize maxSize = CGSizeMake(320, 180);
    generator.maximumSize = maxSize;
    [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];

}
于 2010-12-02T00:43:29.407 に答える
23
NSURL *videoURL = [NSURL fileURLWithPath:url];

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];

        UIImage *thumbnail = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];

        //Player autoplays audio on init
        [player stop];
        [player release];

代替手段については、このリンクを確認してください :

于 2011-05-17T06:54:09.907 に答える
14

私が見つけた最良の方法...MPMoviePlayerController thumbnailImageAtTime:timeOption

于 2010-08-25T03:46:24.513 に答える
8

スイフト 3.0 の場合

func createThumbnailOfVideoFromFileURL(_ strVideoURL: String) -> UIImage?{

let asset = AVAsset(url: URL(string: strVideoURL)!)
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 {
  /* error handling here */
}
return nil   }
于 2016-12-23T14:39:19.743 に答える
8

スウィフト 2 コード:

func previewImageForLocalVideo(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
    }
}
于 2015-08-08T16:36:32.480 に答える
1

たぶん、これは同じ問題に直面している他の誰かに役立つでしょう。画像、PDF、およびビデオのサムネイルを作成するための簡単なソリューションが必要でした。その問題を解決するために、次のライブラリを作成しました。

https://github.com/prine/ROThumbnailGenerator

使い方はとても簡単です: var thumbnailImage = ROThumbnail.getThumbnail(url)

内部には 3 つの異なる実装があり、ファイル拡張子に応じてサムネイルを作成します。別のファイル拡張子のサムネイル クリエーターが必要な場合は、独自の実装を簡単に追加できます。

于 2015-08-12T13:12:00.227 に答える
1

Swift 2.1必要な時間間隔でサムネイルを取得する

func getPreviewImageForVideoAtURL(videoURL: NSURL, atInterval: Int) -> UIImage? {
    print("Taking pic at \(atInterval) second")
    let asset = AVAsset(URL: videoURL)
    let assetImgGenerate = AVAssetImageGenerator(asset: asset)
    assetImgGenerate.appliesPreferredTrackTransform = true
    let time = CMTimeMakeWithSeconds(Float64(atInterval), 100)
    do {
        let img = try assetImgGenerate.copyCGImageAtTime(time, actualTime: nil)
        let frameImg = UIImage(CGImage: img)
        return frameImg
    } catch {
        /* error handling here */
    }
    return nil
}
于 2016-01-08T11:57:08.183 に答える