開發(fā)視頻錄制功能最簡單的就是使用系統(tǒng)封裝的 UIImagePickerController,但是這種方式比較封閉,可自定義東西比較少,所以就需要基于 AVFoundation 框架來開發(fā)視頻錄制功能。基于 AVFoundation 框架來開發(fā),則需要自己手動設置設備音頻,視頻輸入、輸出。
AVCaptureSession 是 AVFoundation 的核心類,用于管理捕獲對象 AVCaptureInput 的視頻和音頻的輸入,協(xié)調捕獲的輸出 AVCaptureOutput。AVCaptureOutput 的輸出有兩種方法:一種是直接以 movieFileUrl 方式輸出;一種是以原始數(shù)據(jù)流 data 的方式輸出,流程對比圖如下:
下面詳細講解兩種錄制視頻的方案:
(1 )AVCaptureSession + AVCaptureMovieFileOutput
1. 創(chuàng)建 AVCaptureSession
注意:AVCaptureSession 的調用是會阻塞線程的,建議單獨開辟子線程處理。
2. 設置音頻、視頻輸入
3. 設置文件輸出源
4.添加視頻預覽層
5.開始采集
6.開始錄制
當實際的錄制開始或停止時,系統(tǒng)會有代理回調。當開始錄制之后,這時可能還沒有真正寫入,真正開始寫入會回調下面代理,停止錄制也是如此,所以如果你需要對錄制視頻起始點操作,建議通過系統(tǒng)的回調代理:
7.停止錄制
8.停止采集
(2 )AVCaptureSession + AVAssetWriter
1.創(chuàng)建 AVCaptureSession
2.設置音頻、視頻輸入
3.設置音頻 Data、視頻 Data 輸出
4.添加視頻預覽層
5.開始采集
和第一種方式不同,第一種方式是開始錄制之后,movieFileOutput 的回調才會觸發(fā),停止錄制回調觸發(fā)之后也就完成了。AVCaptureSession + AVAssetWriter 方式因為在設置輸出源的時候,把輸出代理 (setSampleBufferDelegate)已經(jīng)設置好了,所以一旦開始采集(startRunning),數(shù)據(jù)流回調也就觸發(fā)了。
6.開始錄制
這里需要創(chuàng)建AVAssetWriter,配置音頻、視頻錄制參數(shù),錄制寫入過程要單獨開辟線程處理,避免阻塞線程,可以和 AVCaptureSession 放在同一線程處理。
7.處理數(shù)據(jù)流
開始采集,數(shù)據(jù)流就會回調,所以這里用了變量 isRecording 來界定當前是否需要對數(shù)據(jù)處理,一般是在 startRecord 和 stopRecord 才會去處理數(shù)據(jù)流。
8.停止錄制
9.停止采集
兩種方案對比:
相同點:他們的數(shù)據(jù)采集都是通過 AVCaptureSession 處理,音頻視頻的輸入源也是一致的,畫面預覽一致。
不同點:輸出源不一樣,前者輸出是 fileUrl,也就是說在視頻寫入完成之前開發(fā)者無法操作處理;后者輸出是 data,AVAssetWriter 需要拿到 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 兩個單獨的輸出,然后分別處理再寫入指定路徑。輸出方式不同,決定了開發(fā)者對視頻處理剪裁壓縮的方式也就不同,前者如果需要對視頻剪裁壓縮,就需要從本地取出完整的視頻文件,再做處理;而 AVAssetWriter 拿到的是數(shù)據(jù)流 data,如果需要剪裁壓縮,可以直接配置相關參數(shù)后處理數(shù)據(jù)流,這樣寫入本地的就是已經(jīng)處理過的視頻文件。
其他功能點擴充
1.聚焦處理
2.攝像頭切換
申請創(chuàng)業(yè)報道,分享創(chuàng)業(yè)好點子。點擊此處,共同探討創(chuàng)業(yè)新機遇!