在iOS中创建视频缩略图

在iOS中创建视频缩略图,ios,objective-c,thumbnails,video-thumbnails,Ios,Objective C,Thumbnails,Video Thumbnails,我有一个为iPhone开发的应用程序。它所做的是从摄像机捕获视频并将视频文件存储到文件系统中 在将图像保存到文件系统之前,我需要创建此视频文件的缩略图。我的动机是显示所创建视频的缩略图列表,以便用户可以选择特定的缩略图来播放所需的文件 有人能告诉我如何创建一个由摄像机捕获的视频文件的缩略图吗 另外,您是否可以建议我是否可以使用iOS SDK创建现有视频文件的缩略图。试试这个,它实际上不会显示电影播放器: + (UIImage *)imageFromMovie:(NSURL *)movieURL

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

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

有人能告诉我如何创建一个由摄像机捕获的视频文件的缩略图吗


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

试试这个,它实际上不会显示电影播放器:

+ (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上的一个类别,这就是我所做的


我从您的问题中看到,您希望在保存电影之前执行此操作,我猜如果没有文件url,它可能无法工作。但是,如果您使用UIImagePickerController进行相机捕获,则可以将imagePickerController:didFinishPickingMediaWithInfo:的信息字典中返回的URL传递给此函数,并使用键UIImagePickerController:DiaUrl。

更好的解决方案实际上是使用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;
}
很简单,试试这个

步骤1:导入标题导入

步骤2:获取url路径

NSURL *videoURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Sample" ofType:@"m4v"]];
第三步:最终得到缩略图

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

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

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

使用AVFoundation framework和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属性定义


我指的是在IOS上生成一个视频文件的缩略图,而不是按程序截图。要拍摄屏幕截图,必须播放文件,但在我的例子中,不需要播放文件;CMTime duration=playerItem.duration@失败者你不需要一个游戏玩家;直接从AVAsset获取持续时间。thumbnailImageAtTime:timeOption:在iOS 7中不推荐使用此方法在iOS 7中不推荐使用thumbnailImageAtTime:timeOption:在iOS 7中不推荐使用此方法