Android音视频通话——Linphone开发笔记总结

一、前言

前一段时间完成了基于linphone实现音视频通话的项目,踩了很多坑,特此总结记录。

Linphone是一款开源基于SIP协议的语音视频电话软件,可移植到移动端Android、IOS、WindowsPhone8。

二、相关文档

  1. linehone官网 :http://www.linphone.org/technical-corner/liblinphone
  2. 官网文档:https://wiki.linphone.org/xwiki/wiki/public/view/Lib/Getting%20started/Android/
  3. 官方Android demo:https://gitlab.linphone.org/BC/public/linphone-android
  4. android的各个版本的aar库:https://linphone.org/releases/maven_repository/org/linphone/linphone-sdk-android/

三、基本实现

首先引入依赖,可以直接下载aar包导入项目,或者使用gradle引入

在项目的build.gradle文件中,添加
注意,Android Studio Arctic Fox版本中添加第三方Maven仓库略有差异,Google又整这些骚操作

allprojects {
    repositories {
        google()
        jcenter()
        //linphone
        maven {
            url "https://linphone.org/releases/maven_repository/"
        }
    }
}

在model项目中的build.gradle文件,添加:

dependencies {
    //linphone
    debugImplementation "org.linphone:linphone-sdk-android-debug:5.0.0"
    releaseImplementation "org.linphone:linphone-sdk-android:5.0.0"
}

官方Demo有很详细的使用演示,这里只记录部分配置

CoreManager:CoreManager是sdk里面的管理类,在里面控制来电铃声和启动CoreService,无特殊需求不用调用。注意:启动来电铃声需要导入media包,否则不会有来电铃声(这里坑死我了)

dependencies {
    implementation 'androidx.media:media:1.2.0'
}

CoreService:CoreService是sdk里面的保活服务,在来电时会调用震动方法和启动通知,必须在AndroidManifest.xml里声明

        <service
            android:name="org.linphone.core.tools.service.CoreService"
            android:foregroundServiceType="phoneCall|camera|microphone"
            android:label="@string/app_name"
            android:stopWithTask="false" />

或者像官方demo那样继承CoreService自己实现

在登录之后,会默认保存用户信息,如果没有调用 core.clearProxyConfig()删除代理的话,下次启动后会自动登录之前保存的用户,所以如果不需要自动登录功能,需要退出app时删除代理。

其余的配置可对照官方Demo添加相应的功能,这个是我创建的只包含基础功能的项目:https://github.com/MattLjp/LinphoneCall

四、语音优化

对于部分设备可能存在啸叫、噪音的问题,可以修改assets/linphone_factory 文件下的语音参数。

agc=0 #这个是自动增益

###回声消除###

echocancellation=1 #回声消除这个必须=1,否则会听到自己说话的声音
ec_tail_len= 100 #尾长表示回声时长,越长需要cpu处理能力越强
ec_delay=0 #延时表示回声从话筒到扬声器时间,默认不写
ec_framesize=128 #采样数,肯定是刚好一个采样周期最好,默认不写

####回声抑制####
echolimiter=0 #这个不开会有空洞的声音,建议不开
el_type=mic #这个选full 和 mic 表示抑制哪个设备
eq_location=hp #这个表示均衡器用在哪个设备
speaker_agc_enabled=0 #这个表示是否启用扬声器增益
el_thres=0.001 #系统响应的阈值 意思在哪个阈值以上系统有响应处理
el_force=600 #控制收音范围 值越大收音越广 意思能否收到很远的背景音
el_sustain=50 #控制发声到沉默时间 用于控制声音是否拉长 意思说完一个字是否被拉长丢包时希望拉长避免断断续续

####降噪声####
noisegate=1 #这个表示开启降噪音,不开会有背景音
ng_thres=0.03 #这个表示声音这个阈值以上都可以通过,用于判断哪些是噪音
ng_floorgain=0.03 #这个表示低于阈值的声音进行增益,用于补偿声音太小被吃掉

####均衡器#### 这里就不详细描述这个更高级
eq_active=0
mic_eq_active=0
mic_eq_gains=300:0.1:100 700:0.2:250
spk_eq_active=0
spk_eq_gains=300:0.1:100 700:0.2:250

####网络抖动延时丢包####
[rtp]
audio_jitt_comp=160 #这个参数用于抖动处理,值越大处理抖动越好,但声音延时较大 理论值是80根据实际调整160
nortp_timeout=20 #这个参数用于丢包处理,值越小丢包越快声音不会断很长时间,同时要跟el_sustain配合声音才好听


版权声明:本文为weixin_42046829原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。