-
基于
linphone
实现视频通话的小结
p>
Linphone
解析
先看一下
linphone
的实现结构:
由上图可知,
Linphone
p>
内部有明显的用户接口和内核引擎区分,这为我们基于它提供的
接口
进行再次开发提供了可能。其中
liblinphone
是内核
的核心,这个库提供了
linphone
功
能的所有应用。
Liblinphone
库是一个功能巨大
的
SIPVOIPVIDEO
SDK.
我们可以用它提供的
功能在我们想要的应用上开发视频通话功能。
< br>
Liblinphone
库的结构包括:
< br>mediastreamer2
,用于音视频流处理的多媒体
SDK
;
oRTP
,网络协议库;
eXosip2
,
SIP
用户代理库。文档查看:
/nongnu/lin
phone/docs/liblinphone/
遗留问题:
关于操作系统底层的硬件接口结构不清楚,
如何为
C
语言程序提供
JAV
A
接口,
ANDROID
的
NDK
原理不清楚。
Linphone
代码
java
层的大致结构是这样的:
主
activity
为
linphoneActivity,
它总领着其他
的程序块。
linphoneService
做
linphone
在后台需要做的事,因此会有许多
监听器,比如监听来电。
linphoneManager<
/p>
是
linphone
操作包,它的函数能
实现初始化以及各类情况的实现。
linphoneCore
封装了
C
语言通信编码实现,环境变量
初始化等功能。
DailerActivity
管理打接电话。
用户点
击
linphone
的图标后就开始了
linphone
软件,
这时
linp
honeActivity
开始运行,
它
使
linphoneService
开始,并做一些
linphone
帐号密码的登录操作同时引导用户进行环境变
量的设置(
LinphonePreferencesActivity
)
。
环境变
量都储存在
sharedPreferences
中,
它是整个工程共享的一个变量池。
这些环境变量有
音频和视频编码设置选择,帐号密码,服务器设置,自动启动,视频设置,回音校正,网络
协议设置。
当
linphone
Service
开始的时候它运行
ndStart->linp
honeManager
开始实例化,
设置电话铃音以及配置信
息的保存路径,
依据工程的环境变量以及配置信息初
始化
LinphoneCore
,设置
Playb
ackGain
,周期性地检测核对
Sip
数据,设置网络协议和相应
的端口,根据
CPU
速度以及机型计算能为用户提供的编解码方式,计算能否回音校正,传
递账
户服务器信息到
LInphoneCore
中,得到网络连接操
作对象和连接信息
Info
并告知
LI
nphoneCore
。
public synchronized static final
LinphoneManager createAndStart(
Context c, LinphoneServiceListener
listener) {
if (instance != null)
throw new RuntimeException(
instance = new
LinphoneManager(c);
eListener =
listener;
ibLinphone(c);
return instance;
}
//From LinphoneManager
private synchronized void
startLibLinphone(final Context context) {
try {
copyAssetsFromPackage(context);
mLc =
ce().createLinphoneCore(
this,
linphoneConfigFile, linphoneInitialConfigFile,
null);
Ipv6(lean(getString(_ipv6_key),
false));
pSecretsCache(basePath+
ybackGain(3);
g(null);
tCA(linphoneRootCaFile);
try {
initFromConf(context);
}
catch (LinphoneException e) {
Log.w(
}
TimerTask lTask = new TimerTask() {
@Override
public void
run() {
e();
}
};
leAtFixedRate(lTask, 0, 100);
IntentFilter
lFilter = new IntentFilter(_SCREEN_ON);
ion(_SCREEN_OFF);
erReceiver(mKeepAliveReceiver,
lFilter);
}
catch
(Exception e) {
Log.e(e,
}
}
//From LinphoneManager
public void
initFromConf(Context context) throws
LinphoneConfigException {
//traces
boolean lIsDebug =
lean(getString(_debug_key), false);
ce().setDebugMode(lIsDebug);
if (initialTransports ==
null)
initialTransports =
nalingTransportPorts();
set
SignalingTransportsFromConfiguration(initialTransp
orts);
try {
// Configure
audio codecs
//
enableDisableAudioCodec(
enableDisableAudioCodec(
enableDisableAudioCodec(
enableDisableAudioCodec(
enableDisableAudioCodec(
enableDisableAudioCodec(
enableDisableAudioCodec(
enableDisableAudioCodec(
enableDisableAudioCodec(
// Configure video codecs
for
(PayloadType videoCodec : eoCodecs()) {
enableDisableVideoCodecs(videoCodec);
}
Ech
oCancellation(lean(getString(_echo_cancellation_ke
y),fa
lse));
}
catch (LinphoneCoreException e) {
throw new
LinphoneConfigException(getString(_settings),e);
}
boolean isVideoEnabled =
isVideoEnabled();
Video(isVideoEnabled,
isVideoEnabled);
//1
read proxy config from preferences
String lUserName =
ing(getString(_username_key), null);
if (lUserName == null || ()==0) {
throw new
LinphoneConfigException(getString(_username));
}
String lPasswd
= ing(getString(_passwd_key), null);
if (lPasswd == null || ()==0) {
throw new LinphoneConfigException(getSt
ring(_passwd));
}
String lDomain =
ing(getString(_domain_key), null);
if (lDomain == null || ()==0) {
throw new LinphoneConfigException(getSt
ring(_domain));
}
String lStun =
ing(getString(_stun_server_key), null);
//stun server
nServer(lStun);
ewallPolicy((lStun!=null
&&
()>0)
?
n
:
wall);
//auth
uthInfos();
LinphoneAuthInfo
lAuthInfo
ce().createAuthInfo(lUserName,
lPasswd,null);
hInfo(lAuthInfo);
//proxy
roxyConfigs();
String lProxy =
ing(getString(_proxy_key),null);
if (lProxy == null || () == 0) {
lProxy =
}
if
(!With(
lProxy =
}
//get Default proxy if any
LinphoneProxyConfig lDefaultProxyConfig
= aultProxyConfig();
String
lIdentity =
try {
if
(lDefaultProxyConfig == null) {
lDefaultProxyConfig
ce().createProxyConfig(lIdentity,
lProxy, null,true);
xyConfig(lDefaultProxyConfig);
aultProxyConfig(lDefaultProxyConfig);
} else {
();
ntity(lIdentity);
xy(lProxy);
Register(true);
();
}
lDefaultProxyConfig =
aultProxyConfig();
=
=
-
-
-
-
-
-
-
-
-
上一篇:Hadoop原理详细解析
下一篇:liblinphone实现电话拨打及接听