AVFoundation - 捕捉會話: AVCaptureSession

AVCaptureSession是AVFoundation的核心類,用于捕捉視頻和音頻,協(xié)調(diào)視頻和音頻的輸入和輸出。下面是AVCaptureSession的流程圖


AVCaptureSession

AVCaptureSession常見操作

1. 設(shè)備輸入輸出相關(guān)

  • canAddInput:是否可以添加輸入設(shè)備,可用于判斷是否可以切換輸入設(shè)備,如前后攝像頭
  • addInput:添加輸入設(shè)備
  • removeInput:移除輸入設(shè)備
  • canAddOutput:是否可以添加輸出設(shè)備
  • addOutput:添加輸出設(shè)備
  • removeOutput:移除輸出設(shè)備

2. 運行狀態(tài)相關(guān)

  • startRunning: 開始運行
  • stopRunning: 停止運行
  • running: 會話是否正在運行
  • interrupted: 會話是否被中斷,比如電話或鬧鐘??梢酝ㄟ^Key-Value observer監(jiān)聽值的變化

3. 使用sessionPreset設(shè)置攝像頭采集的分辨率

  • canSetSessionPreset: 檢查是否支持指定分辨率
  • sessionPreset: 設(shè)置分辨率,默認(rèn)是AVCaptureSessionPresetHigh
    if ([self.captureSession canSetSessionPreset:AVCaptureSessionPresetHigh]) {
        self.captureSession.sessionPreset = AVCaptureSessionPresetHigh;
    }

如果想給一個正在運行的捕獲會話做一些改變,需要用beginConfiguration和commitConfiguration方法以確保設(shè)備作為一個群體在變化

    // 調(diào)用beginConfiguration之后,可以添加或者移除輸出
    //或改變sessionPreset屬性,或者單獨配置捕獲輸入或輸出屬性
    //在調(diào)用commitConfiguration之前實際上是沒有變化的,調(diào)用的時候它們才被應(yīng)用到一起。
    [self.captureSession beginConfiguration];
    if ([self.captureSession canSetSessionPreset:AVCaptureSessionPresetHigh]) {
        self.captureSession.sessionPreset = AVCaptureSessionPresetHigh;
    }
    [self.captureSession commitConfiguration];

常用的一些分辨率:

  • AVCaptureSessionPresetHigh
    適用于高質(zhì)量視頻和音頻輸出
  • AVCaptureSessionPresetMedium
    適用于中等質(zhì)量輸出,適合通過Wifi共享的輸出視頻和音頻
  • AVCaptureSessionPresetLow
    適用于低質(zhì)量輸出,適合通過3G共享的輸出視頻和音頻
  • AVCaptureSessionPreset320x240
    適用于320x240像素視頻輸出
  • AVCaptureSessionPreset352x288
    適用于CIF質(zhì)量(352x288像素)視頻輸出
  • AVCaptureSessionPreset640x480
    適用于VGA質(zhì)量(640x480像素)視頻輸出
  • AVCaptureSessionPreset960x540
    適用于四分之一高清(960x540像素)視頻輸出
  • AVCaptureSessionPreset1280x720
    適用于高清720p質(zhì)量(1280x720像素)視頻輸出
  • AVCaptureSessionPreset1920x1080
    適用于1080p質(zhì)量(1920x1080像素)視頻輸出
  • AVCaptureSessionPreset3840x2160
    適用于2160p質(zhì)量(3840x2160像素)視頻輸出,此質(zhì)量也被稱為UHD或4K。
  • AVCaptureSessionPresetiFrame960x540
    可實現(xiàn)帶有AAC音頻的960x540像素品質(zhì)的iFrame H.264視頻(約30 Mbits / 秒)。 以iFrame格式捕獲的QuickTime電影是編輯應(yīng)用程序的最佳選擇
  • AVCaptureSessionPresetiFrame1280x720
    使用AAC音頻以約40 Mbits / sec的速度實現(xiàn)1280x720像素品質(zhì)的iFrame H.264視頻。
  • AVCaptureSessionPresetInputPriority
    指定捕獲會話不控制音頻和視頻的輸出設(shè)置
  • AVCaptureSessionPresetPhoto
    指定適合高分辨率照片質(zhì)量的拍攝設(shè)置,不支持音視頻輸出

4. AVCaptureSession中斷處理

在音視頻錄制過程中可能因為電話、鬧鐘等導(dǎo)致中斷,開發(fā)過程中提供中斷結(jié)束后獲取中斷產(chǎn)生的原因

  • AVCaptureSessionInterruptionEndedNotification: 中斷通知
  • AVCaptureSessionInterruptionReasonKey: 從傳遞的userInfo通過關(guān)鍵key獲取原因

AVCaptureSessionInterruptionReason reason = [[notification.userInfo objectForKey:AVCaptureSessionInterruptionReasonKey] unsignedIntegerValue];

  • 具體的中斷原因
  1. AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableInBackground
    在后臺禁止使用相機。如果您嘗試在后臺運行攝像頭,則捕獲會話會發(fā)送帶有此中斷原因的
  2. AVCaptureSessionInterruptionReasonAudioDeviceInUseByAnotherClient
    由音頻硬件暫時不可用引起的中斷(例如電話或鬧鐘)
  3. AVCaptureSessionInterruptionReasonVideoDeviceInUseByAnotherClient
    視頻設(shè)備暫時不可用(例如,當(dāng)另一個捕獲會話使用時)導(dǎo)致的中斷
  4. AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableWithMultipleForegroundApps
    當(dāng)您的應(yīng)用程序在iPad上的“滑行”,“分割視圖”或“畫中畫”模式下運行時造成中斷。如果由于這個原因而中斷,則由于資源爭用和服務(wù)記錄質(zhì)量下降,您的當(dāng)前捕獲會話配置只能在您的應(yīng)用返回全屏顯示時運行
  5. AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableDueToSystemPressure
    由于系統(tǒng)壓力造成的中斷,例如熱脅迫
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容