「Android音視頻編碼那點破事」序章

  本章僅對部分代碼進行講解,以幫助讀者更好的理解章節內容。本系列文章涉及的項目HardwareVideoCodec已經開源到Github。目前已迭代多個穩定版本,歡迎查閱學習和使用,如有BUG或建議,歡迎Issue。

封面出自:板栗懶得很

  其實這一兩年關於Android 平臺的視頻編解碼學習資料已經很多了,包括書籍和網上的一些公開教程。書籍講得詳細一點,所以推薦大家去買些書籍看看。而網上的資料的話,大多是零星點點,新手學習起來並不是很輕鬆,包括我。所以這也是促使本人對這一塊知識做記錄的原因。
  我打算開幾個章節來分享一下相關的知識點,因爲想詳細展開,內容可能有點多,也算是做一些個人筆記。

  這個筆記的主要內容是,使用硬編和軟編的方式解決Android視頻編解碼的問題(後續會支持解碼),並且使用OpenGL實現濾鏡渲染,包括美顏,水印等等。
  該項目已經開源在Github,目前已經迭代到了1.2.1版本,使用GPL開源協議,請大家遵守該協議,爲開源事業做點貢獻。名字雖然叫做硬編解碼器,但其實已經擴展了軟編。HardwareVideoCodec使用Kotlin實現,沒有學過Kotlin的不需要害怕,先去看一些語言基礎就可以了。


知識點

  • OpenGL

  1. EGL(全稱Embedded Graphics Library,一組OpenGL連接本地窗口的接口,主要通過Surface向窗口繪製幀畫面,以及給MediaCodec提供幀數據)

  2. FBO(幀緩衝區,這裏主要用於離屏渲染以及特效)

  3. PBO(像素緩衝區對象,可以高效讀取GPU中的像素數據,用於軟編)

  4. 紋理

  • Camera

  • SurfaceTexture(集成了EGL環境的Surface,可以很方便的與OpenGL聯動,也是TextureView提供的渲染接口)

  • MediaCodec(硬編解決方案)

  • X264(軟編解決方案)

  • MediaMuxer(音視頻混合器)

  •   以上內容我會選一部分在接下來的時間裏詳細展開,尤其是OpenGL和編碼那一塊。

    可能有人有疑問,軟編解碼首選的不是大名鼎鼎的ffmpeg嗎,爲什麼直接使用x264。這裏我可以很負責任的告訴你,直接使用x264,再配合MediaMuxer使用會簡單很多,也是因爲硬編同樣會用到MediaMuxer。

      大家都知道ffmpeg其實就是在衆多編解碼器上套個殼子,再集成一個混合器,雖然功能衆多,但是卻很臃腫(當然已經很出色了),以至於我來了來來回回學習了4+次也沒有掌握。ffmpeg的頭文件相當多,相比之下,x264只有一個頭文件,沒幾個方法,掌握起來很容易。對於編解碼常常用到的顏色格式(ColorFormat)轉換,ffmpeg提供了swscale,功能雖然很強大,但效率不敢恭維,完全可以使用google的libyuv替代。所以,如果沒有很複雜的功能需求,還是老老實實的使用x264來的方便。

      先簡單看一下HardwareVideoCodec的結構圖:

            從結構圖中可以看到,HardwareVideoCodec做了比較詳細的分層結構,從上往下總共四層

    • 總控制器

    • 幀渲器

    • 編碼器

    • 混合器
        可以很方便的進行擴展,比如把混合器去掉,在編碼器數據出口處增加直播推流都是很方便的。

    • CameraPreviewPresenter:名字雖然叫做攝像頭預覽管理器,但其實也有統籌渲染器、編碼器、混合器職能。在這個層級會持有攝像頭,並且初始化一組EGL,提供取出攝像頭數據的環境。

    • Render:攝像頭數據在這裏取出,並保存在第一組FBO。同時這一層的EGL環境會把FBO的數據繪製到TextureView提供的SurfaceTexture,也就是屏幕。這裏還有一組filter,OpenGL的濾鏡入口在這裏。

    • Encoder:音視頻編碼器的抽象層,利用這組接口可以很方便的擴展自己的編碼器。當然,筆者在這裏已經提供了軟硬編碼器的實現。

    • Muxer:混合器,用來混合音視頻,並把它們封裝成需要的格式,這裏固定封裝成mp4。
        以上是HardwareVideoCodec的簡單結構,作爲序章就先講這麼多。接下來我會繼續更新,詳細去講解具體實現,以及在實現過程中會碰到的一系列問題。有興趣的可以去Github上查看源碼學習,歡迎star以及issue。也可以關注我簡書,以便能及時收到這個系列的更新。


    技術交流,歡迎加我微信:ezglumes ,拉你入技術交流羣。

    推薦閱讀:

    Android JNI Crash定位步驟

    Android JNI 之 Bitmap 操作

    Google Jetpack 新組件 CameraX 介紹與實踐

    喜歡就點個「在看」 ▽

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