標籤:ndk 編譯 amr android
這段時間在做公司的語音這一塊,主要是實現 手機端和pc端的語音通話問題(迴音和噪音消除暫時沒有考慮)用得是amr得方案。。
安卓手機端內建的錄音是可以直接錄成amr的格式,省去了壓縮的功夫。但是播放的時候如果要是直接播amr的話 只能通過檔案的方式進行,這就會導致延遲。
目前軟體是用得安卓自己提供的硬解碼方案,沒有使用自己的軟解碼,主要是如果軟解碼的話程式cpu佔用率會很高。
錄音方面用得是MediaRecord邊錄邊發送。基本上沒有痛點。
手機播放方面 由於MediaPlay 只能從檔案或者網路播放,沒有辦法直接從socket端直接播。。於是就採用了檔案的形式,socket端將接受的資料寫到檔案裡,然後給Mediaplayer 指定檔案描述符。這種方法的問題如果寫入檔案的資料太多了,難麼延遲就會很大,要是寫的資料量少,那麼播起來會有明顯的一頓一頓的,檔案這種方式必然會導致一定的延遲。
這兩天在測試的時候感覺檔案這種方式話音品質太差了,再者發現在錄音和播放語音的時候發現背景MediaServer的服務CPU 佔用率也不小,有可能是測試的手機對硬體解碼不太友好。於是想試試軟解碼的情況下運行如何。。
如果要進行軟解碼如要amr的解碼的代碼,PC端用得是amr標準代碼,如果要移植到安卓的話,需要將其用ndk編譯成動態庫,本以為很簡單,但是在處理android.mk的時候難倒我了,這麼make真不好寫,如於是乎重新學習了一下make,然後根據有android.mk的代碼好好研究了一番,終於完成了。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/4C/DB/wKioL1RGaLajAoVsAAIdGmgSVSg325.jpg" title="源碼目錄" alt="wKioL1RGaLajAoVsAAIdGmgSVSg325.jpg" />
源檔案太多了,原本對make就比較頭疼。
這是我得android.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)amrtool_src := $(wildcard $(LOCAL_PATH)/amrtool/*.cpp)amrtool_src := $(amrtool_src:$(LOCAL_PATH)/amrtool/%=%)common_src := $(wildcard $(LOCAL_PATH)/amrnb/*.cpp)common_src := $(common_src:$(LOCAL_PATH)/amrnb/%=%)dec_src = $(wildcard $(LOCAL_PATH)/amrnb/dec/*.cpp)dec_src := $(dec_src:$(LOCAL_PATH)/amrnb/dec/%=%)enc_src = $(wildcard $(LOCAL_PATH)/amrnb/enc/*.cpp)enc_src := $(enc_src:$(LOCAL_PATH)/amrnb/enc/%=%)LOCAL_SRC_FILES := $(amrtool_src:%=amrtool/%) $(common_src:%=amrnb/%) $(dec_src:%=amrnb/dec/%) $(enc_src:%=amrnb/enc/%)LOCAL_C_INCLUDES := $(LOCAL_PATH)/amrnb $(LOCAL_PATH)/amrnb/dec $(LOCAL_PATH)/amrnb/enc LOCAL_MODULE := amrLOCAL_CFLAGS := -DANDROID_NDK -DDISABLE_IMPORTGL -Wno-sequence-point -Wno-extrainclude $(BUILD_SHARED_LIBRARY)
安卓語音通話