视频截取图片AVAssetImageGenerator

//获取视频url地址

NSURL *url=[NSURL URLWithString:[@"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4"

stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

//根据地址初始化AVURLAsset

        AVURLAsset *urlAsset=[AVURLAsset assetWithURL:url];

//初始化AVAssetImageGenerator

        AVAssetImageGenerator *imageGenerator=[AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset];

        NSError *error=nil;

//获取视频第5秒,每秒10帧

        CMTime time=CMTimeMakeWithSeconds(5, 10);

        CMTime actualTime;

//通过copyCGImageAtTime获取第5秒时间的图片  actualTime可传可不传

        CGImageRef cgImage= [imageGenerator copyCGImageAtTime:time actualTime:&actualTime error:&error];

        if(error){

//打印时间

        CMTimeShow(actualTime);

//获取图片

        UIImage *image=[UIImage imageWithCGImage:cgImage];

 //释放     

       CGImageRelease(cgImage);

}

下面详细介绍这几个类的结构和使用:

AVURLAsset:继承与AVAsset,它是AVFoundation框架用来表示媒体的主要类,AVAsset实例是一个或多个媒体数据(音频和视频轨道)的集合的聚合表示,它提供语音作为整合的集合的信息,例如标题,持续时间等等。AVAsset是用于URL和媒体创建asset实例并创建新和成的其他类的超类。

 CMTime:

通常开发者认为时间的呈现格式应该是浮点数据,我们一般使用NSTimeInterval,实际上它是简单的双精度double类型,只是typedef了一下,但是由于浮点型数据计算很容易导致精度的丢失,在一些要求高精度的应用场景显然不适合,于是苹果在Core Media框架中定义了CMTime数据类型作为时间的格式,结构如下:
typedef struct{
CMTimeValuevalue;
 CMTimeScaletimescale; 
CMTimeFlagsflags; 
CMTimeEpochepoch; } CMTime;
显然,CMTime定义是一个C语言的结构体,CMTime是以分数的形式表示时间,value表示分子,timescale表示分母,flags是位掩码,表示时间的指定状态。
下面代码表示第5秒,每秒10帧。
CMTime time=CMTimeMakeWithSeconds(5, 10); 

AVAssetImageGenerator: 是用来提供视频的缩略图或预览视频的帧的类(有文章说图片生成的真正时间可能在requestedTimeToleranceBefore 和 requestedTimeToleranceAfter之间,也可能和请求时间无关)。

copyCGImageAtTime:actualTime:error: 这个方法的三个参数意义如下,

第一个代表想要获取那个时间点的图片(每秒的帧不同,获取的图片也不通)。

第二个代表返回的时间,官方文档说如果不需要,可传NULL

第三个代表错误信息,如果有错误信息说明未生成图片。

 

猜你喜欢

转载自www.cnblogs.com/Sunny1024/p/8950230.html
今日推荐