如何在Android设备上使用pjsip以获得G.729编解码器功能

时间:2013-11-25 13:10:21

标签: android sip voip codec pjsip

我想在我的Android应用程序上使用G.729音频编解码器。我对此做了很多研究,并且发现pjsip是最有希望的解决方案。但我对这一切并不太了解。有人可以向我提供在现有Android应用程序中使用pjsip的完整步骤,以及如何通过G729包含对pjsip编解码器的支持。

任何帮助将不胜感激。

编辑:

这是我的android.mk文件。我想知道,我做对了吗?以及如何在我的java代码中使用这些C函数???

include $(CLEAR_VARS)
LOCAL_MODULE := pjsua-arm-unknown-linux-androideabi
LOCAL_SRC_FILES := $(MY_PJLIB_PATH)/libpjsua-arm-unknown-linux-androideabi.a

 PJSIP_LIBS := $(addprefix pjsip_libs/, \
 libg7221codec-arm-unknown-linux-androideabi.a \
 libg7221codec-i686-apple-darwin9.a \
 libgsmcodec-arm-unknown-linux-androideabi.a \
 libgsmcodec-i686-apple-darwin9.a \
 libilbccodec-arm-unknown-linux-androideabi.a \
 libmilenage-arm-unknown-linux-androideabi.a \
 libmilenage-i686-apple-darwin9.a \
 libpj-arm-unknown-linux-androideabi.a \
 libpj-i686-apple-darwin9.a \
 libpjlib-util-arm-unknown-linux-androideabi.a \
 libpjlib-util-i686-apple-darwin9.a \
 libpjmedia-audiodev-i686-apple-darwin9.a \
 libpjmedia-codec-i686-apple-darwin9.a \
 libpjmedia-i686-apple-darwin9.a \
 libpjmedia-videodev-i686-apple-darwin9.a \
 libpjnath-arm-unknown-linux-androideabi.a \
 libpjnath-i686-apple-darwin9.a \
 libpjsdp-i686-apple-darwin9.a \
 libpjsip-i686-apple-darwin9.a \
 libpjsip-simple-i686-apple-darwin9.a \
 libpjsip-ua-i686-apple-darwin9.a \
 libpjsua-i686-apple-darwin9.a \
 libportaudio-i686-apple-darwin9.a \
 libresample-arm-unknown-linux-androideabi.a \
 libresample-i686-apple-darwin9.a \
 libspeex-arm-unknown-linux-androideabi.a \
 libsrtp-arm-unknown-linux-androideabi.a \
 libsrtp-i686-apple-darwin9.a )

 LOCAL_STATIC_LIBRARIES := $(PJSIP_LIBS) 
 include $(PREBUILT_STATIC_LIBRARY)

1 个答案:

答案 0 :(得分:6)

第一步是为Android构建pjsip源代码(Ubuntu Linux的步骤):

  1. ANDROID_NDK_ROOT环境变量设置为NDK的根文件夹。
  2. 转到pjsip 2.x文件夹并创建pjlib/include/pj/config_site.h,包括config_site_sample.h#include <pj/config_site_sample.h>
  3. 运行./configure-android
  4. 运行make clean && make depend && make
  5. 完成这些步骤后,您将在多个文件夹中拥有多个静态库。我建议将它们分组到同一个文件夹中(在项目中更好):

    mkdir <your_project_path>/pjsip_libs
    find . -name *.a | xargs -I % cp % <your_project_path>/pjsip_libs/
    

    一旦你拥有所有的库,你需要将这些库添加到项目的Android.mk文件中,这是通过在每个库中包含一个新的模块部分来完成的。这个模块部分应该是这样的:

    include $(CLEAR_VARS)
    LOCAL_MODULE := pjsua-arm-unknown-linux-androideabi
    LOCAL_SRC_FILES := $(MY_PJLIB_PATH)/libpjsua-arm-unknown-linux-androideabi.a
    include $(PREBUILT_STATIC_LIBRARY)
    

    而且,在您实际构建JNI项目源代码的部分中,将所有模块添加到静态库引用中:

     LOCAL_STATIC_LIBRARIES := pjsua-arm-unknown-linux-androideabi ...
    

    这将包括对您的JNI库的pjsip引用。现在,您需要配置pjsip UA实例。

    你有关于init的解释并在pjsip中启动pjsip/include/pjsua-lib/pjsua.h的UA(pjsua),但要遵循的主要步骤是:

    1. 使用pjsua_create
    2. 创建UA实例
    3. 使用pj_thread_create
    4. 创建工作线程
    5. 设置UA实例的默认配置:

      pjsua_config cfg; pjsua_logging_config log_cfg; pjsua_media_config media_cfg;

      pj_cli_cfg_default(安培; app_config.cli_cfg.cfg); pjsua_logging_config_default(安培; log_cfg); pjsua_media_config_default(安培; media_cfg);

    6. 使用pjsua_init

    7. 初始化堆栈
    8. 使用pjsua_start
    9. 启动堆栈

      从这里开始,您有很多配置选项(日志,媒体,传输等)

      你可以找到一个基本的PJSIP教程here,在pjsip的源根路径中,你有一个基本的(但对于基本的SIP使用来说足够完整):pjsip-apps/src/samples/simple_pjsua.c

      编辑:在pjsip-apps中构建android项目时,您可能会遇到问题,因为默认情况下不会在常规版本中生成pjsua-app(更具体地说,pjsua:target不包括在内all:目标在pjsip-apps / build / Makefile)。要解决这个问题,请转到pjsip-apps / build并运行:

      制作pjsua

      这将在以下位置创建正确的目标文件:pjsip-apps / build / output / pjsua-arm-unknown-linux-androideabi /(构建android示例时需要)。

      一旦你拥有了所有相应的目标文件,你就可以在pjsip-apps / src / pjsua / android

      再次运行ndk-build