我关注这个问题是从视频的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。

linphone 智能带宽分配相关推荐

  1. 复杂人机智能系统功能分配方法综述

    本文来源:人机与认知实验室 摘要:功能分配是复杂人机智能系统设计进程中的重要内容, 它需要应用系统的分析方法, 合理地进行人.机两者的任务分配和科学地设计两者的功能结合.本文分析了国内外功能分配的研究 ...

  2. Max-Min Fairness带宽分配算法

    最近再写一个网络仿真器,里面参考了Max-MinFairness算法,这是一种比较理想.公平的带宽分配算法.其思路主要如下:首先是算法的准备,考察某一时刻的网络中所有的flow,由于每条flow都有其 ...

  3. BAP:PPP 带宽分配协议 BACP:PPP 带宽分配控制协议--网络大典

    带宽分配协议(BAP)通过多重链路方式对所有链接进行动态管理.BAP 提供了多重链路上的添加和终止个人链路数据报调整机制,同时也指定在多重链路连接期间由哪种对等结构负责管理带宽的各种决定.BACP 是 ...

  4. 基于算力网络的大数据计算资源智能调度分配方法

    摘要 [目的]进入算力时代以来,伴随泛在接入.万物互联,全社会数据量迎来爆发式增长.需要通过算力网络解决大数据计算资源不足.异构算力不足.边缘算力不足等问题.[方法]基于算力网络,重新设计大数据计算体 ...

  5. WebRTC的带宽分配(1): 流级别分配

    今天来聊一聊WebRTC的带宽分配(BWA,Bandwidth Allocation),带宽分配是将带宽估计(BWE,Bandwidth Estimation)的结果分配到不同的流上面. 因此带宽分配 ...

  6. 智能电源分配PDU应用

    随着1T行业对数据中心机房重视程度的不断提高,加强机柜微环境及电源计量.监控和管理是非常必要的. 数据中心机房设计供电.配电技术已经不断发展完善,UPS.智能PDU.监控管理系统.资产管理等产品已经成 ...

  7. WebRTC[52] - WebRTC 带宽分配逻辑详解

    目录 前言 正文 情况一.探测带宽为 0 情况二.0 < 探测带宽 < 音频和视频的

  8. 智能指针分配动态数组

    auto ptr_arr = std::make_shared<int[]>(); std::unique_ptr<int[]> up1(new int[10]()); //C ...

  9. 信息回传(backhaul)的信息率限制, 带宽分配限制

    摘自 Kalantari E, Bor-Yaliniz I, Yongacoglu A, et al. User association and bandwidth allocation for te ...

最新文章

  1. 把计算机网络关闭啦怎么打开,我在笔记本电脑里的“打开或关闭系统图标”中关闭了“网络系统图标”,哪么怎样做才能打开...
  2. evb测试板_做芯片 再“穷”不能“穷”测试
  3. php ajax sucess 失败,Ajax请求发送成功但不进success的解决方法(图文教程)
  4. HttpClient异常处理手册
  5. 使用sql2005的新特性分页的储存过程:Top,Row_Number
  6. 在一台物理服务器上搭建VSAN实验测试
  7. java对象描述开车_java面向对象
  8. CICD详解(二)——Jenkins持续集成原理
  9. Mac下的Homebrew安装与使用
  10. 《Nature-Inspired Metaheuristic Algorithms》——蝙蝠算法 Bat Algorithm
  11. linux mp4box安装,视频处理利器 MP4Box常用的12个命令
  12. 计算机图形学之二维平移旋转缩放代码
  13. 10张思维导图,全面讲解 Pandas
  14. python图像轮廓识别_Python+OpenCV图像处理(十六)—— 轮廓发现
  15. js 点击按钮打开浏览器新页签,兼容版
  16. Linux内存管理 之 KSM代码实现
  17. 枕头的高度影响颈椎健康
  18. c 汇编语言小程序100例,汇编语言小程序例子.doc
  19. Linux halt --停止系统运行,但不关闭电源
  20. HTTP状态码 详细解析汇总

热门文章

  1. win11玩游戏延迟_win11系统玩游戏卡顿性能提升小技巧
  2. 持续信创| 骞云科技与东方通完成产品兼容性互认证
  3. 四代增强 (BTE实例详解)
  4. 上传项目代码到Github|Gitee
  5. 软件测试——基础理论知识你都不一定看得懂
  6. Rstudio的安装操作
  7. FANUC机器人进行全部备份和镜像备份以及加载备份文件的具体操作(图文)
  8. 5.WEB及远程操作
  9. 网页性能测试工具大全
  10. 带省略号的比喻句_带有省略号的句子