日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

短视频技术详解:Android端的短视频开发技术

發布時間:2025/3/8 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 短视频技术详解:Android端的短视频开发技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

?

推薦閱讀

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

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

?

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

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

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

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上比較適合短視頻錄制的方案。

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進行編輯處理。

?

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

?

總結

以上是生活随笔為你收集整理的短视频技术详解:Android端的短视频开发技术的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。