视频采集

采集步骤

  • 导入框架
    • 相关API主要在AVFoundation框架中,因此需要先导入框架
  • 创建捕捉会话(AVCaptureSession)
    • 该会话用于连接之后的输入源&输出源
    • 输入源:摄像头&话筒
    • 输出源:拿到对应的音频&视频数据的出口
    • 会话:用于将输入源&输出源连接起来
//1.创建捕捉会话
        let session = AVCaptureSession.init()
  • 设置视频输入源&输出源
    • 输入源(AVCaptureDeviceInput):从摄像头输入
    • 输出源(AVCaptureVideoDataOutput):可以设置代理,在代理方法中拿到数据
    • 将输入&输出添加到会话中
  //2.设置视频输入输出
        //2.1 捕获所有的设备(包括前置和后置摄像头)
        let videoDevices = AVCaptureDevice.devices(for: .video)
        //2.2取出获取后置摄像头
        let backDevice = videoDevices.filter { (aVCaptureDevice) -> Bool in
            return (aVCaptureDevice.position == .back)
        }.first
        //2.3创建输入设备
        do{
            let videoInput = try AVCaptureDeviceInput.init(device: backDevice!)
            //添加输入源
            if session.canAddInput(videoInput) {
                session.addInput(videoInput)
            }
        }catch{
            
        }
        //3 创建视频输出源
        //3.1 创建视频输出源
        let videoOutput = AVCaptureVideoDataOutput.init()
        //3.2 设置代理
        videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue.global())
        //3.3 添加输出源
        if session.canAddOutput(videoOutput) {
            session.addOutput(videoOutput)
        }
        //3.4 创建连接
        videoConnectiono = videoOutput.connection(with: .video)
        
        //4 设置音频输入输出
        //4.1 创建音频输入
        let audioDevices = AVCaptureDevice.devices(for: .audio).first
        do{
            let audioInput = try AVCaptureDeviceInput.init(device: audioDevices!)
            //添加到会话中
            if session.canAddInput(audioInput) {
                session.addInput(audioInput)
            }
            
        }catch{}
        //4.2创建音频输出
        let audioOutput = AVCaptureVideoDataOutput.init()
        audioOutput.setSampleBufferDelegate(self, queue: DispatchQueue.global())
        //4.3 添加到会话中
        if session.canAddOutput(audioOutput) {
            session.addOutput(audioOutput)
        }
        
        //4.4 创建连接
        audioConnectiono = videoOutput.connection(with: .audio)
  • 添加预览图层
    • 如果希望用户看到采集的画面,可以添加预览图层
    • 该预览图层不是必须的,及时没有添加也可以正常采集数据
//5 添加预览图层
        //5.1 创建预览图层
        let previewLayer = AVCaptureVideoPreviewLayer.init(session: session)
        //5.2 设置图层属性
        previewLayer.frame = view.bounds
        //5.3 将图层添加到view中
        view.layer.insertSublayer(previewLayer, at: 0)
  • 开始采集
  • 调用会话(AVCaptureSession)的startRunning方法即可开始采集
//6 开始采集
        session.startRunning()
  • 遵守协议,实现代理方法
extension ViewController:AVCaptureVideoDataOutputSampleBufferDelegate{
    
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        
        if connection == videoConnectiono{
            print("视频数据")
        }else{
            print("音频数据")
        }
        
    }
    
}

停止扫描

  • 比如用户不再直接,我们需要停止扫描
    • 移除预览图层(不再直播肯定不需要预览图层了)
    • 停止扫描(调用session的stopRunning方法)
    • 将session设置为nil(对象不再使用,指针置空)
// 1.移除图层
        previewLayer?.removeFromSuperlayer()
        
        // 2.停止扫描
        session?.stopRunning()
        
        // 3.将对象重置为nil
        session = nil
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述 音视频采集是直播架构的第一环,是视频的来源其实视频的采集有多个应用场景:比如二维码开发 音视频采集包括两部分...
    黄晓坚阅读 3,550评论 1 0
  • 概述 音视频采集是直播架构的第一环,是视频的来源其实视频的采集有多个应用场景:比如二维码开发 音视频采集包括两部分...
    AnnieAri阅读 9,120评论 6 6
  • 概述 音视频采集是直播架构的第一步 音视频采集包括两部分视频采集音频采集 iOS 开发中,同音视频采集相关 API...
    哎呀我Qu阅读 8,393评论 0 4
  • 代码下载 直播喵播MGMiaoBo下载 一、视频的开始采集和停止采集 开始采集步骤:1.创建捕捉会话 3.绘制捕捉...
    Mg明明就是你阅读 3,382评论 0 4
  • 河南省郑州市金水区优胜小学 一年级一班【班班有读】 第三十七天,《流星没有耳朵》第十天 “腹有诗书气自华,唯有书香...
    三一班班有读阅读 3,652评论 0 0

友情链接更多精彩内容