这段时间在做公司的语音这一块,主要是实现 手机端和pc端的语音通话问题(回音和噪音消除暂时没有考虑)用得是amr得方案。。
安卓手机端自带的录音是可以直接录成amr的格式,省去了压缩的功夫。但是播放的时候如果要是直接播amr的话 只能通过文件的方式进行,这就会导致延迟。
目前软件是用得安卓自己提供的硬解码方案,没有使用自己的软解码,主要是如果软解码的话程序cpu占用率会很高。
录音方面用得是MediaRecord边录边发送。基本上没有难点。
手机播放方面 由于MediaPlay 只能从文件或者网络播放,没有办法直接从socket端直接播。。于是就采用了文件的形式,socket端将接受的数据写到文件里,然后给Mediaplayer 指定文件描述符。这种方法的问题如果写入文件的数据太多了,难么延迟就会很大,要是写的数据量少,那么播起来会有明显的一顿一顿的,文件这种方式必然会导致一定的延迟。
这两天在测试的时候感觉文件这种方式话音质量太差了,再者发现在录音和播放语音的时候发现后台的MediaServer的服务CPU 占用率也不小,有可能是测试的手机对硬件解码不太友好。于是想试试软解码的情况下运行如何。。
如果要进行软解码如要amr的解码的代码,PC端用得是amr标准代码,如果要移植到安卓的话,需要将其用ndk编译成动态库,本以为很简单,但是在处理android.mk的时候难倒我了,这么make真不好写,如于是乎重新学习了一下make,然后根据有android.mk的代码好好研究了一番,终于完成了。
源文件太多了,原本对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)
原文地址:http://xiaoyuyang.blog.51cto.com/2996398/1566478