这段时间在做公司的语音这一块,主要是实现 手机端和pc端的语音通话问题(回音和噪音消除暂时没有考虑)用得是amr得方案。。

安卓手机端自带的录音是可以直接录成amr的格式,省去了压缩的功夫。但是播放的时候如果要是直接播amr的话 只能通过文件的方式进行,这就会导致延迟。

目前软件是用得安卓自己提供的硬解码方案,没有使用自己的软解码,主要是如果软解码的话程序cpu占用率会很高。

录音方面用得是MediaRecord边录边发送。基本上没有难点。

手机播放方面 由于MediaPlay  只能从文件或者网络播放,没有办法直接从socket端直接播。。于是就采用了文件的形式,socket端将接受的数据写到文件里,然后给Mediaplayer 指定文件描述符。这种方法的问题如果写入文件的数据太多了,难么延迟就会很大,要是写的数据量少,那么播起来会有明显的一顿一顿的,文件这种方式必然会导致一定的延迟。

这两天在测试的时候感觉文件这种方式话音质量太差了,再者发现在录音和播放语音的时候发现后台的MediaServer的服务CPU 占用率也不小,有可能是测试的手机对硬件解码不太友好。于是想试试软解码的情况下运行如何。。

如果要进行软解码如要amr的解码的代码,PC端用得是amr标准代码,如果要移植到安卓的话,需要将其用ndk编译成动态库,本以为很简单,但是在处理android.mk的时候难倒我了,这么make真不好写,如于是乎重新学习了一下make,然后根据有android.mk的代码好好研究了一番,终于完成了。

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 := amr
LOCAL_CFLAGS := -DANDROID_NDK \
            -DDISABLE_IMPORTGL \
-Wno-sequence-point \
-Wno-extra
include $(BUILD_SHARED_LIBRARY)