【问题标题】:Creating Thumbnail from Video - Improving Speed Performance - AVAsset - iPhone [duplicate]从视频创建缩略图 - 提高速度性能 - AVAsset - iPhone [重复]
【发布时间】:2012-04-30 19:35:29
【问题描述】:

我正在使用基于以下线程中的代码的代码来生成视频缩略图:

Getting a thumbnail from a video url or data in iPhone SDK

我的代码如下:

if (selectionType == kUserSelectedMedia) {

    NSURL * assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];

    AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:assetURL options:nil];
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generator.appliesPreferredTrackTransform=TRUE;
    [asset release];
    CMTime thumbTime = CMTimeMakeWithSeconds(0,30);

    //NSLog(@"Starting Async Queue");

    AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
        if (result != AVAssetImageGeneratorSucceeded) {
            NSLog(@"couldn't generate thumbnail, error:%@", error);
        }

        //NSLog(@"Updating UI");

        selectMediaButton.hidden = YES;
        selectedMedia.hidden = NO;
        cancelMediaChoiceButton.hidden = NO;
        whiteBackgroundMedia.hidden = NO;

        //Convert CGImage thumbnail to UIImage.
        UIImage * thumbnail = [UIImage imageWithCGImage:im];

        int checkSizeW = thumbnail.size.width;
        int checkSizeH = thumbnail.size.height;
        NSLog(@"Image width is %d", checkSizeW);
        NSLog(@"Image height is %d", checkSizeH);

        if (checkSizeW >=checkSizeH) {
            //This is a landscape image or video.
            NSLog(@"This is a landscape image - will resize automatically");
        }

        if (checkSizeH >=checkSizeW) {
            //This is a portrait image or video.
            selectedIntroHeight = thumbnail.size.height;
        }

        //Set the image once resized.
        selectedMedia.image = thumbnail;

        //Set out confirm button BOOL to YES and check if we need to display confirm button.
        mediaReady = YES;
        [self checkIfConfirmButtonShouldBeDisplayed];

        //[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];
}

}

问题是在生成缩略图时会有大约 5-10 秒的延迟。无论如何我可以提高这段代码的速度并更快地生成缩略图吗?

谢谢。

【问题讨论】:

    标签: iphone objective-c performance video thumbnails


    【解决方案1】:

    这是一个通用代码,您应该只传递媒体文件的路径并将比率设置在 0 和 1.0 之间。

    + (UIImage*)previewFromFileAtPath:(NSString*)path ratio:(CGFloat)ratio
    {
        AVAsset *asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:path]];
        AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
        CMTime duration = asset.duration;
        CGFloat durationInSeconds = duration.value / duration.timescale;
        CMTime time = CMTimeMakeWithSeconds(durationInSeconds * ratio, (int)duration.value);
        CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
        UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
        CGImageRelease(imageRef);
    
        return thumbnail;
    }
    

    【讨论】:

      【解决方案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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-25
        • 2011-11-22
        • 2018-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        相关资源
        最近更新 更多