使用AVFoundation 自定义相机和录制视频

先来了解几个重要的类

1、AVCaptureDevice:输入设备,包括摄像头和麦克风

2、AVCaptureSession:负责把AVCaptureDevice捕捉得到的视频或声音数据输出到输出设备中,需要为该对象添加输入设备和输出设备

3、AVCaptureDeviceInput:是AVCaptureInput的子类,使用该对象从AVCaptureDevice设备获取数据,该对象将会被添加给AVCaptureSession管理.

4、AVCaptureScreenInput:它是AVCaptureInput的子类,使用该对象从屏幕获取数据(用于录制屏幕动作).该对象将会被添加给AVCaptureSeesion管理

5、AVCaptureAudioDataOutput、AVCaptureAudioPreviewOutput、AVCaptureFileOutput[BL4] 、AVCaptureStillImageOutput、AVCaptureVideoDataOutput:它们都是AVCaptureOutput的子类,用于接收各种数据.该对象也会被添加给AVCaptureSession管理.其中AVCaptureFileOutput依然代表输出到文件的输出端,

6、AVCaptureVideoPreviewLayer:是CALayer的子类,用于预览。开发者只要创建它的实例,并为它设置AVCaptureSession,就可以非常方便地用它来实现拍摄预览.

 

拍照和录制视频的步骤如下:

1、使用AVCaptureDevice的静态方法获取设备

2、利用AVCaptureDevice初始化AVCaptureDeviceInput对象

3、初始化输出端.如果只是拍照,则初始化AVCaptureStillImageOutput输出端即可;如果要捕捉视频,则初始化AVCaptureMovieFileOutput输出端.

4、创建AVCaptureSession对象,使用该对象来添加输入设备和输出端.调用AVCaptureSession的startRunning方法开始捕捉画面或声音数据.

5、将捕捉的数据(照片、视频数据)输出到指定文件。

6、设置output 代理,在代理方法中分析视频流,并指定代理方法在哪个线程被调用。

 

使用AVFoundation生成视频缩略图

AVFoundation生成视频缩略图主要靠两个类.:

       1、AVURLAsset:该类是AVAsset的子类,AVAsset类专门用于获取多媒体的相关信息,包括获取多媒体的画面、声音等信息。而AVURLAsset子类的作用则是根据NSURL来初始化AVAsset对象。

       2、AVAssetImageGenerator:该类专门用于截取视频指定帧的画面。

步骤:1、根据视频的NSURL创建AVURLAsset对象

           2、根据AVURLAsset对象创建AVAssetImageGenerator对象

           3、调用AVAssetImageGenerator对象的copyCGImageAtTime:actualTime:error:方法来获取该视频指定时间点的视频截图.该方法的第一个CMTime参数用于指定获取哪个时间点的视频截图,第2个CMTime参数用于获取实际截图 位于哪个时间点.

               其中CMTime是专门用于标识电影时间的结构体,通常用如下两个函数来创建CMTime.

                     1、CMTimeMake(int64_t  value, int_32  timescale): 第1个参数代表获取第几帧的截图,第2个参数代表每秒的帧数.因此实际截取的时间点是value/timescale.

                     2、CMTimeMakeWithSeconds(Float64  seconds, int32_t  preferredTimeScale): 第1个参数代表获取第几秒的截图,第2个参数则代表每秒的帧数.

实例:

// 为增加UIImage增加一个类别,通过在该类别中为UIImage增加一个imageWithVideo:方法来获取视频的缩略图 

// UIImage + Video.m

@implementation UIImage (Video)

+ (UIImage *)imageWithVideo:(NSURL *)vidoURL

{

  // 根据视频的URL创建AVURLAsset

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];

// 根据AVURLAsset创建AVAssetImageGenerator对象

 AVAssetImageGenerator* gen = [[AVAssetImageGenerator alloc] initWithAsset: asset];

 gen.appliesPreferredTrackTransform = YES;

 // 定义获取0帧处的视频截图

CMTime time = CMTimeMake(0, 10);

 NSError *error = nil;

CMTime actualTime;

// 获取time处的视频截图

CGImageRef  image = [gen  copyCGImageAtTime: time actualTime: &actualTime error:&error];

// 将CGImageRef转换为UIImage

UIImage *thumb = [[UIImage alloc] initWithCGImage: image];

CGImageRelease(image);

return  thumb;

}

@end
posted @ 2019-06-14 11:51  小妮子的奋斗时代  阅读(457)  评论(0编辑  收藏  举报