剑痴乎

  • 首页
  • 文章分类
    • 音视频
    • WebRTC
    • 编程之美
    • Linux
    • Windows
    • 生活点滴
    • 校园生活
  • 参考
    • API参考
    • 实用工具
    • 测试音视频
    • 文档
  • 留言板
  • 关于
剑痴乎
代码为剑,如痴如醉
  1. 首页
  2. WebRTC
  3. 正文

WebRTC研究:DelayBasedBwe中绝对发送时间转换

2020年5月3日 2096点热度 5人点赞 2条评论

之前有个网友问基于时延的带宽预测代码中如下时间转换什么含义:

C++
1
2
3
4
5
6
7
8
9
  uint32_t send_time_24bits =
      static_cast<uint32_t>(
          ((static_cast<uint64_t>(packet_feedback.sent_packet.send_time.ms())
            << kAbsSendTimeFraction) +
           500) /
          1000) &
      0x00FFFFFF;
 
  uint32_t timestamp = send_time_24bits << kAbsSendTimeInterArrivalUpshift;

那时因为工作比较忙,没去细看,没回答上。最近重新看了下这个问题,我想现在应该能回答上了(现在看起来其实很简单)。所以本文分析下如上时间转换代码为什么这么写。

绝对发送时间

在WebRTC使用绝对发送时间(Absolute Send Time)记录RTP包发送出去的时间。在GCC拥塞控制中的带宽预测,通过这个发送时间,以及包接收时间,计算带宽增长趋势。在基于接收端的带宽预测中,会在RTP包报头扩展中记录这个发送时间,从而在接收端进行带宽预测计算。在基于发送端的带宽预测中,这个发送时间由发送端另外记录。

WebRTC中使用3字节标识这个绝对发送时间,单位为秒。其中使用6bit标识整数部分,18bit标识小数部分。

保留N位小数

这里我们讲下如何进行N位小数的保留,知道后前面的代码就非常easy了。

假设我们有一个十进制数256.2562要处理,但是程序中某函数小数点取值范围只有0~100,也就是0~10^2,所以我们要对256.256进行保留小数点后两位的处理。一般这么处理:(256.2562x10^2+0.5)/10^2=256.26,+0.5操作是为了对保留的最后一位小数进行四舍五入。

代码导读

看完前面我想代码就很好理解了,只不过现在换成处理二进制数了,这里再贴下代码:

C++
1
2
3
4
5
6
7
8
9
10
11
void DelayBasedBwe::IncomingPacketFeedback() {
  uint32_t send_time_24bits =
      static_cast<uint32_t>(
          ((static_cast<uint64_t>(packet_feedback.sent_packet.send_time.ms())
            << kAbsSendTimeFraction) +
           500) /
          1000) &
      0x00FFFFFF;
 
  uint32_t timestamp = send_time_24bits << kAbsSendTimeInterArrivalUpshift;
}

  • 首先获取以ms为单位的发送时间send_time.ms,大小为64bit
  • 左移kAbsSendTimeFraction(18)bit,也就是乘以2^18,因为绝对发送时间使用18bit标识小数部分,所以需要进行小数点后有效数字的保留
  • 除以1000将时间单位转换为s,加500是为了四舍五入操作
  • 接着&0x00FFFFFF得到后24bit时间值
  • send_time_24bits左移kAbsSendTimeInterArrivalUpshift(8bit),得到32bit大小的发送时间timestamp

是不是很简单,其实就是个简单的数学处理。所以为了学好WebRTC很多基本的数学处理还是不能忘的。

本文已收录到大话WebRTC专栏,更多精彩请访问《大话WebRTC》。

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
标签: WebRTC
最后更新:2022年3月27日

Jeff

管理员——代码为剑,如痴如醉

点赞
< 上一篇
下一篇 >

文章评论

  • 于吉太

    先评论再看

    2020年5月5日
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据。

    版权声明

    为支持原创,创作更好的文章,未经许可,禁止任何形式的转载与抄袭,如需转载请邮件私信!本人保留所有法定权利。违者必究!

    文章目录
    • 绝对发送时间
    • 保留N位小数
    • 代码导读
    近期评论
    • ouyang on WebRTC研究:RTP报头扩展假如放中间是否有歧义了,例如我中间说2个…
    • Artificial intelligence creates content for the site, no worse than a copywriter, you can also use it to write articles. 100% uniqueness :). Click Here: https://bit.ly/3iPPltW?h=70a8a6efa38594c078497e06bfe05726& on WebRTC研究:基于Transport Feedback的早期丢包检测upn6859h
    • yy on WebRTC研究:Trendline滤波器-TrendlineEstimator我也有这个问题,不理解。
    • Unreal on WebRTC研究:统计参数之往返时延非常不准
    • huowa222 on WebRTC研究:FEC之RED封装rtp header 有 pt 字段
    相关文章
    • WebRTC研究:统计参数之丢包率
    • WebRTC研究:基于Transport Feedback的早期丢包检测
    • Continue,2022,加油
    • WebRTC研究:记一次音频带宽估计引入的异常分析
    • WebRTC研究:Encoded Transform

    COPYRIGHT © 2022 jianchihu.net. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang