2019-06-04 AAC編碼庫:VoAACEncoder動態(tài)庫生成及使用

代碼已上傳Github:HaloMartin/VoAACEncoder(https://github.com/HaloMartin/VoAACEncoder),歡迎參閱指點。

背景

AAC是一種比較普遍的音頻編碼格式,實際應(yīng)用中經(jīng)常和H264一起使用來進行音視頻的封裝。在我司的應(yīng)用中,將音視頻封裝成MP4格式時,其中視頻使用的是H264編碼,可以用ffmpeg庫進行編解碼;音頻使用的是AAC編碼,iOS端用的是faac庫進行編碼,Android端使用的是VoAACEncoder庫。

在我司應(yīng)用中,大致流程如圖所示:


Figure 1-1 音視頻碼流處理流程圖

在進行封裝的時候,視頻部分使用的是未解碼的H264數(shù)據(jù)幀直接封裝,所以封裝時不必進行編碼(用程序進行編碼也不切實際); 而音頻則因為輸入設(shè)備使用的編碼格式的不同,分別使用Speex和G711和兩種編碼格式,需要先解碼為PCM,而后統(tǒng)一編碼成AAC,再封裝到MP4中。

在這邊文章中,只討論Android上音頻的AAC編碼這個步驟,iOS目前是前輩從開源網(wǎng)站下載的源碼后進行編譯使用,較為靈活,可能源碼版本很久,不在本篇的討論范圍內(nèi)。

VoAACEncoder

iOS上的FAAC參考鏈接:FAAC-1.28(http://www.linuxfromscratch.org/blfs/view/7.7/multimedia/faac.html)
VoAACEncoder庫下載地址:https://sourceforge.net/projects/opencore-amr/files/vo-aacenc/
在Github上有一個開源的項目VoAACEncoder,包含F(xiàn)AAC和VoAACEncoder,從使用者的角度來說,比官方的那些更簡單明了,感興趣的小伙伴也可以從官網(wǎng)下載源碼嘗試自己封裝,也可以從https://github.com/illuspas/VoAACEncoder上直接下載so文件來使用,這里面包含了FAAC和VoAACEncoder兩個動態(tài)庫,對應(yīng)上面提到的那兩個,但是我只使用其中的VoAACEncoder,綜合引用文章:VoAACEncoder-貝殼博客所述,VoAACEncoder比FAAC具有更高的效率。
以下是VoAACEncoder的使用方法,很簡單:

  • 下載并復(fù)制libVoAACEncoder.so文件到項目中
  • 復(fù)制VoAACEncoder.java到指定的包路徑(com.sinaapp.bashell)
  • 使用VoAACEncoder類中的三個jni接口進行AAC編碼

問題

從Android 6.0起,即SDK Version>=23時,系統(tǒng)將會拒絕加載包含text relocations的共享庫,而illuspas/VoAACEncoder中直接生成的so文件也有相關(guān)問題。
如果你恰好跟我一樣,直接使用了libVoAACEncoder.so,因為要上架到Google Play,被強制要求升級到>=26,則你的App就會在使用該庫時崩潰,日志中提示:dlopen failed: "/data/app/com.XXXX/lib/arm/libVoAACEncoder.so" has text relocations,參考文章:# lib/arm/libVoAACEncoder.so has text relocations問題的解決方案
官方給出了解釋,

解決方法:

在Android.mk 中添加LOCAL_LDFLAGS += -fPIC,重新編譯生成so文件,添加代碼位置如下:

LOCAL_LDLIBS := -ldl -lc -lz -lm -llog
LOCAL_LDFLAGS += -fPIC

include $(BUILD_SHARED_LIBRARY)

在Terminal上編譯過程如圖:

Figure 3-1 NDK編譯VoAACEncoder
  1. 通過cd命令,cdVoAACEncoder的jni目錄;
  2. 使用NDK來編譯庫,但是要注意使用的NDK版本不能高于r15c,否則會出現(xiàn)編譯錯誤,原因如圖中2所示,VoAACEncoder支持armeabi,所以編譯的ndk要求低于android-ndk-r15c
  3. 正確的編譯方法是使用低于android-ndk-r15c的NDK進行編譯,如圖中3所示。

編譯完成后

可在libs目錄找到新生成的so文件,如圖

Figure 3-2 libs目錄

總結(jié)

原來illuspas/VoAACEncoder開源的代碼有相關(guān)的問題,偷懶不想自己編譯的話,可以直接使用我的開源項目HaloMartin/VoAACEncoder,相關(guān)問題已修復(fù)并上傳。

參考鏈接:

# VoAACEncoder-貝殼博客
# lib/arm/libVoAACEncoder.so has text relocations問題的解決方案

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容