之前做voip的voice prompt功能时,两台话机建立通话后,其中一台话机给另一台话机播放语音提示, 类似呼叫中心的性质。但对方听到的语音给人的感觉断断续续,不如通过播放工具听起来圆润。 通过Wireshark 抓取数据然后直接播放,声音质量也是非常好,那问题到底出在哪里呢。

通过Wireshark抓取的数据进行分析,每个rtp包之间的时间间隔大于20ms,这也就是我们所说的p-time。正常语音通话时p-time都是20ms,误差很小。

说到这个p-time,就不的不说说RTP的数据采用,一般来说10ms 对应80bytes,20ms对应 160bytes,30ms对于240bytes,40ms对于320bytes,当然这是说的净荷,整个rtp包的话还要加上12bytes的header。

以G711A编码的音频包如果以20ms打包,那么每个包有160个采样点(采样频率为8KHZ,那么每毫秒的采样个数为8个,因此20ms即为160个),这同样体现在时戳,如下图,两个包之间的时戳间隔为160。

时间戳(timestamp):反映着个包第一个比特的采样时刻,且后面每个包时戳值呈线性增长,一个公式就是 timestamp = timestamp + (80 * (readDelay/10)); //readdelay为采样时间。

言归正传:下面来说说如何解决这个p-time的问题。我们在应用层单独向far-end发送rtp的话,就需要精确这个延迟时间,对于之前使用的usleep(),通过实验是远远不行的,误差太大,20ms的延迟会多出来4ms这严重导致声音断续。下面就介绍一种更好的方法。

    select

对就是这个万能的select。使用方法:

struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = readDelay*1000; //精确到的毫秒数
ret = select (0, NULL, NULL, NULL, &tv);
if (-1 == ret)
{
    printf("select error\n");

}

当ret返回0时,便表示超时时间到,那咱就可以将打包后的数据一股脑儿的发到far-end。

这时在使用Wireshark看看,p-time误差很小很小了,在听听声音质量,嗯,very good。

结束语:使用 select 来做延迟好处很多,不多说了。Linux下做毫秒级别的延迟用select非常好,其他平台还需测试。

附:参考网上一篇关于sleep,usleep,nanosleep,select的精度测试

RTP采样 p-Time Linux平台毫秒级别的延迟方法【原创】相关推荐

  1. Linux平台下卸载MySQL的方法

    转载自: https://www.cnblogs.com/taomylife/p/7234925.html Linux平台下卸载MySQL的方法: MySQL的安装主要有三种方式:二进制包安装.RPM ...

  2. linux mplayer 编译,linux平台mplayer的编译安装方法

    安装前请检查Linux系统中是否已经安装了以下四个包,缺一不可: gtk2-devel(版本任意) glib2-devel(版本任意) libpng(版本任意) libpng-devel(版本任意) ...

  3. linux搭建jenkins环境变量,在Linux系统中安装Jenkins的方法(原创)-1

    Jenkins安装手册 一.前期准备工作 因为我是在Windows系统下载的安装包上传到Linux系统,所以需要用到两个工具---putty和FileZilla.GXV7^I~y7Tb0 Putty是 ...

  4. 三.Linux平台安装MongoDB

    Linux平台安装MongoDB 1.配置方法 安装(使用yum源安装) 在/etc/yum.repos.d 创建一个mongodb-org.repo源文件 vi /etc/yum.repos.d/m ...

  5. Linux平台彻底卸载MySQL总结

    如何在Linux下卸载MySQL数据库呢? 下面总结.整理了一下Linux平台下卸载MySQL的方法. MySQL的安装主要有三种方式:二进制包安装(Using Generic Binaries).R ...

  6. Linux平台卸载MySQL总结

    如何在Linux下卸载MySQL数据库呢? 下面总结.整理了一下Linux平台下卸载MySQL的方法. MySQL的安装主要有三种方式:二进制包安装(Using Generic Binaries).R ...

  7. 【转】Redis安装整理(window平台和Linux平台)

    原文连接:http://zheng12tian.iteye.com/blog/1471726 原文作者:zheng12tian 转载注明以上信息! window平台Redis安装 redis wind ...

  8. Redis安装整理(window平台和Linux平台)

    window平台Redis安装 redis windows安装文件下载地址: http://code.google.com/p/servicestack/wiki/RedisWindowsDownlo ...

  9. MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接

    MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接 <一,>MongoDB 简介篇Ruiy; MongoDB是一个高性能,开源,无模式 ...

最新文章

  1. mybatis mysql crud_Mybatis的CRUD操作
  2. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )
  3. 一起学nRF51xx 12 -  flash
  4. ie里的button标签的一个bug
  5. LiveVideoStack秋季招聘(编辑、会务运营、项目经理)
  6. 转:精通JS正则表达式
  7. Android.View.InflateException: Binary XML File Line #异常的解决
  8. 创意设计师变圆周率为彩色艺术品
  9. 虽然现在用APACHE COMMONS DBCP可以非常方便的建立数据库连接池,
  10. SVM多分类原理学习
  11. 关于无线网卡驱动安装正确,但灯不亮的问题
  12. python中水量_Python居然还能用于巨大的工程项目!比如三峡发电量估算系统!
  13. html 显示闹钟,闹钟设置.html
  14. c语言结构体编程时钟,c语言简单数学时钟(结构体,指针),求大佬帮助
  15. 腾讯VS华为:2021“渠道战争”第一枪
  16. 爬虫实战 链家房源爬取(BeautifulSoup) 详细分析 2020最新
  17. 以平静的心接受与自己意愿相违背的事
  18. 与心态相关的写作储备
  19. 【闲聊】人生如梦,一樽还酹江月
  20. Spring Security oauth2.0微信小程序登录

热门文章

  1. Android,UbuntuCore,ROS;TuringOS,iBotOS,ROOBO
  2. 为什么中国学生会越学越呆?
  3. 4月1日起 理想ONE零售价由33.8万元上调至34.98万元
  4. iPhone 14 Pro外观细节曝光:打孔屏加持 支持新一代的LTPO技术
  5. 曾365天排队,如今被嫌弃!火了13年的网红鼻祖,要过气了吗?
  6. 三星:计划将UTG可折叠面板对外出售
  7. 疑似小米平板5通过3C认证:搭载8720mah双电芯方案
  8. 坚决拥护苹果!三星Galaxy S21系列发布:多支笔,充电器耳机却没了
  9. 腾讯Techo Park开发者大会召开在即,全球200多位专家共话云计算
  10. 趁618买iPhone 11还是等iPhone 12?李楠有话要说