linphone 智能带宽分配

我关注这个问题是从视频的bitrate开始的,linphone-android 2.0版本的默认编码格式是VP8,在avprofile.c里定义了vp8的payload信息:

PayloadType payload_type_vp8={
TYPE( PAYLOAD_VIDEO),
CLOCK_RATE(90000),
BITS_PER_SAMPLE(0),
ZERO_PATTERN(NULL),
PATTERN_LENGTH(0),
NORMAL_BITRATE(256000),
MIME_TYPE ("VP8"),
CHANNELS(0)
};

写的很明白,bitrate是25600。但是在呼叫过程中,我却从打印信息里看到这么一段:

01-01 12:45:15.091: I/Linphone(11972): Limiting bitrate of video encoder to 458000 bits/s

01-01 12:45:15.091: I/Linphone(11972): bitrate requested...: 458000 (320 x 240)


bitrate变成了458000,这是怎么回事呢?跟踪代码分析发现,linphone在呼叫时会先检查当前网络带宽,然后计算音频传输所需要的带宽,最后将剩余带宽分配给视频传输。

代码流程如下:


1.开启linphone时,会初始化linphone 内核,调用:

->linphone_core_init(){

...

linphone_core_assign_payload_type(lc,&payload_type_vp8,103,NULL);

...

}

此时,vp8的payload被初始化,使用avprofile里定义的值,bitrate为256000;


2.发起呼叫时,会调用:

->linphone_core_invite_address_with_params()

->linphone_core_start_invite()

->sal_call_set_local_media_description()

->make_codec_list()

->linphone_core_check_payload_type_usability()

{
double codec_band;
int allowed_bw,video_bw;
bool_t ret=FALSE;


linphone_core_update_allocated_audio_bandwidth(lc); //计算音频传输所需带宽 audio_bw
allowed_bw=get_min_bandwidth(linphone_core_get_download_bandwidth(lc),
linphone_core_get_upload_bandwidth(lc)); //  获取当前可用带宽
if (allowed_bw==0) {
allowed_bw=-1;
video_bw=1500; /*around 1.5 Mbit/s*/
}else
video_bw=get_video_bandwidth(allowed_bw,lc->audio_bw); //计算视频可用带宽:(total - audio_bw-10)

switch (pt->type){
case PAYLOAD_AUDIO_CONTINUOUS:
case PAYLOAD_AUDIO_PACKETIZED:
codec_band=get_audio_payload_bandwidth(lc,pt);
ret=bandwidth_is_greater(allowed_bw*1000,codec_band);
/*hack to avoid using uwb codecs when having low bitrate and video*/
if (bandwidth_is_greater(199,allowed_bw)){
if (linphone_core_video_enabled(lc) && pt->clock_rate>16000){
ret=FALSE;
}
}
break;
case PAYLOAD_VIDEO:
if (video_bw>0){
pt->normal_bitrate=video_bw*1000; // 修改视频的payload 信息
ret=TRUE;
}
else ret=FALSE;
break;
}
return ret;
}

这个函数根据当前的网络带宽和音频传输带宽计算并修正了视频的bitrate,这就完了吗?还没有。


3.在电话被接听之后,会调用:

->linphone_call_start_video_stream()

->call->video_profile=make_profile()

{

...

if (desc->bandwidth>0) remote_bw=desc->bandwidth;
else if (md->bandwidth>0) {
/*case where b=AS is given globally, not per stream*/
remote_bw=md->bandwidth;
if (desc->type==SalVideo){
remote_bw=get_video_bandwidth(remote_bw,call->audio_bw);
}
}

...

bw=get_min_bandwidth(get_video_bandwidth(linphone_core_get_upload_bandwidth (lc),call->audio_bw),remote_bw);

if (bw>0) pt->normal_bitrate=bw*1000;

...

}

