AVFoudation简单的视频录制-文章是16年中旬写的,仅做参考
来源:互联网 发布:大学生利用网络赚钱 编辑:程序博客网 时间:2024/06/08 14:35
用AVFoudation进行视频录制相对UIImagePickerController来说复杂,涉及到的相关类也更多,打个比喻,就是我想在要用积木搭房子,但是我现在只有一堆非常零碎的零件来进行组装。如下,要进行视频录制并且保存我总结了一个相关步骤。
第一步:导入相关的头文件#import <AVFoundation/AVFoundation.h>
第二步:创建session会话对象,并且设置捕获质量
第三步:创建对应媒体类型的device对象和deviceInput对象
第四步:将对应的input对象添加进入session中
第五步:创建文件输出对象AVCaptureMovieFileOutput,并且将该对象添加进session中的output中。
至此,设备初始化的工作完成。
第六步:根据session创建AVCaptureVideoPreviewLayer层,并且设置好frame
第七步:将创建好的layer添加到相应的view上去。此时session调用startRunning,就能将摄像头捕捉到的影像在layer中显示。
第八步:定义好fileurl用作存储录制视频的路径。fileURLWithPath:记住一定是用这个方法创建的url。否者会异常。
第九步:AVCaptureMovieFileOutput的实例调用startRecordingToOutputFileURL:recordingDelegate:方法开始讲摄像头捕捉的视频保存进之前设定好的fielurl
代码:
首先定义session和output
@property (nonatomic,strong) AVCaptureSession *session;
@property (nonatomic,strong) AVCaptureMovieFileOutput *output;
然后实现对应方法:
self.session = [[AVCaptureSession alloc]init];
//设置捕获视频的质量
self.session.sessionPreset = AVCaptureSessionPresetHigh;
NSError *error;
//指定媒体类型为 视频 。获得捕获设备AVCaptureDevice对象。
AVCaptureDevice *cameraDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
//实例化捕获输入AVCaptureDeviceInput(视频)对象,通过对应的device对象实例化。
AVCaptureDeviceInput *camera = [AVCaptureDeviceInput deviceInputWithDevice:cameraDevice error:&error];
//指定媒体类型为 音频 。获得捕获设备AVCaptureDevice对象。
AVCaptureDevice *micDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
//实例化捕获输入AVCaptureDeviceInput(音频)对象,通过对应的device对象实例化。
AVCaptureDeviceInput *mic = [AVCaptureDeviceInput deviceInputWithDevice:micDevice error:&error];
/*
当前获得了两个输入对象,一个是camera设备,一个是mic设备
*/
[self.session addInput:camera];
[self.session addInput:mic];
//创建文件输出对象
self.output = [[AVCaptureMovieFileOutput alloc]init];
if ([self.session canAddOutput:self.output]) {
[self.session addOutput:self.output];
}
//创建layer层对象,参数是captureSession。并且设置layer的frame。然后天骄到相应的view上
AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
previewLayer.frame = CGRectMake(0, 0, 375.0, 375.0*16/9);
[self.view.layer insertSublayer:previewLayer atIndex:0];
[self.session startRunning];
到此为止,当前界面的view上能输出摄像头捕捉到的数据。
接着定义好fileUrl:
-(NSURL *)fileUrl
{
NSString *outputPath = [NSString stringWithFormat:@"%@%@",NSTemporaryDirectory(),@"myvideo.mov"];
NSURL *urlPath = [NSURL fileURLWithPath:outputPath];//[NSURL URLWithString:outputPath];
NSFileManager *manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:outputPath]) {
NSError *error;
[manager removeItemAtPath:outputPath error:&error];
}
return urlPath;
}
然后调用下述方法开始讲捕捉到的数据保存进上述的fileurl中:
[self.output startRecordingToOutputFileURL:fileUrl recordingDelegate:self];
设置此方法后,系统会持续的将捕捉到的视频缓存起来,在通过调用:
[self.output stopRecording];
结束视频的录制,此时会调用下述代理方法
- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error;
在这个代理方法内部实现保存的方法:
if (error == nil) {
ALAssetsLibrary *library = [[ALAssetsLibrary alloc]init];
[library writeVideoAtPathToSavedPhotosAlbum:outputFileURL completionBlock:^(NSURL *assetURL, NSError *error) {
NSLog(@"%@",assetURL.absoluteString);
if (error) {
NSLog(@"%@",error.localizedDescription);
}
}];
}
0 0
- AVFoudation简单的视频录制-文章是16年中旬写的,仅做参考
- 一个简单的解决方案文档-仅做参考.
- 一个简单的heat模板,仅做自己参考
- andriod显示录制视频的简单dome
- 写一个自动录制APP启动视频的多线程脚本
- 写文章、做PPT的总结
- 安卓中视频录制与播放的简单总结
- 参考网上写的简单超级玛丽
- 是 公安大学王大伟教授写的文章~~~
- 可做参考的 软件架构师文章(18/4174)
- J2ME 用来处理手机游戏中长字符串显示问题,自己写的,仅作参考
- 视频录制的带宽需求
- 近期的视频录制计划
- 近期的视频录制计划
- 关于IOS的视频录制
- 关于录制视频的困惑
- 视频录制的一些注意事项
- 关于IOS的视频录制
- Andriod Studio 配置slf4j日志记录框架
- js实现玫瑰花
- js正则表达式
- Android App启动简单流程
- 容斥原理(翻译)
- AVFoudation简单的视频录制-文章是16年中旬写的,仅做参考
- Spring AOP
- xml schema数据类型,元素类型
- 函数式编程 Lambda表达式
- 学习java集合框架
- android studio 打包 jar
- android Item 滑动删除核心逻辑实现
- 算法设计与应用基础系列1
- 【网络基础】电路交换、虚电路交换、分组交换的区别比较