iOS 音视频采集以及写入文件(swift)

IOS端使用WebRTC实现一对一音视频通话 前言WebRTC 实现P2P音视频通话——原生IOS端使用WebRTC实现一对一音视频通话将基于前两篇博客的基础环境之上实现IOS原生客户端P2P音视频通话。 阅读详情

iOS音视频采集以及写入文件(swift)


注意:配置允许访问相机与麦克风参考这里

1.初始化文件属性
class ViewController: UIViewController {
    
    fileprivate lazy var session: AVCaptureSession = AVCaptureSession()
    //视频输出
    fileprivate var videoOutPut: AVCaptureVideoDataOutput?
    //预览层
    fileprivate var previewLayer: AVCaptureVideoPreviewLayer?
    //视频输入
    fileprivate var videoInput: AVCaptureDeviceInput?
    //文件输出
    fileprivate var fileOutPut: AVCaptureMovieFileOutput?

    override func viewDidLoad() {
        super.viewDidLoad()
        //MARK: 视频采集
        initVideoInputOutput()
        //MARK: 音频采集
        initAudioInputOutput()
        //MARK: 创建预览层
        initPreViewLayer()
    }
    
}


2.音视频进行采集
extension ViewController {
    //视频采集
    fileprivate func initVideoInputOutput(){
        //视频输入
        guard let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] else{return}
        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()
        output.setSampleBufferDelegate(self, queue: DispatchQueue.global())
        self.videoOutPut = output
        //添加输入输出
        addInputOutPut(input, output)
    }
    
    //音频采集
    fileprivate func initAudioInputOutput(){
        //音频输入
        guard let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio) else {return}
        guard let input = try? AVCaptureDeviceInput(device: device) else {return}
        //音频输出
        let output = AVCaptureAudioDataOutput()
        output.setSampleBufferDelegate(self, queue: DispatchQueue.global())
        //添加输入输出
        addInputOutPut(input, output)
    }
    
    //添加输入和输出
    private func addInputOutPut(_ input: AVCaptureInput, _ output: AVCaptureOutput) {
        //添加输入输出
        session.beginConfiguration()
        if session.canAddInput(input) {
            session.addInput(input)
        }
        if session.canAddOutput(output){
            session.addOutput(output)
        }
        session.commitConfiguration()
    }
    //创建预览层
    fileprivate func initPreViewLayer(){
        guard let preLayer = AVCaptureVideoPreviewLayer(session: session) else {return}
        self.previewLayer = preLayer
        preLayer.frame = view.bounds
        view.layer.insertSublayer(preLayer, at: 0)
    }
}


3.采集的代理方法
//MARK: AVCapture delegate
extension ViewController: AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate {
    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {
        if videoOutPut?.connection(withMediaType: AVMediaTypeVideo) == connection {
            print("采集到视频数据")
        }else{
            print("采集到音频数据")
        }
    }
}


4.开始采集、结束采集、切换摄像头方法调用
extension ViewController{

    //开始采集
    @IBAction func startCapture(_ sender: Any) {
        print("startCapture")
        session.startRunning()
        movieOutPutFile()
    }
    
    //结束采集
    @IBAction func endCapture(_ sender: Any) {
        print("endCapture")
        self.fileOutPut?.stopRecording()
        session.stopRunning()
        previewLayer?.removeFromSuperlayer()
    }
    
    //切换镜头
    @IBAction func changeDirection(_ sender: Any) {
        print("changeDirection")
        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}
        self.videoInput = newInput
        session.beginConfiguration()
        session.removeInput(videoInput)
        if session.canAddInput(newInput) {
            session.addInput(newInput)
        }
        session.commitConfiguration()
    }
    
    //写入文件
    fileprivate func movieOutPutFile() {
        let fileOutPut = AVCaptureMovieFileOutput()
        let connection = fileOutPut.connection(withMediaType: AVMediaTypeVideo)
        connection?.automaticallyAdjustsVideoMirroring = true
        print(session)
        session.beginConfiguration()
        session.removeOutput(self.fileOutPut)
        if session.canAddOutput(fileOutPut) {
            session.addOutput(fileOutPut)
        }
        session.commitConfiguration()
        self.fileOutPut = fileOutPut
        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! + "/glt.mp4"
        fileOutPut.startRecording(toOutputFileURL: URL(fileURLWithPath: path), recordingDelegate: self)
    }
    
}

