回顧
GPUImage的基礎(chǔ)在詳細(xì)解析1~4司浪。
這次的介紹是錄制視頻微饥,添加濾鏡遂庄,保存到手機(jī)。
核心思路
通過(guò)GPUImageVideoCamera采集視頻和音頻的信息塔拳,音頻信息直接發(fā)送給GPUImageMovieWriter鼠证;視頻信息傳入響應(yīng)鏈作為源頭,渲染后的視頻信息再寫入GPUImageMovieWriter蝙斜,同時(shí)通過(guò)GPUImageView顯示在屏幕上名惩。
具體細(xì)節(jié)
1、AV類
AVCaptureSession *_captureSession; 協(xié)調(diào)AV輸入設(shè)備到AVoutput的數(shù)據(jù)流
AVCaptureDevice *_inputCamera; 攝像頭設(shè)備
AVCaptureDevice *_microphone; 麥克風(fēng)設(shè)備
AVCaptureDeviceInput *videoInput; 攝像頭輸入
AVCaptureVideoDataOutput *videoOutput; 攝像頭輸出
AVCaptureDeviceInput *audioInput; 麥克風(fēng)輸入
AVCaptureAudioDataOutput *audioOutput; 麥克風(fēng)輸出
AVAssetWriter *assetWriter; 把多媒體數(shù)據(jù)寫入文件的類
AVAssetWriterInput *assetWriterAudioInput; 音頻輸入
AVAssetWriterInput *assetWriterVideoInput; 視頻輸入
AVAssetWriterInputPixelBufferAdaptor sh*assetWriterPixelBufferInput; 視頻輸入適配器
2孕荠、流程圖
3、流程解析
1攻谁、找到物理設(shè)備攝像頭_inputCamera稚伍、麥克風(fēng)_microphone,創(chuàng)建攝像頭輸入videoInput和麥克風(fēng)輸入audioInput戚宦;
2个曙、設(shè)置videoInput和audioInput為_(kāi)captureSession的輸入,同時(shí)設(shè)置videoOutput和audioOutput為_(kāi)captureSession的輸出,并且設(shè)置videoOutput和audioOutput的輸出delegate垦搬;
3呼寸、_captureSession調(diào)用startRunning,開(kāi)始捕獲信號(hào)猴贰;
4对雪、音頻數(shù)據(jù)到達(dá),把數(shù)據(jù)轉(zhuǎn)發(fā)給之前設(shè)置的audioEncodingTarget米绕,并通過(guò)調(diào)用assetWriterAudioInput的appendSampleBuffer方法寫入音頻數(shù)據(jù)瑟捣;
5、視頻數(shù)據(jù)到達(dá)栅干,視頻數(shù)據(jù)傳入響應(yīng)鏈迈套,經(jīng)過(guò)處理后通過(guò)assetWriterPixelBufferInput的appendSampleBuffer方法寫入視頻數(shù)據(jù);
6碱鳞、選擇保存后桑李,文件通過(guò)ALAssertLibrary寫入手機(jī)照片庫(kù)。
4窿给、demo
- 初始化
// 攝像頭
_videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
_videoCamera.outputImageOrientation = [UIApplication sharedApplication].statusBarOrientation;
// 濾鏡
_filter = [[GPUImageSepiaFilter alloc] init];
_filterView = [[GPUImageView alloc] initWithFrame:self.view.frame];
self.view = _filterView;
// 響應(yīng)鏈
[_videoCamera addTarget:_filter];
[_filter addTarget:_filterView];
[_videoCamera startCameraCapture];
- 開(kāi)始錄制
unlink([pathToMovie UTF8String]); // 如果已經(jīng)存在文件芙扎,AVAssetWriter會(huì)有異常,刪除舊文件
_movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];
_movieWriter.encodingLiveVideo = YES;
[_filter addTarget:_movieWriter];
_videoCamera.audioEncodingTarget = _movieWriter;
[_movieWriter startRecording];
- 結(jié)束錄制
[_filter removeTarget:_movieWriter];
_videoCamera.audioEncodingTarget = nil;
[_movieWriter finishRecording];
錄制后的視頻如下:
系統(tǒng)手機(jī)庫(kù)中的視頻:
思考
1填大、在流程圖的環(huán)節(jié)中戒洼,哪一步給視頻信息添加了濾鏡?
2允华、為何視頻的寫入類比音頻寫入類多了一個(gè)類圈浇?
總結(jié)
核心類是GPUImageMovieWriter,協(xié)調(diào)音頻和視頻信息的寫入靴寂。
- 思考題答案
1磷蜀、GPUImageVideoCamera把攝像頭采集的YUV視頻幀,轉(zhuǎn)換為RGB視頻幀百炬,同時(shí)作為響應(yīng)鏈的起始點(diǎn)褐隆;GPUImageMovieWriter實(shí)現(xiàn)了GPUImageInput協(xié)議,可作為響應(yīng)鏈的終點(diǎn)剖踊,接受濾鏡處理過(guò)的視頻信息庶弃。
2、AVAssetWriterInputPixelBufferAdaptor類提供了CVPixelBufferPool用來(lái)更快的分配緩存德澈。