天天看點

Android 中H.264/AVC codec的開發

        Android有MediaRecorder接口,通過這個接口可以錄制視訊檔案。Android内部也有各種音視訊codec,但是并沒有開放Java接口。是以當你想每次從Camera直接抓取一個畫面,然後壓縮成H264/MPEG4/H263 等視訊包時,就有困難了。這種需求在視訊聊天/視訊共享裡會有。本人仔細研究某開源代碼,對其進行合理配置達到優化的目的,做了一套H.264/AVC的編解碼器,編解碼器使用C/C++開發,通過Android NDK編譯産生動态連接配接庫。基于這個庫,我還做了一個在android裡運作的應用來示範這個H.264/AVC編解碼器。

       這裡就介紹一下這個應用。它包含HelloGalleryActivity、AvcRecActivity、AvcFileListActivity、AvcViewActivity、LoopAvccodecActivity這些Activity。HelloGalleryActivity是一個入口,先對這個應用做個簡單的說明,然後排出三個按鈕。第一個是錄制,點選它會啟動AvcRecActivity,在這裡面可以錄制一個個畫面,并且把它壓縮成一個個H264/AVC資料包,并且存入字尾名為avc的檔案裡。第二個是播放,點選它會啟動AvcFileListActivity,把/sdcard/avccodecDemo目錄裡所有avc檔案列出來,點選某個檔案将啟動AvcViewActivity把該檔案播放出來。第三個是自環,點選它會啟動LoopAvccodecActivity,它錄制和播放同時進行,每錄制壓縮一個幀,又解出來顯示出來,這樣可以評估同時錄放的性能。

        核心類介紹一下。AVC壓縮器在YzrAvcEnc.java,AVC解壓縮器在YzrAvcDec.java , 他們兩通過JNI調用C++層的AVC壓縮器達到快速壓縮解壓的功能 。 Yuv2Rgb 負責把YUV資料轉成RGB資料,隻有RGB資料才好顯示,這一功能也是費時的,是以也是通過C/C++代碼和Java代碼結合來達成,Java接口是Yuv2Rgb.java。錄制和播放在獨立線程裡完成,AvcThread 建立線程以及實作線程函數,解壓出來的資料通過Handler事件MSG_UPDATE_YUVVIEW通知 GraphicsView顯示。GraphicsView的update接口被MSG_UPDATE_YUVVIEW的處理程式調用時更新需顯示的最新資料(形參:updateArgb,實參:AvcThread.argbArray),draw函數負責顯示出來。

操縱camera的類VideoCameraView可以參考上一篇博文:《Android Camera 使用一例,視訊聊天app》。 

        代碼和APK在sourceforge: http://nchc.dl.sourceforge.net/project/avccodecdemo/avccodecDemo-src-apk.zip

        編解碼器的原生動态連接配接庫是一個示範版,編碼和解碼出來的資料包含水印。

       到2015/11/19的下載下傳統計:

Android 中H.264/AVC codec的開發