當前位置:
首頁 > 最新 > 網易MC:Android端的短視頻開發技術

網易MC:Android端的短視頻開發技術

在這篇文章中,我們主要談一談短視頻在Android端上的具體實現技術。

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

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

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

我們先來說說視頻錄製:

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

這個方案的優點在於,由於全程採用了GPU以及硬體編碼,基本上不涉及CPU上的操作,因此可實現在高幀率(30fps)、高解析度(720P)以及高碼率的情況下CPU暫用率也非常低,即使在性能較差的手機上也能很好的運行。但同時這個方案的難點也在於此。

做過音視頻的同學都知道,通常情況下我們所說的對音視頻的處理,主要是對視頻的 YUV、H264 音頻的PCM、AAC這類數據格式進行操作,這類操作都有相關的RFC技術也比較成熟,實現起來比較容易,出了問題也更容易定位,通常情況下在PC等設備上也都是這麼處理的。但這樣的方案在對於手機端情況就不同了,雖然手機這幾年的性能大大加強了,很多旗艦手機基本都是8核的CPU了,但要操作如此大量的圖片數據並進行浮點運算對CPU的消耗還是很大的。CPU暫用率高就會引起手機發燙,手機發燙就會導致Camera採集的掉幀,甚至在一些小米等廠商下,手機發燙還會引起CPU降頻,CPU一降頻那APP所暫用的CPU比例就更高了,同時CPU暫用率高電量消耗就快。 因此上面的方案是目前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上沒有很好的系統API即硬體處理方式,主要還是利用ffmpeg進行相應的疊加、裁剪混音等後期處理。可以優化的一個點是,先將原始的MP4視頻進行解碼,然後將解碼後的YUV數據映射到GPU的紋理上進行亮度、飽和度等參數的調節,做到文件編輯的所見即所得,然後將調好的參數配置為ffmpeg進行編輯處理。

以上由網易企業信息化服務提供商,湖南領先網路科技整理髮布。

網易企業服務(qiye163.co)是網易憑藉其20年品牌優勢與經驗在企業郵箱的基礎上,為進一步布局企業市場而打造的企業級產品矩陣,致力於提供一站式企業信息化解決方案。湖南領先網路科技是網易企業產品授權經銷商,專業為企業提供網易企業郵箱、網易辦公套件等一站式企業信息化專業解決方案。辦理網易企業郵箱及企業產品相關業務,就找湖南領先網路科技。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 網易企服 的精彩文章:

網易雲蔣文康:我對雲環境下訪問控制系統的思考
榮耀9發布會推遲1個月為保量 胡歌成榮耀代言人
OPPO稱超過1億人使用自家手機 提前透露R11參數
網易企業服務:奇碩基於網易雲的微服務與大數據實戰
智能揚聲器市場遭谷歌亞馬遜包夾 蘋果有出路嗎

TAG:網易企服 |

您可能感興趣

無人機開發商PrecisionHawk收購Droners、AirVid,建造行業專才網路
Fieldbit和InfinityAR宣布合作開發AR智能眼鏡
Mozilla 推出開源瀏覽器 Firefox Reality,專為 VR 一體機和 AR 頭顯開發
微軟開發MRTouch技術在HoloLens上實現觸摸交互
Python web開發:Flask的URL和視圖
Android 開發應該掌握的 Proguard 技巧
Mozilla推出開源瀏覽器Firefox Reality,專為VR一體機開發
安全性提高!Cellectis開發出新一代CAR-T技術CubiCAR
Myo腕帶開發商Thalmi將推出消費端智能眼鏡North
國內應該能用:谷歌暫停Allo開發將精力轉向開發Android Message
Adobe為設計師、開發者發布AR創作工具Project Aero
Unity為手機AR推出跨平台開發工具AR Foundation
適用於Android和iPhone的Swype鍵盤停止開發
MyBatis開發DAO的方式
e 絡盟推出GraspIO Cloudio—一款Raspberry Pi擴展板,配有移動平台,適用於端對端物聯網開發和部署
Fincantieri和Titomic合作開發3D列印造船技術
Core開發者眼鏡蛇Cobra公開打臉 Blockstream
研發實戰:現在開始,用Unity為Magic Leap One開發MR內容
CAD技術開發商「Onshape」推出新軟體,讓工程師通過Magic Leap眼鏡完成3D設計
LG的確有在開發和研究MicroLED技術並可能推出MicroLED電視