GPUImage簡單實用及碰到的問題

正式開始之前先介紹一下GPUImage,這是一款基於OpenGL ES 2.0的開源圖像處理庫。在iOS上將OpenGL ES的使用封裝成Objective-C接口,可以用來給圖像、相機視頻、視頻等添加濾鏡等渲染操作。GPUImage一代已經不再維護,OC只能給iOS和Mac使用;同時有GPUImage2使用Swift(基於Swift 3)開發,可以給Mac, iOS和Linux使用;最新的GPUImage3仍在開發完善中,基於Swift4,並且將OpenGL ES替換成蘋果的Metal,由於是蘋果官方封裝GPU方法,可以預見會比使用OpenGL ES的性能效率更高。本文使用的仍是第一代GPUImage。

接入GPUImage使用cocoapods直接接入就行,就不再贅述。下面是一個簡單的濾鏡使用:

GPUImage使用有三個關鍵點,input, output, filter(filter也是output但主要實現了濾鏡,所以分開說)。output一般是用來承載圖像內容輸出,可以是GPUImageUIElement(通過UIView來創建並承載整個UIView的內容), GPUImagePicture(使用UIImage或者CGImage之類的圖像來創建);filter就是所使用的濾鏡,可以使用GPUImage自帶的比如GPUImageGaussianBlurFilter, GPUImageColorInvertFilter等等,當然也可以自建Filter來實現一些自己所需要的濾鏡,當然也需要一些OpenGL的功底;input則是內容輸入需要GPUImage進行一些處理的,下面用一個MovieWriter進行視頻和一個動態畫面進行合成來舉例:

使用中第一版沒有提到聲音問題所以沒有發現,第二版需要使用視頻原聲音並錄製進去,查了一下可以這樣使用:

錄製開始會有隨機閃退問題,網上查了一下,大致是因爲音頻處理比視頻處理快,當音頻處理完直接callback去做渲染處理了,但這時視頻這幀還沒有加載完成,導致處理失敗崩潰,網上有一個替換GPUImageMovieWriter.m源文件的方法來規避這個問題,但我嘗試了一下仍然會發生,就不貼出來了。暫時也沒有更好的辦法來修復這個問題,由於時間緊迫,我採取只傳遞聲音而取消寫入視頻中,使用ffmpeg進行音視頻合成(或其他視頻處理工具,因爲本身項目有視頻剪切使用了ffmpeg)。如果以後對這方面有更深入的瞭解和研究會繼續更新如何解決這個問題。

PS: 說個題外關於視頻編碼問題,騰訊家的qq和微信SDK分享視頻只能分享網絡源無法分享本地源,但如果通過蘋果系統自帶的分享則可以分享視頻。最新版部分視頻會發生視頻壓縮失敗的問題,無法上傳。起先認爲是視頻編碼問題,通過ffmpeg重新使用h264或者libx264都無法解決;後來發現那些無法通過騰訊系壓縮的是音頻重新合成過的,所以我對音頻重新編碼,使用的是網絡上流媒體目前比較通用的aac,結果讓我大失所望,還是不行!網上也找不到騰訊有關這兩款分享視頻所需要的編碼問題,而如果我不通過ffmpeg進行編輯,原視頻的H.264+aac就是好的,沒有辦法只能採取控制變量法來一個一個試編碼。最後測出來是視頻H.264沒有問題,音頻則需要使用ac3來進行編碼才能通過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章