項目中使用GPUImage做小視頻踩寇,需要接入人臉識別啄清,因此需要對AVCaptureVideoDataOutput的代理方法
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection;
中進行特殊的處理,查看GPUImage的源碼發(fā)現(xiàn)GPUImageVideoCamera這個類里面有一個方法俺孙,
- (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
這個方法即是在此代理中調(diào)用的辣卒,此方法已暴露給開發(fā)者。
因為項目中的GPUImage使用的是Framework的形式睛榄,故首先不考慮修改這個三方荣茫,因此采用了繼承的方法,重寫這個方法场靴,拿到了CMSampleBufferRef啡莉,但是處理的sdk使用時需要傳入圖像的RGB數(shù)據(jù),查資料旨剥,找到方法:
// 實現(xiàn)預覽效果不斷設置Image
CVImageBufferRef cvImageBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer);
// 轉(zhuǎn)換類型
CVPixelBufferRef cvPixelBufferRef = cvImageBufferRef;
// 如果想要對數(shù)據(jù)進行修改就必須對向前數(shù)據(jù)進行鎖定
CVPixelBufferLockBaseAddress(cvPixelBufferRef, kCVPixelBufferLock_ReadOnly);
// 處理圖像數(shù)據(jù)
// 圖像出來的原始數(shù)據(jù)是 R G R A 每個像素 4 個字節(jié) 32 位的數(shù)據(jù)
// 獲取寬高
size_t width = CVPixelBufferGetWidth(cvPixelBufferRef);
size_t height = CVPixelBufferGetHeight(cvPixelBufferRef);
// 獲取指向數(shù)據(jù)內(nèi)容的指針
unsigned char *pImageData = (unsigned char *)CVPixelBufferGetBaseAddress(cvPixelBufferRef);
這個PImageData就包含了RGB數(shù)據(jù)咧欣,但是調(diào)試的數(shù)據(jù)卻不是,后閱讀GPUImage源碼發(fā)現(xiàn)了問題轨帜,
屏幕快照 2017-07-05 下午9.26.29.png
[videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
需要設置videoOutPut的輸出方式魄咕。之后還需要修改GPUImageVideoCamera
的captureAsYUV屬性為NO,然后發(fā)現(xiàn)可以正常錄制視頻了蚌父,不過因為使用GPUImage默認是YUV哮兰,轉(zhuǎn)成RGB會有點小bug,可自行修改即可苟弛。
鏈接GPUImage源碼地址:https://github.com/BradLarson/GPUImage