热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

baresipandroid编译、运行教程1语音通话

本文介绍了如何在安卓平台上编译和运行baresipandroid,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。

1.编译 在git 上找了下 https://github.com/juha-h/libbaresip-android 这个测试不错  相关的下载sdk和r19的ndk 并参考执行就行了 注意修改ndk路径和输出目录

make download-sources 如果执行不成功 则自己下载包 重命名和他的一样就可以了  地址在Makefile里面


(如果觉得麻烦可以去https://item.taobao.com/item.htm?id=606696026272购买个维护好的)


2.编译完成后 输出目录结构

有对应的头文件和.a文件

如果你是精通安卓的直接参考他的项目就行了https://github.com/juha-h/baresip-studio

 

 


3.在studio创建一个c++的安卓工程将上面这个目录考到cpp下修改

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html# Sets the minimum version of CMake required to build the native library.cmake_minimum_required(VERSION 3.4.1)set(distribution_DIR ${CMAKE_SOURCE_DIR}/distribution)add_library(lib_crypto STATIC IMPORTED)
set_target_properties(lib_crypto PROPERTIES IMPORTED_LOCATION${distribution_DIR}/openssl/lib/${ANDROID_ABI}/libcrypto.a)add_library(lib_ssl STATIC IMPORTED)
set_target_properties(lib_ssl PROPERTIES IMPORTED_LOCATION${distribution_DIR}/openssl/lib/${ANDROID_ABI}/libssl.a)add_library(lib_re STATIC IMPORTED)
set_target_properties(lib_re PROPERTIES IMPORTED_LOCATION${distribution_DIR}/re/lib/${ANDROID_ABI}/libre.a)add_library(lib_rem STATIC IMPORTED)
set_target_properties(lib_rem PROPERTIES IMPORTED_LOCATION${distribution_DIR}/rem/lib/${ANDROID_ABI}/librem.a)add_library(lib_opus STATIC IMPORTED)
set_target_properties(lib_opus PROPERTIES IMPORTED_LOCATION${distribution_DIR}/opus/lib/${ANDROID_ABI}/libopus.a)add_library(lib_g722_1 STATIC IMPORTED)
set_target_properties(lib_g722_1 PROPERTIES IMPORTED_LOCATION${distribution_DIR}/g7221/lib/${ANDROID_ABI}/libg722_1.a)add_library(lib_ilbc STATIC IMPORTED)
set_target_properties(lib_ilbc PROPERTIES IMPORTED_LOCATION${distribution_DIR}/ilbc/lib/${ANDROID_ABI}/libilbc.a)add_library(lib_webrtc STATIC IMPORTED)
set_target_properties(lib_webrtc PROPERTIES IMPORTED_LOCATION${distribution_DIR}/webrtc/lib/${ANDROID_ABI}/libwebrtc.a)add_library(lib_bn STATIC IMPORTED)
set_target_properties(lib_bn PROPERTIES IMPORTED_LOCATION${distribution_DIR}/bn/lib/${ANDROID_ABI}/libbn.a)add_library(lib_zrtp STATIC IMPORTED)
set_target_properties(lib_zrtp PROPERTIES IMPORTED_LOCATION${distribution_DIR}/zrtp/lib/${ANDROID_ABI}/libzrtp.a)add_library(lib_baresip STATIC IMPORTED)
set_target_properties(lib_baresip PROPERTIES IMPORTED_LOCATION${distribution_DIR}/baresip/lib/${ANDROID_ABI}/libbaresip.a)# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.add_library( # Sets the name of the library.native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).native-lib.cpp)# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
include_directories(native-lib${distribution_DIR}/baresip/include${distribution_DIR}/re/include${distribution_DIR}/rem/include)find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log)# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.target_link_libraries( # Specifies the target library.native-libandroidOpenSLESlib_baresiplib_remlib_relib_ssllib_cryptolib_opuslib_g722_1lib_ilbclib_webrtclib_zrtplib_bnz# Links the target library to the log library# included in the NDK.${log-lib})

参考https://github.com/juha-h/baresip-studio 就行了

 


4.接着在native-app里面写个start和接听的方法

#include
#include
#include

