視頻采集

采集步驟

  • 導(dǎo)入框架
    • 相關(guān)API主要在AVFoundation框架中,因此需要先導(dǎo)入框架
  • 創(chuàng)建捕捉會(huì)話(AVCaptureSession)
    • 該會(huì)話用于連接之后的輸入源&輸出源
    • 輸入源:攝像頭&話筒
    • 輸出源:拿到對(duì)應(yīng)的音頻&視頻數(shù)據(jù)的出口
    • 會(huì)話:用于將輸入源&輸出源連接起來
//1.創(chuàng)建捕捉會(huì)話
        let session = AVCaptureSession.init()
  • 設(shè)置視頻輸入源&輸出源
    • 輸入源(AVCaptureDeviceInput):從攝像頭輸入
    • 輸出源(AVCaptureVideoDataOutput):可以設(shè)置代理,在代理方法中拿到數(shù)據(jù)
    • 將輸入&輸出添加到會(huì)話中
  //2.設(shè)置視頻輸入輸出
        //2.1 捕獲所有的設(shè)備(包括前置和后置攝像頭)
        let videoDevices = AVCaptureDevice.devices(for: .video)
        //2.2取出獲取后置攝像頭
        let backDevice = videoDevices.filter { (aVCaptureDevice) -> Bool in
            return (aVCaptureDevice.position == .back)
        }.first
        //2.3創(chuàng)建輸入設(shè)備
        do{
            let videoInput = try AVCaptureDeviceInput.init(device: backDevice!)
            //添加輸入源
            if session.canAddInput(videoInput) {
                session.addInput(videoInput)
            }
        }catch{
            
        }
        //3 創(chuàng)建視頻輸出源
        //3.1 創(chuàng)建視頻輸出源
        let videoOutput = AVCaptureVideoDataOutput.init()
        //3.2 設(shè)置代理
        videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue.global())
        //3.3 添加輸出源
        if session.canAddOutput(videoOutput) {
            session.addOutput(videoOutput)
        }
        //3.4 創(chuàng)建連接
        videoConnectiono = videoOutput.connection(with: .video)
        
        //4 設(shè)置音頻輸入輸出
        //4.1 創(chuàng)建音頻輸入
        let audioDevices = AVCaptureDevice.devices(for: .audio).first
        do{
            let audioInput = try AVCaptureDeviceInput.init(device: audioDevices!)
            //添加到會(huì)話中
            if session.canAddInput(audioInput) {
                session.addInput(audioInput)
            }
            
        }catch{}
        //4.2創(chuàng)建音頻輸出
        let audioOutput = AVCaptureVideoDataOutput.init()
        audioOutput.setSampleBufferDelegate(self, queue: DispatchQueue.global())
        //4.3 添加到會(huì)話中
        if session.canAddOutput(audioOutput) {
            session.addOutput(audioOutput)
        }
        
        //4.4 創(chuàng)建連接
        audioConnectiono = videoOutput.connection(with: .audio)
  • 添加預(yù)覽圖層
    • 如果希望用戶看到采集的畫面,可以添加預(yù)覽圖層
    • 該預(yù)覽圖層不是必須的,及時(shí)沒有添加也可以正常采集數(shù)據(jù)
//5 添加預(yù)覽圖層
        //5.1 創(chuàng)建預(yù)覽圖層
        let previewLayer = AVCaptureVideoPreviewLayer.init(session: session)
        //5.2 設(shè)置圖層屬性
        previewLayer.frame = view.bounds
        //5.3 將圖層添加到view中
        view.layer.insertSublayer(previewLayer, at: 0)
  • 開始采集
  • 調(diào)用會(huì)話(AVCaptureSession)的startRunning方法即可開始采集
//6 開始采集
        session.startRunning()
  • 遵守協(xié)議,實(shí)現(xiàn)代理方法
extension ViewController:AVCaptureVideoDataOutputSampleBufferDelegate{
    
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        
        if connection == videoConnectiono{
            print("視頻數(shù)據(jù)")
        }else{
            print("音頻數(shù)據(jù)")
        }
        
    }
    
}

停止掃描

  • 比如用戶不再直接,我們需要停止掃描
    • 移除預(yù)覽圖層(不再直播肯定不需要預(yù)覽圖層了)
    • 停止掃描(調(diào)用session的stopRunning方法)
    • 將session設(shè)置為nil(對(duì)象不再使用,指針置空)
// 1.移除圖層
        previewLayer?.removeFromSuperlayer()
        
        // 2.停止掃描
        session?.stopRunning()
        
        // 3.將對(duì)象重置為nil
        session = nil
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 概述 音視頻采集是直播架構(gòu)的第一環(huán),是視頻的來源其實(shí)視頻的采集有多個(gè)應(yīng)用場(chǎng)景:比如二維碼開發(fā) 音視頻采集包括兩部分...
    黃曉堅(jiān)閱讀 556評(píng)論 1 0
  • 概述 音視頻采集是直播架構(gòu)的第一環(huán),是視頻的來源其實(shí)視頻的采集有多個(gè)應(yīng)用場(chǎng)景:比如二維碼開發(fā) 音視頻采集包括兩部分...
    AnnieAri閱讀 3,742評(píng)論 6 6
  • 概述 音視頻采集是直播架構(gòu)的第一步 音視頻采集包括兩部分視頻采集音頻采集 iOS 開發(fā)中,同音視頻采集相關(guān) API...
    哎呀我Qu閱讀 3,197評(píng)論 0 4
  • 代碼下載 直播喵播MGMiaoBo下載 一、視頻的開始采集和停止采集 開始采集步驟:1.創(chuàng)建捕捉會(huì)話 3.繪制捕捉...
    Mg明明就是你閱讀 510評(píng)論 0 4
  • 河南省鄭州市金水區(qū)優(yōu)勝小學(xué) 一年級(jí)一班【班班有讀】 第三十七天,《流星沒有耳朵》第十天 “腹有詩書氣自華,唯有書香...
    三一班班有讀閱讀 560評(píng)論 0 0