当前位置: 首页 > news >正文

【融云分析】基于 AVFoundation 框架开发小视频功能的方案解析

开发视频录制功能最简单的就是使用系统封装的 UIImagePickerController,但是这种方式比较封闭,可自定义东西比较少,所以就需要基于 AVFoundation 框架来开发视频录制功能。基于 AVFoundation 框架来开发,则需要自己手动设置设备音频,视频输入,输出。

AVCaptureSession 是 AVFoundation 的核心类,用于管理捕获对象 AVCaptureInput 的视频和音频的输入,协调捕获的输出 AVCaptureOutput。AVCaptureOutput 的输出有两种方法:一种是直接以 movieFileUrl 方式输出;一种是以原始数据流 data 的方式输出,流程对比图如下:

 

下面详细讲解两种录制视频的方案:

一、AVCaptureSession+AVCaptureMovieFileOutput

1.创建 AVCaptureSession

注意:AVCaptureSession 的调用是会阻塞线程的,建议单独开辟子线程处理。

2.设置音频、视频输入

3.设置文件输出源

4.添加视频预览层

5.开始采集

6.开始录制

当实际的录制开始或停止时,系统会有代理回调。当开始录制之后,这时可能还没有真正写入,真正开始写入会回调下面代理,停止录制也是如此,所以如果你需要对录制视频起始点操作,建议通过系统的回调代理:

7.停止录制

8.停止采集

二、AVCaptureSession+AVAssetWriter

1.创建 AVCaptureSession

2.设置音频、视频输入

3.设置音频 data、视频 data 输出

webp

4.添加视频预览层

5.开始采集

和第一种方式不同,第一种方式是开始录制之后,movieFileOutput 的回调才会触发,停止录制回调触发之后也就完成了。AVCaptureSession + AVAssetWriter 方式因为在设置输出源的时候,把输出代理 (setSampleBufferDelegate)已经设置好了,所以一旦开始采集(startRunning),数据流回调也就触发了。

6.开始录制

这里需要创建 AVAssetWriter,配置音频、视频录制参数,录制写入过程要单独开辟线程处理,避免阻塞线程,可以和 AVCaptureSession 放在同一线程处理。

7.处理数据流

开始采集,数据流就会回调,所以这里用了变量 isRecording 来界定当前是否需要对数据处理,一般是在 startRecord 和 stopRecord 才会去处理数据流。

8.停止录制

9.停止采集

两种方案对比:

相同点:

他们的数据采集都是通过 AVCaptureSession 处理,音频视频的输入源也是一致的,画面预览一致。

不同点:

输出源不一样,前者输出是 fileUrl,也就是说在视频写入完成之前开发者无法操作处理。后者输出是 data,AVAssetWriter 需要拿到 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 两个单独的输出,然后分别处理再写入指定路径。

输出方式不同,决定了开发者对视频处理剪裁压缩的方式也就不同,前者如果需要对视频剪裁压缩,就需要从本地取出完整的视频文件,再做处理;而 AVAssetWriter 拿到的是数据流 data,如果需要剪裁压缩,可以直接配置相关参数后处理数据流,这样写入本地的就是已经处理过的视频文件。

其他功能点扩充

1.聚焦处理

2.摄像头切换

以上就是基于 AVFoundation 框架开发小视频功能的方案解析,更多互联网通信云相关技术内容,点此获取。

相关文章:

  • 融云实时音视频全面升级 打造一体化通信解决方案
  • 【融云通信研习社 | 第一期】在线教育高增长背后的技术避坑指南
  • 【融云通信研习社第二期】中国App出海热潮下的通信技术应用指南
  • 数十家技术社区联名推荐的GeekOnline来了!
  • RTC 技术站上行业新风口,融云 Geek Online 2020 编程挑战赛开拓全新应用场景
  • Geek Online 2020 编程挑战赛上线 大咖评委团全程助阵开发者
  • 【融云分析】聊天室海量消息分发之消息丢弃策略
  • 还记得你第一次视频聊天是什么时候吗?
  • 【融云分析】WebRTC 首帧显示优化策略全解析
  • 融云主办 WICC 2020 探寻互联网通信云技术风向标
  • 【融云分析】iOS 基于实时音视频 SDK 实现屏幕共享功能
  • 【融云分析】基于 ffmpeg 实现重采样和混音
  • 如“乐高”一般的通信中台到底什么样?
  • 高效灵活保障业务安全的音视频审核什么样?
  • 融云携手普元信息为国家部级单位打造协同办公平台
  • Angular Elements 及其运作原理
  • C++类的相互关联
  • java 多线程基础, 我觉得还是有必要看看的
  • java2019面试题北京
  • python3 使用 asyncio 代替线程
  • Redis的resp协议
  • socket.io+express实现聊天室的思考(三)
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue的全局变量和全局拦截请求器
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 分布式熔断降级平台aegis
  • 你不可错过的前端面试题(一)
  • 前端临床手札——文件上传
  • 深度解析利用ES6进行Promise封装总结
  • 事件委托的小应用
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 整理一些计算机基础知识!
  • #FPGA(基础知识)
  • #QT(智能家居界面-界面切换)
  • #Z0458. 树的中心2
  • #宝哥教你#查看jquery绑定的事件函数
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #数学建模# 线性规划问题的Matlab求解
  • (C#)一个最简单的链表类
  • (ZT)薛涌:谈贫说富
  • (笔试题)分解质因式
  • (二)换源+apt-get基础配置+搜狗拼音
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .NET MVC第三章、三种传值方式
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net访问oracle数据库性能问题
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET上SQLite的连接