Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS - 采集音视频及写入文件

iOS - 采集音视频及写入文件

作者头像
LinXunFeng
发布于 2018-06-29 07:39:31
发布于 2018-06-29 07:39:31
1K00
代码可运行
举报
文章被收录于专栏:LinXunFeng的专栏LinXunFeng的专栏
运行总次数:0
代码可运行

�音视频采集包括两部分:视频采集和音频采集。在iOS中可以同步采集视频与音频,通过系统框架AVFoundation,可以帮助我们采集音频与视频,对于视频还可以进行切换前后摄像头,最终我们将录制好的视频写入沙盒中

DEMO

音视频数据的采集与展示

一、初始化视频的输入与输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 懒加载一个session,所有的操作都需要session来执行
fileprivate lazy var session: AVCaptureSession = AVCaptureSession()
// 保存�视频输出
fileprivate var videoOutput: AVCaptureVideoDataOutput?
// 保存视频输入
fileprivate var videoInput: AVCaptureDeviceInput?
// 保存预览图层
fileprivate var previewLayer: AVCaptureVideoPreviewLayer?

设置视频输入源与输出源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 设置视频输入源
guard let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] else { return }
// 获取我们的前置摄像头(后置为.back)
guard let device = devices.filter({ $0.position == .front }).first else { return }
guard let input = try? AVCaptureDeviceInput(device: device) else { return }
self.videoInput = input

// 设置视频输出源
let output = AVCaptureVideoDataOutput()
let queue = DispatchQueue.global()
// 设置代理,并在代理中获取采集到的数据,需要遵守 AVCaptureVideoDataOutputSampleBufferDelegate
output.setSampleBufferDelegate(self, queue: queue)
self.videoOutput = output

设置音频的输入源与输出源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 设置音频的输入源
guard let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio) else { return }
guard let input = try? AVCaptureDeviceInput(device: device) else {return}

// 设置音频输出源
let output = AVCaptureAudioDataOutput()
let queue = DispatchQueue.global()
// 需要遵守 AVCaptureAudioDataOutputSampleBufferDelegate
output.setSampleBufferDelegate(self, queue: queue)

添加音频与视频的输入与输出到session中,但是每次添加之前需要先判断是否可以添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 添加输入与输出

// 注意:每次对session进行设置之前都需要调用session的【beginConfiguration】方法
// 来告诉系统你现在要开始进行配置,结束配置后再调用【commitConfiguration】方法来提交配置
session.beginConfiguration()
if session.canAddInput(input) {
    session.addInput(input)
}
if session.canAddOutput(output) {
    session.addOutput(output)
}
session.commitConfiguration()

二、实现音视频的采集代理

音视频虽然需要遵守的代理名称不一样,但是需要实现的方法是一致的,所以要拿到音频或者视频就得先进行判断,需要用到AVCaptureOutput的这个方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// This convenience method returns the first AVCaptureConnection in the receiver's
// connections array that has an AVCaptureInputPort of the specified mediaType. If 
// no connection with the specified mediaType is found, nil is returned.

open func connection(withMediaType mediaType: String!) -> AVCaptureConnection!
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extension ViewController: AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate {
    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {
        if videoOutput?.connection(withMediaType: AVMediaTypeVideo) == connection {
            print("视频数据")
        } else {
            print("音频数据")
        }
    }
}

三、初始化一个预览图层用来显示采集到的视频(非采集所必须的步骤)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 创建预览图层
guard let previewLayer = AVCaptureVideoPreviewLayer(session: session) else {return}
previewLayer.frame = view.bounds

// 将图层添加到控制器的view的layer中
view.layer.insertSublayer(previewLayer, at: 0)
self.previewLayer = previewLayer

现在基本功能都有了,如果想要开始采集音视频只需要调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 开始录制
session.startRunning()
// 结束录制
session.stopRunning()

切换镜头

其实就是换掉当前的视频输入法制,这里的过程跟上面的设置输入源一样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1.取出之前镜头的方向
guard let videoInput = videoInput else { return }
let position: AVCaptureDevicePosition = videoInput.device.position == .front ? .back : .front

guard let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] else { return }
guard let device = devices.filter({ $0.position == position }).first else { return }
guard let newInput = try? AVCaptureDeviceInput(device: device) else { return }

// 2.移除之前的input,添加新的input
session.beginConfiguration()
session.removeInput(videoInput)
if session.canAddInput(newInput) {
    session.addInput(newInput)
}
session.commitConfiguration()