5.写入文件代理
//MARK: 写入文件代理
extension ViewController: AVCaptureFileOutputRecordingDelegate {

    func capture(_ captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAt fileURL: URL!, fromConnections connections: [Any]!) {
        print("开始录制")
    }
    
    func capture(_ captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) {
        print("结束录制")
    }
    
}



Swift 开源项目汇总 阅读详情

相关推荐

iOS 视频采集

本文主要介绍iOS媒体捕捉和视频采集。媒体捕获会话(包括音频和视频),负责把捕获的音视频数据输出到输出设备中。

qq_33157041的博客 406

IOS 摄像头采集之 AVCaptureDevice 简单使用 (Swift)

一,基础 AVFoundation框架中有几个类实现图像捕捉 ,通过这些类可以访问来自相机设备的原始数据并控制它的组件 AVCaptureDevice 是相机硬件相关,可以设置硬件属性:曝光,镜头位置,闪光灯,白平衡等 AVCaptureSession 管理输入输出的数据流 AVCaptureVideoPreviewLayer 是 CALayer 的子类,可用于自动显示相机产生的实时图像 二...

u010141160的博客 6765

videoshader, 基于脚本的opengl/ios实时视频处理技术.zip

videoshader, 基于脚本的opengl/ios实时视频处理技术 VideoShader基于脚本的opengl/ios实时视频处理技术概述VideoShader是面向 opengl/ios的视频处理技术,它允许开发人员和设计人员结合多个基于opengl的视频过滤器来设计视频管道。由于每个视频过滤

swift之视频播放AVKIT、AVPlayerViewController、音频录制和播放

AVFoundation框架简介AVFoundation框架是iOS中专门处理音视频的框架,其中集成了音频播放以及处理和视频播放处理以及采集等功能(实现录制,编辑和播放音视频功能);以及配置音频会话更新设备音视频环境等功能。AVKit框架基于此框架实现的。 在 AVFoundation 框架中使用的基本数据结构,如时间相关的或描述媒体数据的数据结构都声明在 CoreMedia 框架中。 ...

代码解释生活 1万+

videoshader:用于OpenGLiOS的基于脚本的实时视频处理技术

