下面詳細(xì)講解兩種錄制視頻的方案:

1AVCaptureSession + AVCaptureMovieFileOutput

1. 創(chuàng)建 AVCaptureSession

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

注意:AVCaptureSession 的調(diào)用是會(huì)阻塞線(xiàn)程的,建議單獨(dú)開(kāi)辟子線(xiàn)程處理。

2. 設(shè)置音頻、視頻輸入

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

3. 設(shè)置文件輸出源

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

4.添加視頻預(yù)覽層

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

5.開(kāi)始采集

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

6.開(kāi)始錄制

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

當(dāng)實(shí)際的錄制開(kāi)始或停止時(shí),系統(tǒng)會(huì)有代理回調(diào)。當(dāng)開(kāi)始錄制之后,這時(shí)可能還沒(méi)有真正寫(xiě)入,真正開(kāi)始寫(xiě)入會(huì)回調(diào)下面代理,停止錄制也是如此,所以如果你需要對(duì)錄制視頻起始點(diǎn)操作,建議通過(guò)系統(tǒng)的回調(diào)代理:

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

7.停止錄制

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

8.停止采集

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

2AVCaptureSession + AVAssetWriter

1.創(chuàng)建 AVCaptureSession

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

2.設(shè)置音頻、視頻輸入

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

3.設(shè)置音頻 Data、視頻 Data 輸出

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

4.添加視頻預(yù)覽層

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

5.開(kāi)始采集

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

和第一種方式不同,第一種方式是開(kāi)始錄制之后,movieFileOutput 的回調(diào)才會(huì)觸發(fā),停止錄制回調(diào)觸發(fā)之后也就完成了。AVCaptureSession + AVAssetWriter 方式因?yàn)樵谠O(shè)置輸出源的時(shí)候,把輸出代理 (setSampleBufferDelegate)已經(jīng)設(shè)置好了,所以一旦開(kāi)始采集(startRunning),數(shù)據(jù)流回調(diào)也就觸發(fā)了。

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

6.開(kāi)始錄制

這里需要?jiǎng)?chuàng)建AVAssetWriter,配置音頻、視頻錄制參數(shù),錄制寫(xiě)入過(guò)程要單獨(dú)開(kāi)辟線(xiàn)程處理,避免阻塞線(xiàn)程,可以和 AVCaptureSession 放在同一線(xiàn)程處理。

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

7.處理數(shù)據(jù)流

開(kāi)始采集,數(shù)據(jù)流就會(huì)回調(diào),所以這里用了變量 isRecording 來(lái)界定當(dāng)前是否需要對(duì)數(shù)據(jù)處理,一般是在 startRecord 和 stopRecord 才會(huì)去處理數(shù)據(jù)流。

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

8.停止錄制

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

9.停止采集

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

兩種方案對(duì)比:

相同點(diǎn):他們的數(shù)據(jù)采集都是通過(guò) AVCaptureSession 處理,音頻視頻的輸入源也是一致的,畫(huà)面預(yù)覽一致。

不同點(diǎn):輸出源不一樣,前者輸出是 fileUrl,也就是說(shuō)在視頻寫(xiě)入完成之前開(kāi)發(fā)者無(wú)法操作處理;后者輸出是 data,AVAssetWriter 需要拿到 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 兩個(gè)單獨(dú)的輸出,然后分別處理再寫(xiě)入指定路徑。輸出方式不同,決定了開(kāi)發(fā)者對(duì)視頻處理剪裁壓縮的方式也就不同,前者如果需要對(duì)視頻剪裁壓縮,就需要從本地取出完整的視頻文件,再做處理;而 AVAssetWriter 拿到的是數(shù)據(jù)流 data,如果需要剪裁壓縮,可以直接配置相關(guān)參數(shù)后處理數(shù)據(jù)流,這樣寫(xiě)入本地的就是已經(jīng)處理過(guò)的視頻文件。

其他功能點(diǎn)擴(kuò)充

1.聚焦處理

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析

2.攝像頭切換

【融云分析】基于 AVFoundation 框架開(kāi)發(fā)小視頻功能的方案解析
分享到

xiesc

相關(guān)推薦