在iOS音視頻開發(fā)中,經(jīng)常會看到 CVPixelBufferRef 這個數(shù)據(jù)結(jié)構(gòu),和 ffmpeg 中的 AVFrame 類似,里面保存著原始的圖像數(shù)據(jù)。

站在用戶的角度思考問題,與客戶深入溝通,找到江華網(wǎng)站設(shè)計與江華網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設(shè)計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬主機、企業(yè)郵箱。業(yè)務(wù)覆蓋江華地區(qū)。
我們發(fā)現(xiàn),在有些場景中將 CVPixelBufferRef 送入濾鏡sdk處理后,并不需要返回sdk處理后 CVPixelBufferRef ,就能實現(xiàn)濾鏡效果顯示的改變,如下圖場景。
1.濾鏡sdk處理 CVPixelBufferRef 的操作為同步操作。
2.濾鏡sdk外部和內(nèi)部的 CVPixelBufferRef 共享同一塊內(nèi)存。
1.使用 CVPixelBufferRef 創(chuàng)建紋理對象的兩種方法:
CoreVideo 框架的方法:使用此方法可以創(chuàng)建 CVOpenGLESTextureRef 紋理,并通過 CVOpenGLESTextureGetName(texture) 獲取紋理id。
OpenGL 的方法:
創(chuàng)建紋理對象,使用 glTexImage2D 方法上傳 CVPixelBufferRef 中圖像數(shù)據(jù)data到紋理對象中。
2.demo中使用 GPUImageRawDataInput 作為濾鏡鏈起點,輸入 CVPixelBufferRef 的圖像數(shù)據(jù),使用 GPUImageTextureOutput 作為濾鏡鏈終點,輸出濾鏡處理后的紋理id。
3.使用原始 CVPixelBufferRef 創(chuàng)建紋理,將此紋理作為附件掛載到 frame buffer object 的紋理附件上。繪制濾鏡處理后的紋理到幀緩沖對象中。
激活并綁定濾鏡紋理,上傳頂點坐標(biāo),紋理坐標(biāo)到頂點著色器,開始繪制:
了解了 CVPiexlBufferRef 以上特性后,在短視頻sdk架構(gòu)中,就可以設(shè)計出模塊化,可插拔的濾鏡組件。在視頻采集,編輯,轉(zhuǎn)碼等場景中均可快速集成。
demo中也提供了兩個簡單的場景:
1.視頻采集過程中添加濾鏡:從 GPUImageVideoCamera 的代理方法中取出 CVPixelBufferRef 進行濾鏡處理。
2.視頻播放過程中添加濾鏡:在 AVPlayer 播放時,從實現(xiàn)了 AVVideoCompositing 協(xié)議的方法中取出 CVPixelBufferRef 進行濾鏡處理。
Github:Demo地址
歡迎留言或私信探討問題及Star,謝謝~
參考文章:
在 iOS 中給視頻添加濾鏡
深入理解 CVPixelBufferRef
學(xué)了OpenGL,OpenGLES后,去閱讀了GPUImage的源碼,使用了一段時間,接下來,記錄一下我對GPUImage使用和源碼閱讀的一些分析吧。
相關(guān)引用
從0打造一個GPUImage(6)-GPUImage的多濾鏡處理邏輯
對于GPUImage,可以分為
上面也提了,所謂的GPUImage濾鏡鏈就是
GPUImageOutput - filter - filter - GPUImageInput
GPUImageOutput 通過target數(shù)組(里面都是實現(xiàn) GPUImageInput 組件),組成了濾鏡鏈的關(guān)系,我們需要牢牢的記住這個濾鏡鏈的關(guān)系,這樣開發(fā)的時候,我們就知道如何Debug,如何實現(xiàn)我們需要的效果。那么問題來了,為什么GPUImage可以實現(xiàn)這樣的濾鏡鏈呢?
這里我們先拋開GPUImage,用OpenGL ES去實現(xiàn)一個具有濾鏡疊加效果的Demo,這里的Demo我是參考葉孤城的這篇文章, 從0打造一個GPUImage(6)-GPUImage的多濾鏡處理邏輯
Demo需要實現(xiàn)的效果,是將一張圖片,先后通過疊加 亮度濾鏡 , 飽和度濾鏡 最后顯示在屏幕上。
那么對應(yīng)的OpenGLES,我們會怎么做呢?首先我們需要以下東西
從以上的步驟,我們可以總結(jié)以下結(jié)論
對于這個Demo的一個流程圖,可以參考 從0打造一個GPUImage(6)-GPUImage的多濾鏡處理邏輯 的一幅圖,Demo的詳細(xì)實現(xiàn)請看原文吧。
以上就是GPUImage對于濾鏡鏈的實現(xiàn)原理,只有你懂了OpenGL ES的渲染流程,才能徹底的明白GPUImage的濾鏡鏈的原理。所以時時刻刻記住以下關(guān)系
GPUImageOutput - filter - filter - GPUImageInput
當(dāng)然也可以存在多個Source,多個Input的情況,例如要給一個視頻添加水印,用 GPUImageMovie 用于輸出視頻紋理,用 GPUImageUIElement 輸出UI空間的紋理,通過一個filter進行Blend,最后用一個 GPUImageView 進行預(yù)覽,用 GPUImageMovieWriter 進行輸出,濾鏡鏈關(guān)系如下
很多用戶拍照不專業(yè),通過手機自帶的濾鏡可以讓用戶不用調(diào)參數(shù)也不用修圖就能得到很好的拍攝效果,那蘋果手機濾鏡怎么調(diào)出來?
蘋果手機濾鏡怎么調(diào)出來?
1、打開相機,在拍照界面點擊屏幕頂部中心的上拉三角圖標(biāo)。
2、點擊拍攝按鈕上方右下角的濾鏡圖標(biāo)。
3、選擇喜歡的濾鏡風(fēng)格即可。
本文以iphone12為例適用于ios14系統(tǒng)
對于iOS開發(fā)者而言,想要打造一款美圖App,最佳首選的開源框架莫過于GPUImage。它內(nèi)嵌了上百種圖像濾鏡,能夠滿足市面上的一切美顏開發(fā)方案。同時也具備了實時美顏的功能。通過這樣強大的開源框架,我們可以在其上層開發(fā)屬于我們自己的美圖應(yīng)用。SnapseedImitation 是以Snapseed為原型,利用GPUImage框架開發(fā)的圖像處理軟件。
SnapseedImitation
Github地址:
主要依賴GPUImage Github:
1.安裝Cocoapods
2.pod 'GPUImage'
3. improt 導(dǎo)入GPUImage.h后編譯即可。
通過GPUImagePicture獲取待編輯圖像,再經(jīng)過GPUImageFilter渲染后產(chǎn)出一幀frame,經(jīng)由消息管道通知后,便可在GPUImageView顯示編輯后的圖片,或者我們可以通過GPUImageFilter直接導(dǎo)出渲染后的UIImage。
GPUImageInputGPUImageFilterGPUImageOutput
以拉升變形濾鏡為例:
//@拉升變形鏡濾鏡
//創(chuàng)造輸入源
GPUImagePicture* gpupicture = [[GPUImagePicturealloc]initWithImage:[UIImageimageNamed:@"Duck.jpg"]];
//創(chuàng)建濾鏡
PUImageStretchDistortionFilter* stretchDistortionFilter = [GPUImageStretchDistortionFilternew];
//為濾鏡賦值
stretchDistortionFilter.center=CGPointMake(0.2,0.2);
//將輸入源和濾鏡綁定
[gpupicture addTarget:stretchDistortionFilter];
//為原圖附上濾鏡效果[gpupicture processImage];
//濾鏡收到原圖產(chǎn)生的一個frame,并將它作為自己的當(dāng)前圖像緩存
[stretchDistortionFilter useNextFrameForImageCapture];
//通過濾鏡,獲取當(dāng)前的圖像。
UIImage*image = [stretchDistortionFilter imageFromCurrentFramebuffer];
圖像拉升變形前后對比 :
開發(fā)過程中,必然會有多種濾鏡復(fù)合的需求,例如一個可以變化亮度、對比度、曝光的圖像調(diào)節(jié)程序。但是依照上一個示例,我們每添加一種濾鏡,便會代替之前的濾鏡效果。如果每次處理的都是上一次的filter導(dǎo)出的UIImage圖片的話,又會導(dǎo)致無法恢復(fù)到原圖樣子,導(dǎo)致失真。(可參考在繪畫板中,把圖片縮小到最小,再放大,圖片變成為了一個像素塊。)
這時候,我們需要一個很好用的類:GPUImageFilterPipeline
GPUImageFilterPipeline可以將多個濾鏡進行復(fù)合,并且在多次處理后,仍然能夠恢復(fù)成為原圖不失真。
仍然以拉升變形和卡通描邊效果為例 :
//獲取原圖
GPUImagePicture* gpupicture = [[GPUImagePicturealloc]initWithImage:[UIImageimageNamed:@"Duck.jpg"]];
//輸出圖像的
ViewGPUImageView* gpuimageView = [[GPUImageViewalloc]initWithFrame:CGRectMake(0,60,320,320)];[self.viewaddSubview:gpuimageView];
//卡通描邊濾鏡
GPUImageToonFilter* toonFilter = [GPUImageToonFilternew];toonFilter.threshold=0.1;
//拉升變形濾鏡
GPUImageStretchDistortionFilter* stretchDistortionFilter = [GPUImageStretchDistortionFilternew];
stretchDistortionFilter.center=CGPointMake(0.5,0.5);
//將濾鏡組成數(shù)組
NSArray* filters = @[toonFilter,stretchDistortionFilter];
//通過pipline,將輸入源,輸出,濾鏡,三方綁定
GPUImageFilterPipeline* pipLine = [[GPUImageFilterPipelinealloc]initWithOrderedFilters:filters input:self.gpupictureoutput:self.gpuimageView];
//繪制產(chǎn)出最終帶有復(fù)合濾鏡的圖像。
[self.gpupictureprocessImage];
//獲取產(chǎn)出的UIImage圖像
//此時調(diào)用useNextFrameForImageCapture的可以是任一在數(shù)組中的Filter。
[stretchDistortionFilter useNextFrameForImageCapture];
UIImage* image = [self.pipLinecurrentFilteredFrame];
基于GPUImage框架,我為其添加了一套了Snapseed的UI,通過手勢識別方案對圖像濾鏡進行調(diào)節(jié)拖控。
更多內(nèi)容:
GPUImage 進階學(xué)習(xí),實時視頻錄制,人臉檢測
當(dāng)前題目:ios濾鏡開發(fā),ios濾鏡怎么調(diào)
文章位置:http://chinadenli.net/article21/dsihicd.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、關(guān)鍵詞優(yōu)化、網(wǎng)站收錄、微信公眾號、網(wǎng)站制作、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)