iOS使用原生AVCapture系列

概述:

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

常见的输出信号:

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

AVCaptureMovieFileOutput输出流实现视频录制

初始化会话层

-(void)sessionConfiguration{

  //初始化一个会话
  session = [[AVCaptureSession alloc] init];
  [session setSessionPreset:AVCaptureSessionPresetMedium];

  //创建视频设备
  AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

  //根据设备创建输入信号
  deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];

  //添加 输出设备 movieFile
  self.deviceMovieFileOutput = [[AVCaptureMovieFileOutput alloc] init];

  [session beginConfiguration];
  //session添加设备输入信号
  if ([session canAddInput:deviceInput]) {
    [session addInput:deviceInput];
  }
  //session添加设备输出信号
  if ([session canAddOutput:self.deviceMovieFileOutput]) {
    [session addOutput:self.deviceMovieFileOutput];
  }
  [session commitConfiguration];
}

创建预览图层

-(void)embedLayerWithView:(UIView *)view{
  if (session == nil) {
    return;
  }
  videoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
  //设置图层的大小
  videoPreviewLayer.frame = view.bounds;
  videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
  [view.layer addSublayer:videoPreviewLayer];
  [session startRunning];
}

录制视频

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

结束录制

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

拍摄视频保存路径

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

会话层启动和关闭

-(void)startCamera{
  [session startRunning];
}

-(void)stopCamera{
  [session stopRunning];
}

代理方法

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error{

  NSLog(@"完成录制");
  NSLog(@"outputFileURL = %@",outputFileURL);

  //**重新录制**//
  if (isAnewRecording) {
    //**删除视频文件**//
    NSFileManager *manager = [NSFileManager defaultManager];
    [manager removeItemAtPath:outputFileURL.absoluteString error:nil];
  }
  //**不取消录制**//
  else{
    //**获取视频时长**//
    AVURLAsset *avUrl = [AVURLAsset URLAssetWithURL:outputFileURL options:nil];
    CMTime time = [avUrl duration];
    int seconds = ceil(time.value/time.timescale);

    NSLog(@"seconds = %d",seconds);

    if ([self.delegate respondsToSelector:@selector(videoDuration:)]) {
      [self.delegate videoDuration:seconds];
    }
    if ([self.delegate respondsToSelector:@selector(playerVideo:)]) {
      [self.delegate playerVideo:outputFileURL.absoluteString];
    }
  }
}

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

(0)