此处根据remote_bw,即呼叫对方的带宽,再次计算了音频和视频的传输带宽,修改了bitrate。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
用户点击 用户点击 linphone linphone linphone linphone 的图标后就开始了 的图标后就开始了 的图标后就开始了 的图标后就开始了 的图标后就开始了 linphone linphone linphone linphone 软件,这时 软件,这时 软件,这时 软件,这时 软件,这时 linphoneActivity linphoneActivity linphoneActivity linphoneActivity linphoneActivity linphoneActivity linphoneActivity开始运行,它 开始运行,它 开始运行,它 开始运行,它 使 linphoneService linphoneService linphoneService linphoneService linphoneServicelinphoneServicelinphoneService 开始,并做一些 开始,并做一些 开始,并做一些 开始,并做一些 linphone linphone linphone linphone 帐号密码的登录操作同时引导用户进行环境变 帐号密码的登录操作同时引导用户进行环境变 帐号密码的登录操作同时引导用户进行环境变 帐号密码的登录操作同时引导用户进行环境变 帐号密码的登录操作同时引导用户进行环境变 帐号密码的登录操作同时引导用户进行环境变 帐号密码的登录操作同时引导用户进行环境变 帐号密码的登录操作同时引导用户进行环境变 帐号密码的登录操作同时引导用户进行环境变 帐号密码的登录操作同时引导用户进行环境变 量的设置( 量的设置( LinphonePreferencesActivity LinphonePreferencesActivity LinphonePreferencesActivityLinphonePreferencesActivity LinphonePreferencesActivityLinphonePreferencesActivityLinphonePreferencesActivityLinphonePreferencesActivity LinphonePreferencesActivity LinphonePreferencesActivity LinphonePreferencesActivity LinphonePreferencesActivity)。 环境变量都储存在 环境变量都储存在 环境变量都储存在 环境变量都储存在 sharedPreferencessharedPreferences sharedPreferencessharedPreferences sharedPreferencessharedPreferencessharedPreferencessharedPreferences sharedPreferences 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 中,它是整个工程共享的一变量池。这些环境有 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自动启回校正网络 音频和视编码设置选择,帐号密服务器自
### 回答1: linphone 28181是一种开源的SIP(会话初始化协议)软电话应用程序。它支持语音通话、视频通话、即时消息传递和文件传输等功能。 linphone 28181的主要特点之一是它的开源性,这意味着任何人都可以自由地访问和修改其源代码。这种开放性使得linphone 28181具有了很强的可定制性和灵活性,可以根据个人的需求进行修改和定制。 linphone 28181使用SIP协议进行语音和视频通信,这是一种常用的互联网传输协议。它使得用户可以通过互联网进行语音和视频通话,无论他们身处何地。 linphone 28181还支持即时消息传递功能,这意味着用户可以通过应用程序进行实时的文本消息交流。这对于需要进行快速沟通的用户来说非常方便。 此外,linphone 28181还支持文件传输功能,用户可以通过应用程序传输文件,这对于需要共享文件的用户来说非常有用。 总之,linphone 28181是一款功能强大的开源SIP软电话应用程序,支持语音通话、视频通话、即时消息传递和文件传输等功能,具有很强的可定制性和灵活性。它可以使用户能够通过互联网进行语音和视频通信,并方便用户进行快速的消息交流和文件共享。 ### 回答2: Linphone 28181 是一种基于SIP协议的开源VoIP软件,用于实现语音通信功能。它可以在多个平台上运行,包括Windows、Mac OS、Linux、Android和iOS。Linphone 28181的主要功能包括:呼叫、接听和拒接通话、语音通话、实时文本传输和文件传输等。 Linphone 28181广泛应用于企业通信领域,尤其在IP电话系统中扮演重要角色。它可以与其他标准符合SIP协议的软件和硬件设备进行通信,实现企业内部和企业间的语音通信。此外,Linphone 28181还支持视频通话功能,使得用户可以通过视频电话与其他用户进行面对面的交流。 Linphone 28181还具有一些扩展功能,如来电显示、呼叫等待、会议通话和呼叫转移等。这些功能为用户提供了更为便捷和高效的通信方式。 总之,Linphone 28181是一款功能丰富、灵活性强的VoIP软件,它改变了传统的语音通信方式,使得用户可以通过互联网进行便捷、高质量的语音和视频通话。在今天信息化的背景下,Linphone 28181在企业通信中发挥了重要作用,为企业提供了高效、低成本的通信解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值