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

游戏陪玩平台系统音视频数据的采集与展示
一、初始化视频的输入与输出

// 懒加载一个session,所有的操作都需要session来执行
fileprivate lazy var session: AVCaptureSession = AVCaptureSession()
// 保存视频输出
fileprivate var videoOutput: AVCaptureVideoDataOutput?
// 保存视频输入
fileprivate var videoInput: AVCaptureDeviceInput?
// 保存预览图层
fileprivate var previewLayer: AVCaptureVideoPreviewLayer?

设置视频输入源与输出源

// 设置视频输入源
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

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

// 设置音频的输入源
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中,但是每次添加之前需要先判断是否可以添加

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

二、实现游戏陪玩平台系统音视频的采集代理
音视频虽然需要遵守的代理名称不一样,但是需要实现的方法是一致的,所以要拿到音频或者视频就得先进行判断,需要用到AVCaptureOutput的这个方法

// 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!
extension ViewController: AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate {func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {if videoOutput?.connection(withMediaType: AVMediaTypeVideo) == connection {print("视频数据")} else {print("音频数据")}}
}

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

// 创建预览图层
guard let previewLayer = AVCaptureVideoPreviewLayer(session: session) else {return}
previewLayer.frame = view.bounds// 将图层添加到控制器的view的layer中
view.layer.insertSublayer(previewLayer, at: 0)
self.previewLayer = previewLayer

现在基本功能都有了,如果想要游戏陪玩平台系统开始采集音视频只需要调用

// 开始录制
session.startRunning()
// 结束录制
session.stopRunning()

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

// 1.取出之前镜头的方向
guard let videoInput = videoInput else { return }
let position: AVCaptureDevicePosition = videoInput.device.position == .front ? .back : .frontguard 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

录制视频写入文件

fileprivate var movieOutput: AVCaptureMovieFileOutput?

在游戏陪玩平台系统开始采集音视频的时候就要开始写入文件

// 开始写入文件 // 1、创建写入文件的输出
let fileOutput = AVCaptureMovieFileOutput()
self.movieOutput = fileOutput // 保存起来,用于停止写入文件// 设置类型,不然报错(这两句很重要)
let connection = fileOutput.connection(withMediaType: AVMediaTypeVideo)
connection?.automaticallyAdjustsVideoMirroring = trueif 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)

在游戏陪玩平台系统停止采集音视频的时候停止写入文件

// 停止写入文件
movieOutput?.stopRecording()

以上就是“游戏陪玩平台系统中iOS 采集音视频及写入文件的实现”的全部内容了,过程虽然复杂,但是实现起来还是比较简单的,希望对大家有帮助。

游戏陪玩平台系统中iOS 采集音视频及写入文件的实现相关推荐

  1. iOS 采集音视频及写入文件

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

  2. 在开发游戏陪玩平台系统时,如何实现新订单提示效果?

    在游戏陪玩平台系统中,用户通过实名认证审核.资质技能审核后,可以申请成为平台大神,带其他玩家组队开黑并获得收益.在游戏陪玩平台系统的整个约单流程中,新订单提示是很重要的模块,尤其是对于需要接单的大神而 ...

  3. 开发游戏陪玩平台系统,如何实现分布式存储?

    分布式数据服务为游戏陪玩平台系统提供不同设备间数据库数据分布式的能力.通过调用分布式数据接口,游戏陪玩平台系统将数据保存到分布式数据库中.通过结合帐号.应用和数据库三元组,分布式数据服务对属于不同游戏 ...

  4. 降低游戏陪玩平台系统前端开发复杂度的方式详解

    优秀的程序员总是能优雅的组织自己的代码,编写思路清晰,组织结构划分合理,从小的功能组件,到大的模块结构,都能通过合理巧妙的搭配,化复杂为简单,并且提升游戏陪玩平台系统运行效率,提高游戏陪玩平台系统代码 ...

  5. 游戏陪玩平台系统启动页黑屏情况,该如何解决?

    在正常情况下,当游戏陪玩平台系统启动时,界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入游戏陪玩平台系统主页.那么这个黑屏或者白屏到底是怎么一回事呢?应该如何解决呢?今天我们认真的讨 ...

  6. 游戏陪玩平台源码开发中阿里云云存储OSS功能介绍

    游戏陪玩平台源码开发中阿里云阿里云文件存储(Network Attached Storage,简称 NAS)是面向阿里云 ECS 实例.HPC 和 Docker 等计算节点的文件存储服务. 1.游戏陪 ...

  7. 游戏陪玩平台源码开发,语音通话中的噪音消除处理

    如果用户在游戏陪玩平台源码使用语音通话的过程中,出现大量噪音将会对用户的体验造成不良的影响,所以在开发时,要将噪音消除掉,具体的处理代码将在下方展现: // 初始化 降噪 Java_com_audio ...

  8. 如何实现游戏陪玩平台源码中聊天室内的礼物连击效果?

    为了增加观众与主播以及连麦用户的互动,在游戏陪玩平台源码开发时,专门设置了礼物打赏功能,该功能的主要使用场景就是游戏陪玩平台源码开发的多人语音聊天室内. 由于观众数量比较多,所以在赠送礼物时,会出现礼 ...

  9. 游戏陪玩平台源码开发,锁屏状态下消息提醒的实现

    当游戏陪玩平台源码在后台运行时,如果用户关闭了手机屏幕(手机进入灭屏休眠状态),这个时候有消息进来怎么办?这就需要在游戏陪玩平台源码开发时实现手机锁屏状态下消息提醒功能. 解决思路: 1.游戏陪玩平台 ...

最新文章

  1. 技术大佬们都推荐的vim学习指南来了,值得收藏!
  2. js 数组 实现 完全树_JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧
  3. winform(MDI窗体容器、权限设置)
  4. 中国固废处理行业十四五建议规划与前景深度研究报告2022-2028年
  5. python 将布尔数组取反的方法 True False(b=(a==False))
  6. Linux复位usb hub,Linux USB subsystem --- USB Hub initialize
  7. 5G iPhone,再等一年,有三款!
  8. 【育儿日记2】兔子不要上幼儿园
  9. java mysql教程基于_基于JAVA和MYSQL数据库实现的学生信息管理系统
  10. glide源码中包含了那种设计模式_Glide源码解读(一)
  11. 纸壳CMS替换默认实现
  12. Linux之ubuntu离线安装软件包
  13. 鹦鹉用 Echo 购物成功?浙大“海豚攻击”不服
  14. KVM 核心技术详解
  15. 小案例--封装jsonp
  16. win10+Eclipse简单快速安装(以及中文汉化与安装插件)
  17. 树状数组两种基本的模式
  18. 人工智能未来将呈现四大趋势
  19. java计算机毕业设计火车订票管理系统源码+mysql数据库+系统+lw文档+部署
  20. Java项目:基于java+ssm服装商城平台(计算机毕业设计)

热门文章

  1. 帮我制定周一到周五的食谱,其中热量不超过1700大卡
  2. 数据与广告系列十二:接上一篇,见习算法工程师教程
  3. 方舟生存进化图鉴隐私条款
  4. 领导离职,我是否应该跟领导一起走
  5. 一个不算凄美的爱情故事,和电子邮箱有,道出了很多职场中的缘分!
  6. EXCEL取当前SHEET页是第几个SHEET页
  7. 2022年回顾 | 被磨砺,被厚待
  8. SDUT 2400 高中数学?
  9. python使用循环嵌套金字塔_流程控制主while,for,python画金字塔,画9*9乘法表
  10. JSONPath浅析