AVFoudation简单的视频录制-文章是16年中旬写的,仅做参考

来源:互联网 发布:大学生利用网络赚钱 编辑:程序博客网 时间:2024/06/08 14:35

        用AVFoudation进行视频录制相对UIImagePickerController来说复杂,涉及到的相关类也更多,打个比喻,就是我想在要用积木搭房子,但是我现在只有一堆非常零碎的零件来进行组装。如下,要进行视频录制并且保存我总结了一个相关步骤。

  1. 第一步:导入相关的头文件#import <AVFoundation/AVFoundation.h>
  2. 第二步:创建session会话对象,并且设置捕获质量
  3. 第三步:创建对应媒体类型的device对象和deviceInput对象
  4. 第四步:将对应的input对象添加进入session
  5. 第五步:创建文件输出对象AVCaptureMovieFileOutput,并且将该对象添加进session中的output中。
  6. 至此,设备初始化的工作完成。
  7. 第六步:根据session创建AVCaptureVideoPreviewLayer层,并且设置好frame
  8. 第七步:将创建好的layer添加到相应的view上去。此时session调用startRunning,就能将摄像头捕捉到的影像在layer中显示。
  9. 第八步:定义好fileurl用作存储录制视频的路径。fileURLWithPath:记住一定是用这个方法创建的url。否者会异常。
  10. 第九步:AVCaptureMovieFileOutput的实例调用startRecordingToOutputFileURL:recordingDelegate:方法开始讲摄像头捕捉的视频保存进之前设定好的fielurl


代码:

首先定义session和output

  1. @property (nonatomic,strong) AVCaptureSession *session;
  2. @property (nonatomic,strong) AVCaptureMovieFileOutput *output;

然后实现对应方法:

  1. self.session = [[AVCaptureSession alloc]init];
  2. //设置捕获视频的质量
  3. self.session.sessionPreset = AVCaptureSessionPresetHigh;
  4. NSError *error;
  5. //指定媒体类型为 视频 。获得捕获设备AVCaptureDevice对象。
  6. AVCaptureDevice *cameraDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
  7. //实例化捕获输入AVCaptureDeviceInput(视频)对象,通过对应的device对象实例化。
  8. AVCaptureDeviceInput *camera = [AVCaptureDeviceInput deviceInputWithDevice:cameraDevice error:&error];
  9. //指定媒体类型为 音频 。获得捕获设备AVCaptureDevice对象。
  10. AVCaptureDevice *micDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
  11. //实例化捕获输入AVCaptureDeviceInput(音频)对象,通过对应的device对象实例化。
  12. AVCaptureDeviceInput *mic = [AVCaptureDeviceInput deviceInputWithDevice:micDevice error:&error];
  13. /*
  14. 当前获得了两个输入对象,一个是camera设备,一个是mic设备
  15. */
  16. [self.session addInput:camera];
  17. [self.session addInput:mic];
  18. //创建文件输出对象
  19. self.output = [[AVCaptureMovieFileOutput alloc]init];
  20. if ([self.session canAddOutput:self.output]) {
  21.    [self.session addOutput:self.output];
  22. }
  23. //创建layer层对象,参数是captureSession。并且设置layer的frame。然后天骄到相应的view上
  24. AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
  25. previewLayer.frame = CGRectMake(0, 0, 375.0, 375.0*16/9);
  26. [self.view.layer insertSublayer:previewLayer atIndex:0];
  27. [self.session startRunning];

到此为止,当前界面的view上能输出摄像头捕捉到的数据。

接着定义好fileUrl:

  1. -(NSURL *)fileUrl
  2. {
  3.    NSString *outputPath = [NSString stringWithFormat:@"%@%@",NSTemporaryDirectory(),@"myvideo.mov"];
  4.    NSURL *urlPath = [NSURL fileURLWithPath:outputPath];//[NSURL URLWithString:outputPath];
  5.    NSFileManager *manager = [NSFileManager defaultManager];
  6.    if ([manager fileExistsAtPath:outputPath]) {
  7.        NSError *error;
  8.        [manager removeItemAtPath:outputPath error:&error];
  9.    }
  10.    return urlPath;
  11. }

然后调用下述方法开始讲捕捉到的数据保存进上述的fileurl中:

  1. [self.output startRecordingToOutputFileURL:fileUrl recordingDelegate:self];

设置此方法后,系统会持续的将捕捉到的视频缓存起来,在通过调用:

  1. [self.output stopRecording];
结束视频的录制,此时会调用下述代理方法
  1. - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error;

在这个代理方法内部实现保存的方法:

  1. if (error == nil) {
  2.    ALAssetsLibrary *library = [[ALAssetsLibrary alloc]init];
  3.    [library writeVideoAtPathToSavedPhotosAlbum:outputFileURL completionBlock:^(NSURL *assetURL, NSError *error) {
  4.        NSLog(@"%@",assetURL.absoluteString);
  5.        if (error) {
  6.            NSLog(@"%@",error.localizedDescription);
  7.        }
  8.    }];
  9. }
ALAssetsLibrary这个类到iOS9为止就过时了,苹果最新希望开发者使用PHPhotos.framework框架,但是我暂时最这个框架没什么研究,暂不深究。
0 0
原创粉丝点击