生成视频缩略图

方法一:使用AVFoundation生成缩略图.

    AVFundation框架中的AVAssetImageGenerator就可以获取视频缩略图。使用AVAssetImageGenerator获取缩略图大致分为三个步骤:


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

    根据AVURLAsset创建AVAssetImageGenerator对象。

    使用AVAssetImageGeneratorcopyCGImageAtTime::方法获得指定时间点的截图。

 

 方法二:MPMoviePlayerController除了一般的视频播放和控制外还有一些强大的功能,例如截取视频缩略图。

     请求视频缩略图时只要调用

   - (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option方法指定获得缩略图的时间点,然后监控MPMoviePlayerThumbnailImageRequestDidFinishNotification通知,每个时间点的缩略图请求完成就会调用通知,在通知调用方法中可以通过MPMoviePlayerThumbnailImageKey获得UIImage对象处理即可。


具体代码实现和效果图如下:

     

#import "ViewController.h"

#import <AVFoundation/AVFoundation.h>

#import <MediaPlayer/MediaPlayer.h>

@interface ViewController ()

@property (nonatomic,strong) MPMoviePlayerController *moviePlayer;//视频播放控制器

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    //获取第10.0s的缩略图。方法一使用AVFoundation生成缩略图直接调用改方法即可。

    //[self thumbnailImageRequest:10.0];

    

    //播放

    [self.moviePlayer play];

    

    //添加通知

    [self addNotification];

    

    //获取缩略图

    [self thumbnailImageRequest];

    

}


//获取本地文件

-(NSURL*)getFileUrl{

    

    NSString *urlString=[[NSBundle mainBundle]pathForResource:@"1" ofType:@".mp4"];

    return [NSURL fileURLWithPath:urlString];

    

}


//获取网络文件路径

-(NSURL *)getNetworkUrl{

    

    NSString *urlString=@"http://192.168.1.161/The New Look of OS X Yosemite.mp4";

    NSURL *url=[NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    return url;

    

}


#pragma mark----- 使用AVFoundation生成缩略图--------

//截取指定时间的视频缩略图   timeBySecond 时间点

-(void)thumbnailImageRequest:(CGFloat)timeBySecond{

    

    

    NSURL *url=[self getFileUrl];

    //根据url创建AVURLAsset

    AVURLAsset *urlAsset=[AVURLAsset assetWithURL:url];

    //根据AVURLAsset创建AVAssetImageGenerator

    AVAssetImageGenerator *imageGenerator=[AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset];

    

    NSError *error=nil;

    //CMTime是表示电影时间信息的结构体,第一个参数表示是视频第几秒,第二个参数表示每秒帧数.(如果要活的某一秒的第几帧可以使用CMTimeMake方法)

    CMTime time=CMTimeMakeWithSeconds(timeBySecond, 600);

        imageGenerator.appliesPreferredTrackTransform = YES;

    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);

    

    

    

}



#pragma mark-----MPMoviePlayerController截取指定时间的视频缩略图----

//创建媒体播放控制器

-(MPMoviePlayerController *)moviePlayer{

    if (!_moviePlayer) {

        NSURL *url=[self getFileUrl];

        _moviePlayer=[[MPMoviePlayerController alloc]initWithContentURL:url];

        _moviePlayer.view.frame=self.view.bounds;

        _moviePlayer.view.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

        [self.view addSubview:_moviePlayer.view];

    }

    return _moviePlayer;

}


//获取视频缩略图

-(void)thumbnailImageRequest{

    //获取13.0s21.5s的缩略图 playbackTimes是一个数组存放NSNumber对象,截取缩略图的时间点.

    [self.moviePlayer requestThumbnailImagesAtTimes:@[@13.0,@21.5] timeOption:MPMovieTimeOptionNearestKeyFrame];

}



//添加通知监控媒体播放控制器状态

-(void)addNotification{

    NSNotificationCenter *notificationCenter=[NSNotificationCenter defaultCenter];

    [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackStateChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer];

    [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];

    [notificationCenter addObserver:self selector:@selector(mediaPlayerThumbnailRequestFinished:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:self.moviePlayer];

    

}


//播放状态改变,注意播放完成时的状态是暂停 通知对象

-(void)mediaPlayerPlaybackStateChange:(NSNotification *)notification{

    switch (self.moviePlayer.playbackState) {

        case MPMoviePlaybackStatePlaying:

            NSLog(@"正在播放...");

            break;

        case MPMoviePlaybackStatePaused:

            NSLog(@"暂停播放.");

            break;

        case MPMoviePlaybackStateStopped:

            NSLog(@"停止播放.");

            break;

        default:

            NSLog(@"播放状态:%li",(long)self.moviePlayer.playbackState);

            break;

    }

}


//播放完成

-(void)mediaPlayerPlaybackFinished:(NSNotification *)notification{

    NSLog(@"播放完成.%li",(long)self.moviePlayer.playbackState);

}


//缩略图请求完成,此方法每次截图成功都会调用一次

-(void)mediaPlayerThumbnailRequestFinished:(NSNotification *)notification{

    NSLog(@"视频截图完成.");

    UIImage *image=notification.userInfo[MPMoviePlayerThumbnailImageKey];

    //保存图片到相册(首次调用会请求用户获得访问相册权限)

    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

}


-(void)dealloc{

    //移除所有通知监控

    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:self.moviePlayer];

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end


部分效果图:

                         生成视频缩略图_第1张图片

                    最开始程序运行界面                                    相册库中可以查看生成的缩略图


你可能感兴趣的:(生成视频缩略图)