剑客
关注科技互联网

使用AVFoundation生成缩略图

通过前面的方法大家应该已经看到,使用MPMoviePlayerController来生成缩略图足够简单,但是如果仅仅是是为了生成缩略图而不进行视频播放的话,此刻使用MPMoviePlayerController就有点大材小用了。其实使用AVFundation框架中的AVAssetImageGenerator就可以获取视频缩略图。使用AVAssetImageGenerator获取缩略图大致分为三个步骤:

  1. 创建AVURLAsset对象(此类主要用于获取媒体信息,包括视频、声音等)。

  2. 根据AVURLAsset创建AVAssetImageGenerator对象。

  3. 使用AVAssetImageGenerator的copyCGImageAtTime::方法获得指定时间点的截图。

//
//  ViewController.m
//  AVAssetImageGenerator
//
//  Created by Kenshin Cui on 14/03/30.
//  Copyright (c) 2014年 cmjstudio. All rights reserved.
//
#import "ViewController.h"
#import @interface ViewController ()

@end
@implementation ViewController
- (void)viewDidLoad {

    [super viewDidLoad];
    
    //获取第13.0s的缩略图
    [self thumbnailImageRequest:13.0];
    
}
#pragma mark - 私有方法
/**
 *  取得本地文件路径
 *
 *  @return 文件路径
 */
-(NSURL *)getFileUrl{

    NSString *urlStr=[[NSBundle mainBundle] pathForResource:@"The New Look of OS X Yosemite.mp4" ofType:nil];
    
    NSURL *url=[NSURL fileURLWithPath:urlStr];
    
    return url;
}
/**
 *  取得网络文件路径
 *
 *  @return 文件路径
 */
-(NSURL *)getNetworkUrl{

    NSString *urlStr=@"http://192.168.1.161/The New Look of OS X Yosemite.mp4";
    
    urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSURL *url=[NSURL URLWithString:urlStr];
    
    return url;
}
/**
 *  截取指定时间的视频缩略图
 *
 *  @param timeBySecond 时间点
 */
-(void)thumbnailImageRequest:(CGFloat )timeBySecond{
    //创建URL
    NSURL *url=[self getNetworkUrl];
    
    //根据url创建AVURLAsset
    AVURLAsset *urlAsset=[AVURLAsset assetWithURL:url];
    
    //根据AVURLAsset创建AVAssetImageGenerator
    AVAssetImageGenerator *imageGenerator=[AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset];
    
    /*截图
     * requestTime:缩略图创建时间
     * actualTime:缩略图实际生成的时间
     */
     
    NSError *error=nil;
    CMTime time=CMTimeMakeWithSeconds(timeBySecond, 10);//CMTime是表示电影时间信息的结构体,第一个参数表示是视频第几秒,第二个参数表示每秒帧数.(如果要活的某一秒的第几帧可以使用CMTimeMake方法)
    CMTime actualTime;
    
    CGImageRef cgImage= [imageGenerator copyCGImageAtTime:time actualTime:&actualTime error:&error];
    
    if(error){
    
        NSLog(@"截取视频缩略图时发生错误,错误信息:%@",error.localizedDescription);
        
        return;
    }
    
    CMTimeShow(actualTime);
    
    UIImage *image=[UIImage imageWithCGImage:cgImage];//转化为UIImage
    
    //保存到相册
    UIImageWriteToSavedPhotosAlbum(image,nil, nil, nil);
    
    CGImageRelease(cgImage);
}
@end

生成的缩略图效果:

使用AVFoundation生成缩略图

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址