短視頻技術詳解:Android端的短視頻開發技術

在《如何快速實現移動端短視頻功能?》中,咱們主要介紹了當前短視頻的大熱趨勢以及開發一個短視頻應用所涉及到的功能和業務。在本篇文章中,咱們主要談一談短視頻在Android端上的具體實現技術。

推薦閱讀

《視頻私有云實戰:基於Docker構建點播私有云平臺》算法

《如何快速實現移動端短視頻功能》docker


短視頻業務主要包含:「視頻錄製」以及 「視頻編輯」這兩個核心功能。緩存

其中視頻錄製又包括:視頻採集、實時美顏、自定義碼率、攝像頭切換、變焦、對焦、曝光度調節以及濾鏡等功能。ide

視頻編輯包括:視頻裁剪、視頻拼接、混音、視頻動畫效果、動態貼圖等功能。性能

Android端短視頻錄製的技術方案

咱們先來講說視頻錄製:優化


視頻錄製的大體實現流程就如上圖所示,先由Camera、AudioRecord進行最原始的相機畫面以及聲音的採集,而後將採集的數據進行濾鏡、降噪等前處理,處理完成後由MediaCodec進行硬件編碼,最後採用MediaMuxer生成最終的MP4文件。動畫

這個方案的優勢在於,因爲全程採用了GPU以及硬件編碼,基本上不涉及CPU上的操做,所以可實如今高幀率(30fps)、高分辨率(720P)以及高碼率的狀況下CPU暫用率也很是低,即便在性能較差的手機上也能很好的運行。但同時這個方案的難點也在於此。ui

作過音視頻的同窗都知道,一般狀況下咱們所說的對音視頻的處理,主要是對視頻的 YUV、H264 音頻的PCM、AAC這類數據格式進行操做,這類操做都有相關的RFC技術也比較成熟,實現起來比較容易,出了問題也更容易定位,一般狀況下在PC等設備上也都是這麼處理的。編碼

但這樣的方案在對於手機端狀況就不一樣了,雖然手機這幾年的性能大大增強了,不少旗艦手機基本都是8核的CPU了,但要操做如此大量的圖片數據並進行浮點運算對CPU的消耗仍是很大的。CPU暫用率高就會引發手機發燙,手機發燙就會致使Camera採集的掉幀,甚至在一些小米等廠商下,手機發燙還會引發CPU降頻,CPU一降頻那APP所暫用的CPU比例就更高了,同時CPU暫用率高電量消耗就快。 3d

所以上面的方案是目前Android上比較適合短視頻錄製的方案。

Android端短視頻錄製的具體實現

既然肯定了技術方案,咱們就來看看具體的實現。這裏首先須要知道幾個概念:

SurfaceTexture


咱們知道在一些簡單的自定義相機應用中,要實現一個相機,只須要將一個SurfaceHolder設置給Camera,Android系統就會自動的幫咱們把Camera採集的數據繪製到屏幕上。但因爲在短視頻中咱們須要對相機採集的數據進行前處理加工好比濾鏡等,並且還要作到可見即所得的效果,所以必需要求咱們將相機採集的數據先緩存起來,前處理完後本身再繪製到屏幕上,這時候就須要用到SurfaceTexture了。按照Android官方文檔的介紹,SurfaceTexture就是這樣一塊用於接收Camera採集的數據,同時又不可見的畫布。這塊畫布是存在於GPU內存中的。

TextureID

紋理ID,主要用來標識每一塊紋理在GPU內存中的內存地址,相似於C語言中的內存指針。每一塊GPU的紋理(能夠理解爲一塊用於顯示圖片的畫布)都有對應的一個TextureID進行標識。上述的SurfaceTexture在建立也一樣須要綁定一個紋理ID進行惟一標識。


知道了這兩個概念,咱們就知道了Camera採集的數據具體存在於GPU的哪一個位置了。接下來就能夠對原始的數據進行前處理編碼了。

這裏有一個須要注意的地方,Android的camera採集到SurfaceTexture上的紋理是GL_TEXTURE_EXTERNAL_OES 類型的紋理,而目前市面的不少濾鏡算法,如開源的GPUImage中不少的濾鏡都是基於GL_TEXTURE_2D類型的紋理進行圖像處理的。

所以在進行咱們在基於開源濾鏡算法或自研算法時須要先將GL_TEXTURE_EXTERNAL_OES類型的紋理轉化爲GL_TEXTURE_2D的紋理,或者在GPU Shader中加入 "#extension GL_OES_EGL_image_external: require" 來代表該紋理是OES紋理,同時編寫基於OES紋理的圖像處理算法。

目前網易這邊是先將OES轉化爲TEXTURE_2D在進行前處理,這樣便於與iOS端算法統一以及更好的接入一些開源的濾鏡算法。

解決了SurfaceTexture的問題,接下來的MediaCodec以及MediaMuxer就比較容易了。Android中的MediaCodec天生支持將GPU中的紋理繪製到MediaCodec的Surface中,而後對Surface中的圖像直接進行硬件編碼,圖像數據始終是在GPU空間中進行流轉,而沒有涉及到CPU。

這裏須要注意的是MediaCodec以及MediaMuxer須要在API 18及以上才能使用。同時須要注意MediaCodec在不一樣設備上的兼容性。

Android端視頻編輯功能

最後對於視頻編輯的功能,目前Android上沒有很好的系統API即硬件處理方式,主要仍是利用ffmpeg進行相應的疊加、裁剪混音等後期處理。能夠優化的一個點是,先將原始的MP4視頻進行解碼,而後將解碼後的YUV數據映射到GPU的紋理上進行亮度、飽和度等參數的調節,作到文件編輯的所見即所得,而後將調好的參數配置爲ffmpeg進行編輯處理。

想要獲取更多產品乾貨、技術乾貨,記得關注網易雲信博客

相關文章
相關標籤/搜索