VideoShader 基于脚本的OpenGL / iOS实时视频处理技术 概述 VideoShader是用于OpenGL / iOS的基于脚本的视频处理技术,它使开发人员和设计人员可以通过组合多个基于OpenGL的视频过滤器来设计视频管道。 因为每个视频过滤器都基于OpenGL构建,所以所有视频处理都将由GPU完成,而根本不涉及CPU操纵像素。 这种纯粹的基于GPU的体系结构使其可以实时(30fps)处理iPhone4s上的SD视频和iPhone5上的高清视频! VideoShader脚本 VideoShader Script(VSScript)是基于JSON的语言,这使开发人员可以非常轻松地描述视频管道。 在运行时,VideoShader将脚本编译为OpenGL阴影语言(GLSL),并非常高效地执行它。 这是VSScript中描述的著名的“卡通过滤器”。 { "tit

SwiftAudioPlayer:使用AVAudioEngine进行流式传输和实时音频处理

SwiftAudioPlayer 基于Swift的音频播放器,以AVAudioEngine为基础。 允许:流式传输在线音频,播放本地文件,更改音频速度(3.5倍,4倍,32倍),音调和使用自定义的实时音频处理。 该播放器是为。 我们最初使用AVPlayer播放音频,但我们想操纵流式传输的音频。 我们最初设置AVAudioEngine只是为了播放保存在手机上的文件,并且效果很好,但是AVAudioEngine本身不像AVPlayer那样容易地支持流音频。 因此,使用 ,我们可以流音频并将下载的数据转换为可用数据,以供AVAudioEngine播放。 有关我们的解决方案的概述,请查看我们的。 基本特征 实时音频操作,包括使用,最高可达到10倍的速度 使用AVAudioEngine流式传输在线音频 使用相同的API播放本地保存的音频 下载音频 排队下载和流式传输音频以进行自动播放 仅使用1

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

音视频采集包括两部分:视频采集和音频采集。在iOS中可以同步采集视频与音频,通过系统框架AVFoundation,可以帮助我们采集音频与视频,对于视频还可以进行切换前后摄像头,最终我们将录制好的视频写入沙盒中 音视频数据的采集与展示一、初始化视频的输入与输出// 懒加载一个session,所有的操作都需要session来执行 fileprivate lazy var session: AVCapt

LinXunFeng的博客 1996

音频流应用程序-最简单的实现-Swift开发

音频流应用程序-最简单的实现音频流应用程序描述对于iOS职位,我被要求实施流媒体应用程序。 每当流转换到下一首歌曲时,该应用程序应更新歌手,歌曲名称和封面图像。 这个应用程序可能是启动和运行流式应用程序,具有暂停功能甚至看起来不错的功能所需的最简单的实现。

使用Swift,录制并保存音频文件

// // RecordSoundsViewController.swift // PitchPerfect // // Created by Zzcz on 2017/9/27. // Copyright © 2017年 fly. All rights reserved. // import UIKit import AVFoundation class RecordSoundsVi

flyToSky_L的博客 2596

手把手教你用TLP350驱动IGBT:光耦隔离驱动电路完整设计教程

本文详细介绍了如何使用TLP350光耦隔离驱动电路设计IGBT驱动方案。从TLP350芯片特性分析到驱动电路架构设计,包括信号调理、自举电源和栅极控制网络,再到PCB布局优化和保护电路设计,提供了完整的实战指南。通过实测波形分析和故障排查,帮助工程师快速掌握IGBT驱动电路的设计要点和进阶技巧。

weixin_30566063的博客 822

AXI4-Stream FIFO IP核实战指南——从配置到跨时钟域处理

本文是AXI4-Stream FIFO IP核的实战指南,详细讲解了其作为数据流缓冲核心的作用。文章重点涵盖从Vivado环境下的IP核配置、关键参数(如深度与宽度)设定,到跨时钟域处理的完整流程。深入解析了TVALID/TREADY握手协议及TLAST等信号,并提供了常见问题排查与调试技巧,帮助开发者高效实现FPGA/SoC系统中可靠的数据流缓冲与同步。

weixin_29251567的博客 480

FFmpeg音视频开发实战6 iOS/Android/windows/Linux

本课程为《FFmpeg音视频开发实战5》的进阶课程,也是终结篇。从第6部分开始,我们进入高阶课程的学习。针对音视频核心功能进一步深化讲解,更多的实际案例,从FFmpeg本地音视频处理,深入UDP网络通讯协议,UDP高效实时视频传输,丢包处理,到OpenGL/ES 特效,滤镜,到webRTC,SIP重量级网络通讯协议框架.以及当前比较流行,未来人才需求量非常大的机器学习,深度学习,移动端人工智能,投入更多的内容。

利用WI生成无线信道数据

选取DeepMIMO的一个射线追踪场景O1(Outdoor 1)Scenario,工作频率为3.5GHz。有两条街和一个十字路口的户外场景18个基站和超过一百万个用户18个基站(BSs):BS1-BS18.每个基站的高度是8米每个基站的天线阵列是isotropic天线三个统一的x-y用户网格用户的总计数量为:1184923每个用户网格中的第一个用户总是(x,y)坐标最低的用户 所有用户的高度是2m每个用户的每个天线阵列是isotropic天线定义射频追踪场景。

bingbingaidaima的博客 5599

直播系统中iOS 采集音视频及写入文件

直播系统中iOS 采集音视频及写入文件 音视频采集包括两部分:视频采集和音频采集。在iOS中可以同步采集视频与音频,通过系统框架AVFoundation,可以帮助我们采集音频与视频,对于视频还可以进行切换前后摄像头,最终我们将录制好的视频写入沙盒中 音视频数据的采集与展示 一、初始化视频的输入与输出 // 懒加载一个session,所有的操作都需要session来执行 fileprivate lazy var session: AVCaptureSession = AVC...

云豹直播源码 576

腾讯会议视频过期了怎么办?亲测可用:用这个免费插件抢救你的会议录制与回放

本文提供了三种亲测有效的腾讯会议视频过期恢复方案,包括浏览器缓存提取、专业工具组合及预防性措施。特别推荐使用免费插件抢救过期会议录制与回放,帮助职场人解决重要视频资料丢失的难题。

weixin_33686714的博客 264

Windows Server上OpenVPN 2.4.8双因子认证实战:账号密码+证书,附一键脚本

本文详细介绍了在Windows Server上部署OpenVPN 2.4.8双因子认证(账号密码+证书)的实战方案,包括架构设计、证书体系规划、环境准备、服务器端配置及客户端自动化部署。通过一键脚本和优化配置,提升企业VPN的安全性和运维效率,特别适合金融、医疗等对安全性要求高的行业。

weixin_29231221的博客 461

5分钟快速上手iOS音视频通话:WebRTC-iOS完整实战指南

想要在iOS应用中快速实现P2P音视频通话功能吗?WebRTC-iOS是一个基于Swift开发的原生WebRTC演示应用,专为iOS开发者设计,帮助你在最短时间内掌握实时通信技术。本指南将带你从零开始,5分钟内搭建完整的音视频通话应用,无论你是WebRTC新手还是有经验的开发者,都能轻松上手。 ## 📱 项目概述与价值主张 WebRTC-iOS是一个简洁高效的iOS原生WebRTC演示项目,

gitblog_00905的博客 905

安卓风控对抗实战:如何用AOSP定制ROM绕过Momo、AIDA64等检测(从环境搭建到设备画像)

本文详细解析了如何通过定制AOSP ROM绕过Momo、AIDA64等安卓风控检测工具的设备指纹识别。从环境搭建到硬件参数修改,再到内核级特征混淆,提供了一套完整的底层对抗方案,显著提升设备伪装通过率。

weixin_30687051的博客 488

【Swift相机开发从入门到精通】:掌握iOS图像采集核心技术的10个关键步骤

掌握Swift相机开发核心技术,快速实现iOS图像采集与处理。涵盖AVFoundation框架使用、实时预览、拍照录像、权限配置等10个关键步骤,适用于社交、扫码等场景。详解委托回调与性能优化技巧,值得收藏。

PixelStream的博客 684

避开这5个坑!STC8H DMA串口通信的实战避坑指南(115200波特率实测)

本文深入解析了STC8H单片机利用DMA实现稳定全双工串口通信的实战要点。针对115200高波特率场景,详细拆解了DMA-UART架构、关键寄存器配置、时钟精度计算、缓冲区管理及中断协同等核心环节,并提供了具体的避坑指南和调试方法,帮助开发者构建高效可靠的通信链路。

melon的博客 674

FortiWeb 相对路径遍历漏洞复现(CVE-2025-64446)

FortiWeb是Fortinet公司推出的企业级Web应用防火墙(WAF),专为保护Web应用和API抵御高级威胁设计。它集成人工智能与机器学习技术,通过双层检测引擎(HMM模型与SVM向量机)精准识别异常流量,可防御OWASP Top 10攻击、SQL 注入、XSS、DDoS及恶意机器人。其核心功能包括API自动化保护、虚拟补丁集成(兼容Acunetix等第三方扫描工具)及智能流量分析,支持HTTP/2、WebSocket等现代协议。(CVE-2025-64446)

iSee857的博客 466

转载: iOS音视频实时采集硬件编码

原文地址:https://blog.youkuaiyun.com/u011518723/article/details/49248467 我的demo地址:https://github.com/weiman152/LiveRecordDemo。 其中的swift版的viewcontroller是视频采集部分,供参考。 O...

weixin_34319374的博客 333

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WebRTC 实现P2P音视频通话——原生IOS端使用WebRTC实现一对一音视频通话

WebRTC 实现P2P音视频通话——原生IOS端使用WebRTC实现一对一音视频通话

FF_lz的博客 3265

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

音视频小白系统入门笔记-1

本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅。

T_T233333333的博客 858

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

iOS直播(一)AVFoundation音视频采集

一、要实现从摄像头和麦克风获取视频和音频,需要使用苹果提供的AVFoundation框架,下面是需要用到的类的说明: 1.AVCaptureSession AV Foundation捕捉栈的核心类是AVCaptureSession。一个AVCaptureSession相当于一个虚拟的“插线板”,用以连接输入和输出的资源。 2.AVCaptureDevice AVCaptureDev...

dolacmeng的专栏 6393

iOS音频采集与播放难题全解析,Swift开发者必备避坑手册

解决iOS音频采集与播放常见难题,全面掌握Swift音频处理核心技巧。涵盖实时录音、音频格式转换、后台播放等场景,深入解析AVFoundation框架使用要点,提升应用稳定性与用户体验,Swift开发者必备避坑指南,值得收藏。

ByteGlow的博客 950
上一篇: swift3.0 传值总结(属性、代理、闭包、通知)
下一篇: iOS GPUImage图像处理
glt_code
博客等级 码龄10年 40粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值