#include "AndroidLog.h"#include "re.h"
#include "baresip.h"typedef struct baresip_context {struct ua *ua;struct call *call;
} BaresipContext;BaresipContext g_ctx;static void signal_handler(int sig)
{static bool term = false; if (term) {mod_close();exit(0);}term = true;LOGD("terminated by signal (%d)\n", sig);ua_stop_all(false);
}static void ua_exit_handler(void *arg)
{(void)arg;LOGD("ua exited -- stopping main runloop\n");re_cancel();
}static const char *ua_event_reg_str(enum ua_event ev)
{switch (ev) {case UA_EVENT_REGISTERING: return "registering";case UA_EVENT_REGISTER_OK: return "registered";case UA_EVENT_REGISTER_FAIL: return "registering failed";case UA_EVENT_UNREGISTERING: return "unregistering";default: return "?";}
}static void ua_event_handler(struct ua *ua, enum ua_event ev,struct call *call, const char *prm, void *arg)
{char event_buf[256];char ua_buf[32];char call_buf[32];int len;struct player *player = baresip_player();LOGD("ua event (%s) %s\n", uag_event_str(ev), prm);switch (ev) {case UA_EVENT_REGISTERING:case UA_EVENT_UNREGISTERING:case UA_EVENT_REGISTER_OK:len = re_snprintf(event_buf, sizeof event_buf, "%s", ua_event_reg_str(ev));break;case UA_EVENT_REGISTER_FAIL:len = re_snprintf(event_buf, sizeof event_buf, "registering failed,%s", prm);break;case UA_EVENT_CALL_INCOMING:
// if (list_count(ua_calls(ua)) > 1) {
// play = mem_deref(play);
// (void)play_file(&play, player, "callwaiting.wav", 3);
// }len = re_snprintf(event_buf, sizeof event_buf, "%s", "call incoming");break;case UA_EVENT_CALL_RINGING:// play = mem_deref(play);// (void)play_file(&play, player, "ringback.wav", -1);len = re_snprintf(event_buf, sizeof event_buf, "%s", "call ringing");break;case UA_EVENT_CALL_PROGRESS:len = re_snprintf(event_buf, sizeof event_buf, "%s", "call progress");break;case UA_EVENT_CALL_ESTABLISHED:// play = mem_deref(play);len = re_snprintf(event_buf, sizeof event_buf, "%s", "call established");break;case UA_EVENT_CALL_MENC:if (prm[0] == '0')len = re_snprintf(event_buf, sizeof event_buf, "call secure");else if (prm[0] == '1')len = re_snprintf(event_buf, sizeof event_buf, "call verify,%s", prm+2);else if (prm[0] == '2')len = re_snprintf(event_buf, sizeof event_buf, "call verified,%s", prm+2);elselen = re_snprintf(event_buf, sizeof event_buf, "%s", "unknown menc event");break;case UA_EVENT_CALL_TRANSFER:len = re_snprintf(event_buf, sizeof event_buf, "call transfer,%s", prm);break;case UA_EVENT_CALL_TRANSFER_FAILED:len = re_snprintf(event_buf, sizeof event_buf, "transfer failed,%s", prm);break;case UA_EVENT_CALL_CLOSED:
// play = mem_deref(play);
// if (call_scode(call)) {
// const char *tone;
// tOne= translate_errorcode(call_scode(call));
// if (tone) {
// (void)play_file(&play, player, tone, 1);
// }
// }len = re_snprintf(event_buf, sizeof event_buf, "call closed,%s", prm);break;case UA_EVENT_MWI_NOTIFY:len = re_snprintf(event_buf, sizeof event_buf, "mwi notify,%s", prm);break;case UA_EVENT_AUDIO_ERROR:mem_deref(call);goto out;default:goto out;}if( ev== UA_EVENT_CALL_INCOMING){BaresipContext *x_ctx = (BaresipContext *)(arg);x_ctx->ua=ua;x_ctx->call=call;}out:return;
}#include
static int pfd[2];
static pthread_t loggingThread;static void *loggingFunction(void *arg) {ssize_t readSize;char buf[128];while((readSize = read(pfd[0], buf, sizeof buf - 1)) > 0) {if(buf[readSize - 1] == '\n') {--readSize;}buf[readSize] = 0;LOGE("22>%s", buf);}return 0;
}static int runLoggingThread() {setvbuf(stdout, 0, _IOLBF, 0);setvbuf(stderr, 0, _IONBF, 0);pipe(pfd);dup2(pfd[1], 1);dup2(pfd[1], 2);if (pthread_create(&loggingThread, 0, loggingFunction, 0) == -1) {return -1;}pthread_detach(loggingThread);return 0;
}extern "C" JNIEXPORT jstring JNICALL
Java_lilin_com_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */) {std::string hello = "Hello from C++1";return env->NewStringUTF(hello.c_str());
}
extern "C"
JNIEXPORT void JNICALL
Java_lilin_com_MainActivity_bareStart(JNIEnv *env, jobject instance) {int err;const char *path = "/data/data/lilin.com/files";runLoggingThread();memset(&g_ctx, 0, sizeof(g_ctx));err = libre_init();if (err)goto out;conf_path_set(path);log_enable_debug(true);err = conf_configure();if (err) {LOGD("conf_configure() failed: (%d)\n", err);goto out;}err = baresip_init(conf_config());if (err) {LOGD("baresip_init() failed (%d)\n", err);goto out;}play_set_path(baresip_player(), path);err = ua_init("baresip v", true, false, false);if (err) {LOGD("ua_init() failed (%d)\n", err);goto out;}uag_set_exit_handler(ua_exit_handler, NULL);uag_event_register(ua_event_handler, &g_ctx);err = conf_modules();if (err) {LOGE("conf_modules() failed (%d)\n", err);goto out;}LOGD("Running main loop\n");err = re_main(signal_handler);LOGD("Running main loo1p\n");out:if (err) {LOGE("stopping UAs due to error: (%d)\n", err);ua_stop_all(true);} else {LOGE("main loop exit\n");}LOGD("closing");ua_close();module_app_unload();conf_close();baresip_close();uag_event_unregister(ua_event_handler);LOGD("unloading modules ...");mod_close();libre_close();}extern "C"
JNIEXPORT void JNICALL
Java_lilin_com_MainActivity_bareStop(JNIEnv *env, jobject instance) {// TODO}
extern "C"
JNIEXPORT void JNICALL
Java_lilin_com_MainActivity_barejie(JNIEnv *env, jobject instance) {LOGE("jieting"); re_thread_enter();ua_answer( g_ctx.ua,g_ctx.call ); re_thread_leave();}

5.把https://github.com/alfredh/baresip/tree/master/docs/examples 配置文件拷过来 res/raw下面  并参考他项目改下config 主要是加载模块或者用他的也行


最后改下运行的build.gradle  只用了64的

externalNativeBuild {cmake {abiFilters 'arm64-v8a'}
}

 6.开始写方法

创建个copy资源的

public class LinphoneMiniUtils {public static void copyIfNotExist(Context context, int ressourceId, String target) throws IOException {File lFileToCopy = new File(target);if (!lFileToCopy.exists()) {copyFromPackage(context, ressourceId, lFileToCopy.getName());}}public static void copyFromPackage(Context context, int ressourceId, String target) throws IOException {FileOutputStream lOutputStream = context.openFileOutput (target, 0);InputStream lInputStream = context.getResources().openRawResource(ressourceId);int readByte;byte[] buff = new byte[8048];while (( readByte = lInputStream.read(buff)) != -1) {lOutputStream.write(buff,0, readByte);}lOutputStream.flush();lOutputStream.close();lInputStream.close();} }

7.把配置文件拷过去并启动baresip

 


8.将account配置文件添加一个sip账号格式参考原文件

 


9在添加一个按钮 为点击接听调下


barejie();


10.好了  如果没问题就可以跑了 选择一个桌面的sip软件 比如win10商店下载的linphone或者x-lite等等

 


启动后会先看到注册 200ok


桌面sip开始呼叫1003 点击接听就行了 说话双方都有声音了


视频通话请参考第二篇


更多参考https://github.com/juha-h/baresip-studio 和官方doc 写就ok了


更多交流群:261074724

 

 

 

 

 

 

 

 


推荐阅读
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 本文详细介绍了 Node.js 中 OS 模块的 arch 方法,包括其功能、语法、参数以及返回值,并提供了具体的使用示例。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中安装 Python 3.7 的步骤,包括编译工具的安装、Python 3.7 源码的下载与编译、软链接的创建以及常见错误的处理方法。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 吴石访谈:腾讯安全科恩实验室如何引领物联网安全研究
    腾讯安全科恩实验室曾两次成功破解特斯拉自动驾驶系统,并远程控制汽车,展示了其在汽车安全领域的强大实力。近日,该实验室负责人吴石接受了InfoQ的专访,详细介绍了团队未来的重点方向——物联网安全。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
author-avatar
少爷lianglian_414
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有