返回顶部
首页 > 资讯 > 移动开发 >iOS使用原生AVCapture系列
  • 836
分享到

iOS使用原生AVCapture系列

iOSAVCapture 2022-06-02 01:06:57 836人浏览 泡泡鱼
摘要

概述: 可用于音频、二维码、拍照、录制视频 (均可自定义界面) 常见的输出信号: AVCaptureAudioDataOutput 音频输出 AVCaptureFileO

概述:

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

常见的输出信号:

  • 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];
    }
  }
}

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

--结束END--

本文标题: iOS使用原生AVCapture系列

本文链接: https://lsjlt.com/news/30199.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • iOS使用原生AVCapture系列
    概述: 可用于音频、二维码、拍照、录制视频 (均可自定义界面) 常见的输出信号: AVCaptureAudioDataOutput 音频输出 AVCaptureFileO...
    99+
    2022-06-02
    iOS AVCapture
  • Flutter与原生IOS(swift)交互系列之一
    先用Android Studio创建一个空的flutter工程作为演示 可以看到根目录下有一个名为ios的目录,这个就是ios的工程目录。 我们将它展开,发现下面有许多个文件 ...
    99+
    2023-08-31
    flutter ios Powered by 金山文档
  • JS调用Android、Ios原生控件
    在上一篇博客(详解JS与APP原生控件交互)中已经和大家聊了,关于JS与Android、Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android、Io...
    99+
    2022-06-06
    IOS js Android
  • 云原生系列Kubernetes深度解析YAML文件使用
    目录写在前面YAML基础MapsLists使⽤ YAML 创建 Pod创建 Pod创建 Deployment写在前面 在前⾯的课程中,我们在安装 kubernetes 集群的时候使⽤...
    99+
    2024-04-02
  • iOS砸壳系列之三:Frida介绍和使用
    当涉及从App Store下载应用程序时,它们都是已安装的iOS应用(IPA)存储在设备上。这些应用程序通常带有保护的代码和资源,以限制用户对其进行修改或者逆向工程。 然而,有时候,为了进行调试、制作...
    99+
    2023-10-09
    ios cocoa macos iOS逆向 objective-c
  • 使用mysql.help_topic生成序列
    本文来说下如何使用mysql.help_topic生成序列 文章目录 问题由来使用实例 问题由来 有时我们在生成一些时间轴类似的数据时,要求数据库不管有没有指定天的数据,都要生成该时间节点,可用mysql.help_...
    99+
    2023-08-23
    dba 数据库开发
  • 系列文章:云原生Kubernetes日志落地方案
    在Logging这块做了几年,最近1年来越来越多的同学来咨询如何为Kubernetes构建一个日志系统或者是来求助在这过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是想把我们这些年积累的经验以文章的...
    99+
    2024-04-02
  • 云原生系列 【轻松入门容器基础操作】
     ✅作者简介:                         CSDN内容合伙人,全栈领域新星创作者,阿里云专家博主,华为云云 享专家博主,掘金后端评审团成员 💕前言: 最近云原生领域热火朝天,那么云原生...
    99+
    2023-09-08
    服务器 运维 沙箱实验 华为云
  • iOS内存管理TaggedPointer使用原理详解
    目录正文Tagged Pointer 的原理MacOS 分析如何判断 Tagged Pointer Tagged Pointer 注意点正文 为了节省内存和提高执行效率,...
    99+
    2023-01-06
    iOS内存管理Tagged Pointer iOS Tagged Pointer
  • iOS中排列组合算法的使用小结
    前言 最近在项目中用到了排列组合计算,虽然比较简单,但是整个学习过程还是要记录下来的,以便以后可以吸取经验。 一般来说,排列组合就等于搜索。 注意点: 去重复:规定子集顺序必须升...
    99+
    2022-05-26
    ios 排列组合算法
  • Flutter Cupertino如何构建外观和感觉原生的 iOS应用
    Flutter中的Cupertino库提供了一些widget,可以帮助开发者构建外观和感觉原生的iOS应用。下面是一些使用Cuper...
    99+
    2023-09-20
    iOS
  • Java原生HttpClient怎么使用
    这篇文章主要介绍“Java原生HttpClient怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java原生HttpClient怎么使用”文章能帮助大家解决问题。1.信任证书管理类packa...
    99+
    2023-06-29
  • 怎么使用原生的Feign
    这篇文章主要介绍了怎么使用原生的Feign,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是FeignFeign 是由 Netflix 团队开发的一款基于 Java 实现的...
    99+
    2023-06-25
  • python原生字符的使用
    这里是一点小心得:由于下面两个原因,在正则表达式中使用反斜杠就会产生了一个双重转换的问题。(1)、python自身处理字符串时,反斜杠是用于转义字符(2)、正则表达式也使用反斜杠来转义字符     要匹配字符串中1个反斜杠应该怎么写正则表达...
    99+
    2023-01-31
    字符 python
  • asp.net怎么使用原生控件实现自定义列导出功能
    本篇内容主要讲解“asp.net怎么使用原生控件实现自定义列导出功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“asp.net怎么使用原生控件实现自定义列导出功能”吧!自定义列实现最近负责开发...
    99+
    2023-06-28
  • Java原生HttpClient的使用详解
    目录1.信任证书管理类2.HttpClient类3.发送请求工具类4.测试提到Java发送HTTP请求,大家首先想到的是用apache的HttpClient,或者squareup的O...
    99+
    2024-04-02
  • Uniapp——使用安卓原生插件
    Uniapp——使用安卓原生插件 1. 开发环境2. 解压SDK压缩包3. 导入UniPlugin-Hello-AS项目、并切换为project显示4. 可删除提供的demo文件5. 新建mo...
    99+
    2023-10-07
    android uni-app android studio
  • k8sservice使用详解(云原生kubernetes)
    目录一、什么是服务service?二、service分类2.1 ClusterIP2.2 NodePort2.3 LoadBalancer(付费方案)2.4 ExternalName...
    99+
    2023-02-14
    k8s service使用 k8s service
  • MyBatis中怎么使用原生SQL
    在MyBatis中使用原生SQL可以通过使用<select>, <insert>, <upd...
    99+
    2024-03-07
    MyBatis
  • python如何使用列表生成式
    这篇文章主要为大家展示了“python如何使用列表生成式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何使用列表生成式”这篇文章吧。多多使用列表生成式替换下面代码:cube_num...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作