1. 程式人生 > >LearningAVFoundation之拍攝+實時濾鏡+實時寫入

LearningAVFoundation之拍攝+實時濾鏡+實時寫入

前言

AVFoundation框架的功能十分強大,同時也充斥著各種類,比如各種session,各種input,各種output。之前並沒有對整個框架進行過完整梳理,雖然也能東拼西湊的那各種類完成需求,但遇到深度定製的需求以及踩到坑之後,總會比較吃力。最近,在看《learning AV Foundation》這本書,看完後嘗試著梳理了一個整體脈絡,並將理解的知識點整合用Swift重寫了一個demo,包括拍攝+實時濾鏡+實時寫入+自定義匯出解析度等。本篇為視訊拍攝部分,下一章會更新視訊的組合編輯及音訊混合部分。

整體脈絡

整體架構

可以看到,整個流程可以分為三部分,分別為資料採集、資料加工和資料儲存。

資料採集: 資料採集不僅限於本文場景中的通過攝像頭和麥克分裝置採集,還比如AVAssetReader從AVAsset例項中讀取。無論以什麼方式採集,這一階段的輸出都為CMSampleBuffer。值得一提的是,攝像頭採集的是yuv格式的壓縮的視訊訊號,在輸出時要還原成可以處理的數字訊號,這一配置在AVCaptureVideoDataOutput的videoSettings屬性中。

資料加工: 資料加工階段可以基於CMSampleBuffer進行各種處理,包括加濾鏡等,都在這個階段。sampleBuffer會包含一個CVPixelBuffer,它是一個帶有單個視訊幀原始畫素資料的Core Video物件,據此我們可以進行畫素級別的加工。

資料儲存: 資料儲存階段將加工後的媒體資源進行編碼並寫入到容器檔案中,比如mp4檔案或.mov檔案等。此處使用AVAssetWriter,它支援實時寫入。它期望接收到的資料也是CMSampleBuffer格式。同時我們也可以傳入其他資料,通過pixelBufferAdaptor適配成它所期望的資料。比如,本文的demo中傳入了CIImage,可以先將CIImage渲染成CVPixelBuffer,再進行寫入。

以上就是整體脈絡,本文的demo也是基於這個思路封裝的。CaptureManager負責資料採集,通過block回撥輸出CMSampleBuffer資料。VideoWriteManager負責資料儲存,接收CMSampleBuffer資料,通過block回撥生成的檔案路徑。CameraViewController作為兩者的排程方,並承擔資料加工工作以及將加工後的資料展示給使用者進行預覽。

裝置採集

通過裝置採集的核心類是AVCaptureSession,它的輸入是AVCaptureDeviceInput,輸出是AVCaptureOutput,管理從物理裝置中得到的資料流,並按照output的配置輸出指定的檔案或資料。AVCaptureOutput是一個抽象基類,如果定製化需求不高,可以直接使用AVCaptureMovieOut高階類來直接輸出檔案。但是如果需要進行底層的資料加工或自定義配置,就需要使用AVCaptureVideoDataout和AVCaptureAudioDataOutput來輸出CMSampleBuffer格式的原始資料。此外,為了不阻塞主執行緒,我們一般會為AVCaptureOutput分配專門的序列佇列。

資料加工-新增濾鏡

濾鏡大多使用GPUImage框架,但這不是本文的核心,因此,demo中僅使用了CoreImage框架來實現濾鏡效果。為了達到實時濾鏡的效果,需要在每一幀的回撥資料中,都對每一幀的影象資料都應用當前濾鏡的效果,從而使用者可以在拍攝過程中不斷切換各種濾鏡。

此處在學習《learning AV Foundation》書中的demo時,書中的demo是把原始資料分別傳給使用者預覽介面和寫入類,兩者各自處理。但我覺得這樣相當於同樣的加工處理了兩遍,從程式碼維護和效能上都不是很可取。因為,此處我是處理完後,把處理完的資料分別傳給預覽介面顯示和寫入類儲存。

資料儲存

AVAssetWriter通過多個(音訊、視訊等)AVAssetWriterInput物件配置。AVAssetWriterInput通過mediaType和outputSettings來初始化,我們可以在outputSettings中進行視訊位元率、視訊寬高、關鍵幀間隔等細緻的配置,這也是AVAssetWrite相比AVAssetExportSession明顯的優勢。AVAssetWriterInput在附加資料後會在最終輸出時生成一個獨立的AVAssetTrack.

此處用到了PixelBufferAdaptor來附加CVPixelBuffer型別的資料,它在附加CVPixelBuffer物件的視訊樣本時能提供最優效能。

以上就是AVFoundation Caputure部分的整體思路和脈絡,更多采坑細節如視訊旋轉問題等請參考Demo,內有詳細註釋。