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來進行編碼才能經過。3d

相關文章
相關標籤/搜索