// 3.保存最新的input
self.videoInput = newInput

录制视频写入文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fileprivate var movieOutput: AVCaptureMovieFileOutput?

在开始采集音视频的时候就要开始写入文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 开始写入文件 

// 1、创建写入文件的输出
let fileOutput = AVCaptureMovieFileOutput()
self.movieOutput = fileOutput // 保存起来,用于停止写入文件

// 设置类型,不然报错(这两句很重要)
let connection = fileOutput.connection(withMediaType: AVMediaTypeVideo)
connection?.automaticallyAdjustsVideoMirroring = true

if session.canAddOutput(fileOutput) {
    session.addOutput(fileOutput)
}

// 2、直接开始写入文件
let filePath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! + "/abc.mp4"
let fileUrl = URL(fileURLWithPath: filePath)
fileOutput.startRecording(toOutputFileURL: fileUrl, recordingDelegate: self)

在停止采集音视频的时候停止写入文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 停止写入文件
movieOutput?.stopRecording()

详情请看 DEMO

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.07.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS 音视频采集要点梳理(1)
从 AVCaptureDevcie 捕获的数据,是个抽象类,需要继承后使用,例如**:**AVCaptureDeviceInput,还有其他input 源,可参考Apple 官网文档根据场景选用。
magianter
2021/12/06
7760
iOS 音视频采集
iOS的音视频采集用到了AVCaptureSession。关于AVCaptureSession,苹果的官方文档里的描述如下:
GF
2020/11/27
1.2K0
音视频基础能力之 iOS 视频篇(一):视频采集
涉及硬件的音视频能力,比如采集、渲染、硬件编码、硬件解码,通常是与客户端操作系统强相关的,就算是跨平台的多媒体框架也必须使用平台原生语言的模块来支持这些功能
声知视界
2024/11/15
2010
音视频基础能力之 iOS 视频篇(一):视频采集
iOS AVDemo(7):视频采集,视频系列来了丨音视频工程示例
iOS/Android 客户端开发同学如果想要开始学习音视频开发,最丝滑的方式是对音视频基础概念知识有一定了解后,再借助 iOS/Android 平台的音视频能力上手去实践音视频的采集 → 编码 → 封装 → 解封装 → 解码 → 渲染过程,并借助音视频工具来分析和理解对应的音视频数据。
关键帧
2022/06/13
8950
iOS AVDemo(7):视频采集,视频系列来了丨音视频工程示例
AVFoundation 框架初探究(二)
接着第一篇总结 ----       系列第一篇地址:AVFoundation 框架初探究(一)       在第一篇的文章中,我们总结了主要有下面几个点的知识:       1、对AVFoundation框架整体的一个认识       2、AVSpeechSynthesizer这个文字转音频类       3、AVAudioPlayer音频播放类       4、AVAudioRecorder音频录制类       5、AVAudioSession音频会话处理类        上面第一篇说的内容,大致
Mr.RisingSun
2018/03/19
1.8K0
AVFoundation 框架初探究(二)
AVFoundation框架解析看这里(2)- 媒体捕捉与视频拍摄
上一章节主要从整体上全览AVFoundation框架,本章主要以一个小的需求(以媒体捕捉以起点,拍摄、保存视频),打开AVFoundation的大门,带领我们欣赏这个框架带来的强大功能。
sweet说好的幸福
2020/12/23
1.2K0
AVFoundation框架解析看这里(2)- 媒体捕捉与视频拍摄
iOS-AVFoundation自定义相机详解
AVFoundation 中关于视频主要的类 目录 相机基本实现步骤 捕捉会话——AVCaptureSession 捕捉输入——AVCaptureDeviceInput 捕捉预览——AVCaptureVideoPreviewLayer/OpenGL ES 捕捉连接——AVCaptureConnection 拍照——AVCaptureStillImageOutput 音频——AVCaptureAudioDataOutput 视频——AVCaptureVideoDataOutput 生成视频文件——AVA
用户2215591
2018/06/29
2.7K0
iOS - 视频采集详解
苹果官方文档-AVFoundation 为了管理从相机或者麦克风等这样的设备捕获到的信息,我们需要输入对象(input)和输出对象(output),并且使用一个会话(AVCaptureSession)来管理 input 和 output 之前的数据流: 类名 简介 AVCaptureDevice 输入设备,例如 摄像头 麦克风 AVCaptureInput 输入端口 [使用其子类] AVCaptureOutput 设备输出 [使用其子类],输出视频文件或者静态图像 AVCaptureSession 管理输入
LinXunFeng
2018/06/29
1.3K0
iOS摄像头采集和编码
使用AVCaptureSession创建采集会话,获取图像数据后通过VideoToolBox进行编码。
gongluck
2022/05/09
1K0
AVFoundation 框架介绍
本文是 iOS/Android 音视频开发专题 第九篇,该专题中项目代码将在 Github 进行托管,你可在微信公众号(GeekDev)后台回复 资料 获取项目地址。
100001509164
2019/11/05
3.6K0
AVFoundation 框架介绍
AVFoundation 视频拍摄基础篇
停止录制之后 可以在AVCaptureFileOutputRecordingDelegate回调方法中做对应的处理,比如视频转码,存入相册 等等。
陈雨尘
2021/02/05
1K0
AVFoundation 视频拍摄基础篇
GPUImage详细解析(五)滤镜视频录制
回顾 GPUImage的基础在详细解析1~4。 这次的介绍是录制视频,添加滤镜,保存到手机。 核心思路 通过GPUImageVideoCamera采集视频和音频的信息,音频信息直接发送给GPUIma
落影
2018/04/27
1.9K0
GPUImage详细解析(五)滤镜视频录制
「音视频直播技术」iOS视频采集
前两天给大家介绍了如何在iOS下进行音频采集,今天介绍一下在iOS下进行视频采集。要了解iOS是怎样进行视频采集的,首先我们要了解 AVCaptureSession, AVCaptureDevice等几个基本概念及iOS上视频采集的工作原理。
音视频_李超
2020/04/02
1.9K0
「音视频直播技术」iOS视频采集
RenderDemo(2):用 OpenGL 渲染视频丨音视频工程示例
渲染是音视频技术栈相关的一个非常重要的方向,视频图像在设备上的展示、各种流行的视频特效都离不开渲染技术的支持。
关键帧
2023/02/14
1.4K0
RenderDemo(2):用 OpenGL 渲染视频丨音视频工程示例
Metal入门教程(三)摄像头采集渲染
前面的教程介绍了如何绘制一张图片和如何把图片显示到3D物体上并进行三维变换,这次介绍如何用Metal渲染摄像头采集到的图像。
落影
2020/10/26
1.5K0
iOS二维码扫描
AVCaptureDevice提供了一个类方法,指定一种媒体类型(AVMediaTypeVideo or AVMediaTypeAudio)它便能返回对应的录制设备。其他媒体类型可以在AVMediaFormat.h中找到,不过它们不需要录制设备(如文本、字幕等)。
全栈程序员站长
2022/09/12
8750
iOS 端实现1对1音视频实时通话
之前,我已经写过 Android 端实现1对1音视频实时通话 的文章。在那篇文章中,我向大家介绍了在 Android 端是如何使用 WebRTC 进行音视频通话的。今天,我们再来看看 iOS 端1对1音视频实时通话的具体实现。
音视频_李超
2020/04/01
4.4K0
iOS 端实现1对1音视频实时通话
iOS开发——系统原生的二维码扫描
对于现在的App应用来说,扫描二维码这个功能是再正常不过的一个功能了,在早期开发这些功能的时候,大家或多或少的都接触过ZXing和ZBar这类的第三方库,但从iOS7以后,苹果就给我们提供了系统原生的API来支持我们扫描获取二维码,ZXing和ZBar在使用中或多或少有不尽如人意的地方,再之停止更新很久了,所以今天我们就来聊聊如何用系统原生的方法扫描获取二维码。
Originalee
2018/08/30
8540
音视频面试题集锦第 16 期
通常我们通过 AVCaptureSession 相关的 API 来进行音视频的采集,其中主要组件分为 Input、Output、Session 几个部分:
关键帧
2024/02/26
4550
音视频面试题集锦第 16 期
iOS AVDemo(9):视频封装,采集编码 H.264/H.265 并封装 MP4丨音视频工程示例
iOS/Android 客户端开发同学如果想要开始学习音视频开发,最丝滑的方式是对音视频基础概念知识有一定了解后,再借助 iOS/Android 平台的音视频能力上手去实践音视频的采集 → 编码 → 封装 → 解封装 → 解码 → 渲染过程,并借助音视频工具来分析和理解对应的音视频数据。
关键帧
2022/06/13
5040
iOS AVDemo(9):视频封装,采集编码 H.264/H.265 并封装 MP4丨音视频工程示例
相关推荐
iOS 音视频采集要点梳理(1)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验