iOS培训-斗鱼直播APP之采集视频
五年级 记叙文 3856字 621人浏览 金牛座怪怪

玩转【斗鱼直播APP 】系列之采集视频

作者:小码哥教育

概述

音视频采集是直播架构的第一环,是视频的来源

其实视频的采集有多个应用场景:比如二维码开发

音视频采集包括两部分:

视频采集

音频采集

在iOS 开发中,是可以同步采集视频&音频的,使用方式也非常简单

相关的采集API 都封装在AVFoundation 框架中,导入对应框架,实现功能即可 采集步骤

采集步骤文字描述

PS :如果做过二维码开发,应该对相关步骤非常熟悉(非常类似)

导入框架

相关API 主要在AVFoundation 框架中,因此需要先导入框架

创建捕捉会话(AVCaptureSession )

该会话用于连接之后的输入源&输出源

输入源:摄像头&话筒

输出源:拿到对应的音频&视频数据的出口

会话:用于将输入源&输出源连接起来

设置视频输入源&输出源

输入源(AVCaptureDeviceInput ):从摄像头输入

输出源(AVCaptureVideoDataOutput ):可以设置代理,在代理方法中拿到数据 将输入&输出添加到会话中

设置音频输入源&输出源

输入源(AVCaptureDeviceInput ):从话筒输入

输出源(AVCaptureAudioDataOutput ):可以设置代理,在代理方法中拿到数据 将输入&输出添加到会话中

添加预览图层(可选)

如果希望用户看到采集的画面,可以添加预览图层

该预览图层不是必须的,及时没有添加也可以正常采集数据

开始采集即可

调用会话(AVCaptureSession )的startRunning 方法即可开始采集

代码解析

整体代码步骤

函数一(设置视频输入输出)

函数二(设置音频输入输出)

添加预览图层

遵守协议,实现代理方法

实现代码

整体步骤代码 1.

// 1.创建捕捉会话 2.

let session =AVCaptureSession () 3.

4.

// 2.设置视频输入输出 5.

setupVideoSource(session : session) 6.

7.

// 3.设置音频输入输出 8.

setupAudioSource(session : session) 9.

10.

// 4.添加预览图层 11.

setupPreviewLayer(session :

session)

12.

13.

// 5.开始扫描 14. session. startRunning () 函数一(设置视频输入输出) 1. // 给会话设置视频源(输入源&输出源)

2.

fileprivate func setupVideoSource(session :AVCaptureSession ){ 3.

// 1.创建输入 4.

// 1.1.获取所有的设备(包括前置&后置摄像头) 5. guard let devices =AVCaptureDevice . devices (withMediaType :AVMediaTypeVideo ) as ?[AVCaptureDe vice ]else {return }

6.

7. // 1.2.取出获取前置摄像头

8. let d = devices. filter ({return $0. position ==.front }).first 9.

10. // 1.3.通过前置摄像头创建输入设备

11. guard let videoInput =try ? AVCaptureDeviceInput (device : d ) else {return }

12.

13. // 2.创建输出源

14. // 2.1.创建视频输出源

15. let videoOutput =AVCaptureVideoDataOutput ()

16.

17. // 2.2.设置代理, 以及代理方法的执行队列(在代理方法中拿到采集到的数据) 18. let queue =DispatchQueue . global ()

19. videoOutput. setSampleBufferDelegate (self , queue: queue) 20.

21. // 3.将输入&输出添加到会话中

22. // 3.1.添加输入源

23. if session. canAddInput (videoInput ){

24. session. addInput (videoInput )

25. }

26.

27. // 3.2.添加输出源

28. if session. canAddOutput (videoOutput ){

29. session. addOutput (videoOutput )

30. }

31.

32. // 4.给connect 赋值

33. videoConnect =

videoOutput . connection (withMediaType :AVMediaTypeVideo )

34.

} 函数二(设置音频输入输出)

1.

// 给会话设置音频源(输入源&输出源) 2.

fileprivate func setupAudioSource(session :AVCaptureSession ){ 3. // 1.创建输入

4. guard let device

=AVCaptureDevice . defaultDevice (withMediaType :AVMediaTypeAudio ) else {retu rn }

5. guard let audioInput =try ? AVCaptureDeviceInput (device : device ) else {return }

6.

7. // 2.创建输出源

8. let audioOutput =AVCaptureAudioDataOutput ()

9. let queue =DispatchQueue . global ()

10. audioOutput. setSampleBufferDelegate (self , queue: queue) 11.

12. // 3.将输入&输出添加到会话中

13. if session. canAddInput (audioInput ){

14. session. addInput (audioInput )

15. }

16. if session. canAddOutput (audioOutput ){

17. session. addOutput (audioOutput )

18. }

19.

} 添加预览图

1.

// 添加预览图层 2.

fileprivate func setupPreviewLayer(session :AVCaptureSession ){ 3.

// 1.创建预览图层 4. guard let previewLayer =AVCaptureVideoPreviewLayer (session :

session ) else {return }

5.

6. // 2.设置图层的属性

7. previewLayer. frame = view. bounds

8.

9. // 3.将图层添加到view 中

10. view. layer . insertSublayer (previewLayer , at:0)

11.

} 遵守协议,实现代理方法

1. extension

ViewController :AVCaptureVideoDataOutputSampleBufferDelegate , AVCaptureAu dioDataOutputSampleBufferDelegate {

2. func captureOutput(_ captureOutput:AVCaptureOutput !,

didOutputSampleBuffer sampleBuffer:CMSampleBuffer !, from

connection :AVCaptureConnection !){

3. if connection == videoConnect {

4. print (" 视频数据" )

5. }else {

6.

print (" 音频数据" ) 7.

} 8.

} 9. }

停止扫描

比如用户不再直接,我们需要停止扫描

移除预览图层(不再直播肯定不需要预览图层了) 停止扫描(调用session 的stopRunning 方法) 将session 设置为nil (对象不再使用,指针置空) 1.

@IBAction func stopScanning(){ 2.

// 1.移除图层 3.

previewLayer?. removeFromSuperlayer () 4.

5.

// 2.停止扫描 6.

session?. stopRunning () 7.

8.

// 3.将对象重置为nil 9.

session =nil 10.

}