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];
- 具體的中斷原因
- AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableInBackground
在后臺禁止使用相機。如果您嘗試在后臺運行攝像頭,則捕獲會話會發(fā)送帶有此中斷原因的 - AVCaptureSessionInterruptionReasonAudioDeviceInUseByAnotherClient
由音頻硬件暫時不可用引起的中斷(例如電話或鬧鐘) - AVCaptureSessionInterruptionReasonVideoDeviceInUseByAnotherClient
視頻設(shè)備暫時不可用(例如,當(dāng)另一個捕獲會話使用時)導(dǎo)致的中斷 - AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableWithMultipleForegroundApps
當(dāng)您的應(yīng)用程序在iPad上的“滑行”,“分割視圖”或“畫中畫”模式下運行時造成中斷。如果由于這個原因而中斷,則由于資源爭用和服務(wù)記錄質(zhì)量下降,您的當(dāng)前捕獲會話配置只能在您的應(yīng)用返回全屏顯示時運行 - AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableDueToSystemPressure
由于系統(tǒng)壓力造成的中斷,例如熱脅迫