iOS使用原生AVCapture系列

前端之家收集整理的这篇文章主要介绍了iOS使用原生AVCapture系列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述:

可用于音频、二维码、拍照、录制视频 (均可自定义界面)

常见的输出信号:

  • AVCaptureAudioDataOutput 音频输出
  • AVCaptureFileOutput 文本输出
  • AVCaptureMetadataOutput 二维码 条形码…
  • AVCaptureStillImageOutput 拍照
  • AVCaptureMovieFileOutput 录制视频(不能实现暂停录制和定义视频文件类型)
  • AVCaptureVideoDataOutput + AVCaptureAudioDataOutput 录制视频的灵活性更强(能实现暂停录制和定义视频文件类型)
  • @H_403_23@

    AVCaptureMovieFileOutput输出流实现视频录制

    初始化会话层

    1. -(void)sessionConfiguration{
    2.  
    3. //初始化一个会话
    4. session = [[AVCaptureSession alloc] init];
    5. [session setSessionPreset:AVCaptureSessionPresetMedium];
    6.  
    7. //创建视频设备
    8. AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    9.  
    10. //根据设备创建输入信号
    11. deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];
    12.  
    13. //添加 输出设备 movieFile
    14. self.deviceMovieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
    15.  
    16. [session beginConfiguration];
    17. //session添加设备输入信号
    18. if ([session canAddInput:deviceInput]) {
    19. [session addInput:deviceInput];
    20. }
    21. //session添加设备输出信号
    22. if ([session canAddOutput:self.deviceMovieFileOutput]) {
    23. [session addOutput:self.deviceMovieFileOutput];
    24. }
    25. [session commitConfiguration];
    26. }

    创建预览图层

    1. -(void)embedLayerWithView:(UIView *)view{
    2. if (session == nil) {
    3. return;
    4. }
    5. videoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
    6. //设置图层的大小
    7. videoPreviewLayer.frame = view.bounds;
    8. videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    9. [view.layer addSublayer:videoPreviewLayer];
    10. [session startRunning];
    11. }

    录制视频

    1. -(void)takePhoto:(NSURL *)fileURL{
    2. [self.deviceMovieFileOutput startRecordingToOutputFileURL:fileURL recordingDelegate:self];
    3. }

    结束录制

    1. -(UIImageView *)finishRecord:(UIView *)view isAnewRecording:(BOOL)anewRecording{
    2. gifImageView = [[UIImageView alloc] initWithFrame:view.bounds];
    3. [view addSubview:gifImageView];
    4. isAnewRecording = anewRecording; //存储是否重新录制
    5. //停止录制(停止录制后做代理方法)
    6. [self.deviceMovieFileOutput stopRecording];
    7. return gifImageView;
    8. }

    拍摄视频保存路径

    1. +(NSString *)getVideoSaveFilePath{
    2. NSString*documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];
    3. NSString *filePath = [documentPath stringByAppendingPathComponent:@"video.mp4"];
    4. return filePath;
    5. }

    会话层启动和关闭

    1. -(void)startCamera{
    2. [session startRunning];
    3. }
    4.  
    5. -(void)stopCamera{
    6. [session stopRunning];
    7. }

    代理方法

    1. - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error{
    2.  
    3. NSLog(@"完成录制");
    4. NSLog(@"outputFileURL = %@",outputFileURL);
    5.  
    6. //**重新录制**//
    7. if (isAnewRecording) {
    8. //**删除视频文件**//
    9. NSFileManager *manager = [NSFileManager defaultManager];
    10. [manager removeItemAtPath:outputFileURL.absoluteString error:nil];
    11. }
    12. //**不取消录制**//
    13. else{
    14. //**获取视频时长**//
    15. AVURLAsset *avUrl = [AVURLAsset URLAssetWithURL:outputFileURL options:nil];
    16. CMTime time = [avUrl duration];
    17. int seconds = ceil(time.value/time.timescale);
    18.  
    19. NSLog(@"seconds = %d",seconds);
    20.  
    21. if ([self.delegate respondsToSelector:@selector(videoDuration:)]) {
    22. [self.delegate videoDuration:seconds];
    23. }
    24. if ([self.delegate respondsToSelector:@selector(playerVideo:)]) {
    25. [self.delegate playerVideo:outputFileURL.absoluteString];
    26. }
    27. }
    28. }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

猜你在找的iOS相关文章