使用AVFoundation生成缩略图

DustinPorti 7年前
   <p>通过前面的方法大家应该已经看到,使用MPMoviePlayerController来生成缩略图足够简单,但是如果仅仅是是为了生成缩略图而不进行视频播放的话,此刻使用MPMoviePlayerController就有点大材小用了。其实使用AVFundation框架中的AVAssetImageGenerator就可以获取视频缩略图。使用AVAssetImageGenerator获取缩略图大致分为三个步骤:</p>    <ol>     <li> <p>创建AVURLAsset对象(此类主要用于获取媒体信息,包括视频、声音等)。</p> </li>     <li> <p>根据AVURLAsset创建AVAssetImageGenerator对象。</p> </li>     <li> <p>使用AVAssetImageGenerator的copyCGImageAtTime::方法获得指定时间点的截图。</p> </li>    </ol>    <pre>  <code class="language-objectivec">//  //  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</code></pre>    <p>生成的缩略图效果:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/7fd3623f83a6d9e4f1c6fa232c141bb7.png"></p>    <p> </p>    <p>来自:http://www.cocoachina.com/ios/20161114/18066.html</p>    <p> </p>