相关推荐

  • iOS AVCaptureSession实现视频录制功能

    本文实例为大家分享了AVCaptureSession实现视频录制功能的具体代码,供大家参考,具体内容如下 #import "RecordingVideoViewController.h" #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibrary.h> @interface RecordingVideoViewController ()<AVCaptureFileOu

  • iOS使用原生AVCapture系列

    概述: 可用于音频.二维码.拍照.录制视频 (均可自定义界面) 常见的输出信号: AVCaptureAudioDataOutput 音频输出 AVCaptureFileOutput 文本输出 AVCaptureMetadataOutput 二维码 条形码- AVCaptureStillImageOutput 拍照 AVCaptureMovieFileOutput 录制视频(不能实现暂停录制和定义视频文件类型) AVCaptureVideoDataOutput + AVCaptureAudioDa

  • React Native系列之Recyclerlistview使用详解

    目录 recyclerlistview的介绍与使用 1.安装 2.概述和功能 3. RecyclerListView的使用 1.dataProvider 2.LayoutProvider 3.rowRenderer 4.onEndReached 5.onEndReachedThreshold 6.extendedState 7.scrollViewProps RecyclerListView所有属性 recyclerlistview的介绍与使用 1.安装 npm install --save r

  • iOS学习笔记(十六)——详解数据库操作(使用FMDB)

    iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包. FMDB同时兼容ARC和非ARC工

  • Unity iOS混合开发界面切换思路解析

    思路 之前一篇文章里面只谈到了Unity和iOS工程的融合,并没有谈到iOS和Unity界面的切换,这里谈谈思路,Unity导出的iOS工程里面的结构大致是这样的,有一个Window,Window上有一个UnityView,但是并没有控制器,也没有根控制器,虽然在导出的iOS工程中Classes文件夹下的UnityAppController中有rootController的属性,但是上面也标注为空~ 所以,思路就只有一种,,既然Unity导出的iOS工程有一个Window并没有控制器,那好,混合

  • Android原生项目集成Flutter解决方案

    了解一下如何在 Android 原生项目中集成 Flutter 生成配置 在原生项目根目录执行命令 flutter create -t module --org {package_name} {module_name} // 此处 module_name 的命令遵循 Android 子 module 的命名即可.不能有中划线. // 比如, flutter create -t module --org com.engineer.mini.flutter flutter_sub // 此处 mod

  • 低门槛开发iOS、Android、小程序应用的前端框架详解

    现如今跨平台开发技术已不是什么新鲜话题了,在市面上也有一些开源的框架可供选择,然而技术成熟.产品服务健全的平台并不多,其中也不乏推陈出新的框架值得关注. 比如最近使用的AVM,由APICloud迭代推出的多端开发框架,基于JavaScript,兼容多语法,如果是Vue.React的用户,可直接上手,没什么学习成本,具备虚拟DOM,可一次编写多端渲染:主要是APICloud上线已有7年,相对已经成熟,所以我把自己的一些认知和实践结合AVM官方文档的内容做了一下整理,希望能对需要使用跨平台开发技术的

  • 煮饺子论云原生docker与kubernetes之间的关系

    目录 前言 一.周末煮饺子聊到容器问题 二.说说docker与煮饺子的容器 三.聊聊集群煮饺子(k8s) 前言 云原生的概念最近非常火爆,企业落地云原生的愿望也越发强烈.看过很多关于云原生的文章,要么云山雾罩,要么曲高和寡. 所以笔者就有了写<大话云原生>系列文章的想法,期望用最通俗.简单的语言说明白云原生生态系统内的组成及应用关系.那么,开始吧,这是第一篇! 这真的是一篇讲架构技术的文章,不是小说!建议您看下去! 一.周末煮饺子聊到容器问题 周末和老婆一起包了顿饺子,“老公,我去买瓶醋,你把

  • 从小饭馆客流量变大论云原生负载均衡

    目录 一.前言 二.从路边摊说起 三.开饭馆与负载均衡 说说客户端负载均衡与服务端负载均衡 利与弊: 四.饭后沟通 一.前言 这是<大话云原生>系列的第二篇,第一篇<煮饺子与docker.kubernetes之间的关系>推出之后受到大家的欢迎,很多朋友联系到我给我加油打气,还得到了CSDN头部博主哪吒大佬的支持,感谢!我会继续写下去! 书接上回介绍了<煮饺子与docker.kubernetes之间的关系>之后,小娜同学(我老婆)问:为什么不把服务统一开发成一个应用?搞什

  • Android开发笔记之:Splash的实现详解

    什么是SplashSplash也就是应用程序启动之前先启动一个画面,上面简单的介绍应用程序的厂商,厂商的LOGO,名称和版本等信息,多为一张图片,显示几秒钟后会自动消息,然后显示出应用程序的主体页面.在PC上,很常见各种平台的应用程序都会有,多半是一张图片显示在屏幕中央,如Microsoft Office系列,或者GIMP等.在各种游戏中Splash是最常见的,几乎所有的游戏开始都会有一张全屏的图片,上面通常都显示厂商的LOGO,游戏的名称等.在手机平板等移动设备上,类似PC的Splash很少,

  • PHP结合Vue实现滚动底部加载效果

    前言 最近的一个项目手机端分页跳转不理想,自己做了一个滚动加载的一个Demo,下面话不多说了,来一起看看详细的介绍吧. 实现思路 1.获得滚动条到底部的距离 getScrollBottomHeight() 2.绑定滚动事件handleScroll() ,handleScroll()判断滚动条到底部距离是否小于设置的bottomHight,并且增加一个loading属性,防止加载时滑动时多次触发,造成多次加载 3.Ajax请求load.php,通过Page去查询获得当前页数(page+1)的内容

随机推荐