回顧
GPUImage源碼解析朋譬、圖片模糊堵腹、視頻濾鏡、視頻水印都已經(jīng)介紹過,這次帶來的是給視頻添加文字水印常柄、動態(tài)圖像水印。
效果展示
“我是水印”的文字梅誓,還有心形氣泡組成的水印沽讹。
處理中的動態(tài)圖,上面是進度藻烤,下面是文字水颖脸:“我是水印”头滔,動態(tài)圖像水印:心形氣泡涎显。
核心思路
- 1坤检、UIView上面有UILabel(文字水印)和UIImageView(圖片水悠谙拧)早歇,再通過GPUImageUIElement把UIView對象轉(zhuǎn)換成紋理對象,進入響應(yīng)鏈膘婶;
- 2缺前、視頻文件的圖像數(shù)據(jù)通過GPUImageMovie進入響應(yīng)鏈;
- 3悬襟、GPUImageDissolveBlenderFilter合并水印圖像和視頻衅码,把數(shù)據(jù)傳給響應(yīng)鏈的終點GPUImageView以顯示到UI和GPUImageMovieWriter以寫入臨時文件;
- 4脊岳、視頻文件的音頻數(shù)據(jù)通過GPUImageMovie傳給GPUImageMovieWriter以寫入臨時文件逝段;
-
5、最后臨時文件通過ALAssetsLibrary寫入系統(tǒng)庫割捅。
具體細節(jié)
1奶躯、GPUImageUIElement
GPUImageUIElement繼承GPUImageOutput類,作為響應(yīng)鏈的源頭亿驾。通過CoreGraphics把UIView渲染到圖像嘹黔,并通過glTexImage2D綁定到outputFramebuffer指定的紋理,最后通知targets紋理就緒莫瞬。
2儡蔓、GPUImageOutput和GPUImageFilter
本次demo主要用到了frameProcessingCompletionBlock屬性,當GPUImageFilter渲染完紋理后疼邀,會調(diào)用frameProcessingCompletionBlock回調(diào)喂江。
3、響應(yīng)鏈解析
- 1旁振、當GPUImageMovie的紋理就緒時获询,會通知GPUImageFilter處理圖像;
- 2拐袜、GPUImageFilter會調(diào)用frameProcessingCompletionBlock回調(diào)吉嚣;
- 3、GPUImageUIElement在回調(diào)中渲染圖像蹬铺,紋理就緒后通知
GPUImageDissolveBlendFilter尝哆; - 4、frameProcessingCompletionBlock回調(diào)結(jié)束后丛塌,通知
GPUImageDissolveBlendFilter紋理就緒较解; -
5、GPUImageDissolveBlendFilter收到兩個紋理后開始渲染赴邻,紋理就緒后通知GPUImageMovieWriter印衔;
如圖
總結(jié)
本篇的內(nèi)容與上一篇視頻水印有類似的地方。GPUImageUIElement是新的知識點姥敛,但是如果對CoreGraphics和OpenGL ES熟悉可以秒懂奸焙。
附上代碼
思考題
思考1:響應(yīng)鏈解析中的GPUImageFilter有什么作用?是否可以去掉彤敛?
思考2:frameProcessingCompletionBlock里面需要做什么樣的操作与帆?為什么?
思考3:能否對圖像水印進行復(fù)雜的位置變換墨榄?
答案
思考1:目的是每幀回調(diào)玄糟;去掉會導(dǎo)致圖像無法顯示。
思考2:回調(diào)需要調(diào)用update操作袄秩;因為update只會輸出一次紋理信息阵翎,只適用于一幀。
思考3:在回調(diào)中對UIView進行操作即可之剧;或者使用GPUImageTransformFilter郭卫。