首页 文章

在iOS中为视频创建缩略图

提问于
浏览
19

我有一个我正在为iPhone开发的应用程序 . 它的作用是,它从摄像机捕获视频并将视频文件存储到文件系统中 .

在将图像保存到文件系统之前,我需要创建此视频文件的缩略图图像 . 我的动机是显示所创建视频的缩略图列表,以便用户可以选择特定缩略图来播放所需文件 .

有人可以建议我如何创建一个由相机捕获的视频文件的缩略图图像 .

另外,您能告诉我是否可以使用iOS SDK创建现有视频文件的缩略图 .

5 回答

  • 0

    试试这个(它实际上并没有显示电影播放器):

    + (UIImage *)imageFromMovie:(NSURL *)movieURL atTime:(NSTimeInterval)time {
      // set up the movie player
      MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] 
        initWithContentURL:movieURL];
      mp.shouldAutoplay = NO;
      mp.initialPlaybackTime = time;
      mp.currentPlaybackTime = time;
      // get the thumbnail
      UIImage *thumbnail = [mp thumbnailImageAtTime:time 
                               timeOption:MPMovieTimeOptionNearestKeyFrame];
      // clean up the movie player
      [mp stop];
      [mp release];
      return(thumbnail);
    }
    

    它应该是一个同步调用,所以它可能会阻塞主线程,但是当我在电影开头使用时间时,似乎对我来说很快就会运行 . 如果你这么做很多,你可以把它作为一个类别添加到UIImage上,这就是我所做的 .

    我从你的问题中看到你想在保存电影之前这样做,我想如果没有文件网址可能无法正常工作 . 但是,如果您使用UIImagePickerController进行摄像头捕获,则可以使用密钥UIImagePickerControllerMediaURL将此函数传递给imagePickerController:didFinishPickingMediaWithInfo:的信息字典中返回的URL .

  • 3

    实际上更好的解决方案是使用AVFoundation框架来执行此操作 . 它绕过了构造MPMoviePlayerController的需要,如果与UIImagePickerController结合使用(至少就是我所经历过的),会导致相机的光圈保持关闭的问题 .

    我使用的代码:

    + (UIImage *)thumbnailFromVideoAtURL:(NSURL *)contentURL {
        UIImage *theImage = nil;
        AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:contentURL options:nil];
        AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
        generator.appliesPreferredTrackTransform = YES;
        NSError *err = NULL;
        CMTime time = CMTimeMake(1, 60);
        CGImageRef imgRef = [generator copyCGImageAtTime:time actualTime:NULL error:&err];
    
        theImage = [[[UIImage alloc] initWithCGImage:imgRef] autorelease];
    
        CGImageRelease(imgRef);
        [asset release];
        [generator release];
    
        return theImage;
    }
    
  • 32

    Very simple try this...

    Step 1 :导入 Headers #import <MediaPlayer/MediaPlayer.h>

    Step 2 :获取网址路径

    NSURL *videoURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Sample" ofType:@"m4v"]];
    

    Step 3 :终于搞定了缩略图

    - (UIImage *)VideoThumbNail:(NSURL *)videoURL
    {
        MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
        UIImage *thumbnail = [player thumbnailImageAtTime:52.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
        [player stop];
        return thumbnail;
    }
    
  • 0

    试试这个 :

    generate.requestedTimeToleranceBefore = kCMTimeZero;
    generate.requestedTimeToleranceAfter = kCMTimeZero;
    

    需要添加以获得正确的框架 .

  • 17

    使用 AVFoundation 框架和Swift 3.0的解决方案代码(注释代码不是必需的,在代码下面讨论 - 您必须决定是否需要它):

    import AVFoundation
    
    func generateThumbnailForVideo(at url: URL) -> UIImage? {
        let kPreferredTimescale: Int32 = 1000
        let asset = AVURLAsset(url: url)
        let generator = AVAssetImageGenerator(asset: asset)
        generator.appliesPreferredTrackTransform = true
        //generator.requestedTimeToleranceBefore = kCMTimeZero
        //generator.requestedTimeToleranceAfter = kCMTimeZero
        //generator.maximumSize = CGSize(width: 100, height: 100)
    
        var actualTime: CMTime = CMTime(seconds: 0, preferredTimescale: kPreferredTimescale)
        //generates thumbnail at first second of the video
        let cgImage = try? generator.copyCGImage(at: CMTime(seconds: 1, preferredTimescale: kPreferredTimescale), actualTime: &actualTime)
        return cgImage.flatMap() { return UIImage(cgImage: $0, scale: UIScreen.main.scale, orientation: .up) }
    }
    

    请注意,您可以考虑在后台线程上运行此代码,因为创建缩略图可能是一项代价高昂的操作 .

    另外,请看一下 AVAssetImageGenerator 类的一些属性:

    在可能生成图像的请求时间之前的最长时间 . 默认值为kCMTimePositiveInfinity . 将requestedTimeToleranceBefore和requestedTimeToleranceAfter的值设置为kCMTimeZero,以请求帧精确图像生成;这可能会导致额外的解码延迟 .

    在可能生成图像的请求时间之后的最长时间 . 默认值为kCMTimePositiveInfinity . 将requestedTimeToleranceBefore和requestedTimeToleranceAfter的值设置为kCMTimeZero,以请求帧精确图像生成;这可能会导致额外的解码延迟 .

    指定生成图像的最大尺寸 . 默认值为CGSizeZero,它指定资产的未缩放尺寸 . AVAssetImageGenerator对图像进行缩放,使其适合定义的边界框 . 图像永远不会放大 . 缩放图像的宽高比由apertureMode属性定义 .

相关问题