使用AVFoundation 自定义相机和录制视频
Posted xiaonizicome
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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、将捕捉的数据(照片、视频数据)输出到指定文件。
使用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
以上是关于使用AVFoundation 自定义相机和录制视频的主要内容,如果未能解决你的问题,请参考以下文章
使用具有自定义尺寸的 AVFoundation 录制视频? [复制]