一、前言
前一段时间完成了基于linphone实现音视频通话的项目,踩了很多坑,特此总结记录。
Linphone是一款开源基于SIP协议的语音视频电话软件,可移植到移动端Android、IOS、WindowsPhone8。
二、相关文档
- linehone官网 :http://www.linphone.org/technical-corner/liblinphone
- 官网文档:https://wiki.linphone.org/xwiki/wiki/public/view/Lib/Getting%20started/Android/
- 官方Android demo:https://gitlab.linphone.org/BC/public/linphone-android
- 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配合声音才好听