http://www.rosoo.net/a/201101/10776.html

http://hi.baidu.com/fairygardenjoy/blog/item/e56c5cca95829e37b600c88e.html

H264关于RTP协议的实现:http://www.rosoo.net/a/201108/14896.html

RTP协议包头的格式:

10~16 Bit为PT域,指的就是负载类型(PayLoad),负载类型定义了RTP负载的格式,协议原文说该域由具体应用决定其解释。

目前,负载类型主要用来告诉接收端(或者播放器)传输的是哪种类型的媒体(例如G.729,H.264,MPEG-4等),这样接收端(或者播放器)才知道了数据流的格式,才会调用适当的编解码器去解码或者播放,这就是负载类型的主要作用。

就ORTP库而言,负载类型定义如下:

每一种负载类型都有着其独特的参数,这里基本上涵盖了当前主流的一些媒体类型,例如pcmu 、g.729、h.263(很奇怪,竟然没有定义h.264)、mpeg-4等等。Jrtplib库应该也有相类似的定义,你可以去找找源码,在此我就不再赘述了。

在ORTP库和JRTplib库中,都提供了设置RTP负载类型的函数,千万要记得根据实际的应用进行设置,我就是当时没有注意,使用ORTP默认的pcmu音频的负载类型,传输H.264编码的视频数据,结果传输中一直有问题,困扰我好久好久。

好了,再说说RTP的时间戳吧。

基本概念:

时间戳单位:时间戳计算的单位不是秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是为了是时间戳单位更为精准。比如说一个音频的采样频率为8000Hz,那么我们可以把时间戳单位设为1 / 8000。

时间戳增量:相邻两个RTP包之间的时间差(以时间戳单位为基准)。

采样频率: 每秒钟抽取样本的次数,例如音频的采样率一般为8000Hz

帧率: 每秒传输或者显示帧数,例如25f/s

再看看RTP时间戳课本中的定义:

RTP包头的第2个32Bit即为RTP包的时间戳,Time Stamp ,占32位。

时间戳反映了RTP分组中的数据的第一个字节的采样时刻。在一次会话开始时的时间戳初值也是随机选择的。即使是没有信号发送时,时间戳的数值也要随时间不断的增加。接收端使用时间戳可准确知道应当在什么时间还原哪一个数据块,从而消除传输中的抖动。时间戳还可用来使视频应用中声音和图像同步。

在RTP协议中并没有规定时间戳的粒度,这取决于有效载荷的类型。因此RTP的时间戳又称为媒体时间戳,以强调这种时间戳的粒度取决于信号的类型。例如,对于8kHz采样的话音信号,若每隔20ms构成一个数据块,则一个数据块中包含有160个样本(0.02×8000=160)。因此每发送一个RTP分组,其时间戳的值就增加160。

官方的解释看懂没?没看懂?没关系,我刚开始也没看懂,那就听我的解释吧。

首先,时间戳就是一个值,用来反映某个数据块的产生(采集)时间点的,后采集的数据块的时间戳肯定是大于先采集的数据块的。有了这样一个时间戳,就可以标记数据块的先后顺序。

第二,在实时流传输中,数据采集后立刻传递到RTP模块进行发送,那么,其实,数据块的采集时间戳就直接作为RTP包的时间戳。

第三,如果用RTP来传输固定的文件,则这个时间戳就是读文件的时间点,依次递增。这个不再我们当前的讨论范围内,暂时不考虑。

第四,时间戳的单位采用的是采样频率的倒数,例如采样频率为8000Hz时,时间戳的单位为1 / 8000 ,在Jrtplib库中,有设置时间戳单位的函数接口,而ORTP库中根据负载类型直接给定了时间戳的单位(音频负载1/8000,视频负载1/90000)

第五,时间戳增量是指两个RTP包之间的时间间隔,详细点说,就是发送第二个RTP包相距发送第一个RTP包时的时间间隔(单位是时间戳单位)。

如果采样频率为90000Hz,则由上面讨论可知,时间戳单位为1/90000,我们就假设1s钟被划分了90000个时间块,那么,如果每秒发送25帧,那么,每一个帧的发送占多少个时间块呢?当然是 90000/25 = 3600。因此,我们根据定义“时间戳增量是发送第二个RTP包相距发送第一个RTP包时的时间间隔”,故时间戳增量应该为3600。

在Jrtplib中好像不需要自己管理时间戳的递增,由库内部管理。但在ORTP中每次数据的发送都需要自己传入时间戳的值,即自己需要每次发完一个RTP包后,累加时间戳增量,不是很方便,这就需要自己对RTP的时间戳有比较深刻地理解,我刚开始就是因为没搞清楚,随时设置时间戳增量导致传输一直有问题,困扰我好久。

===========================================================================

在使用JRTPLIB的发送数据的时候需要设置时间戳单位(timestamp)和时间戳增量(timestampincrement)。看了网上一些文章,细细想来现在才想通这个问题。   
          RFC3550对时间戳的描述是:

时间戳(timestamp) 32比特 时间戳反映了RTP数据包中第一个字节的采样时间。(采样时钟必须来源于一个及时的单调、线性递增时钟,以便允许同步和去除网络引起的数据包抖动(见章节6.4.1)。该时钟的分辨率必须满足理想的同步精度和测量数据包到来时的抖动的需要(一种典型的时钟分辨率不满足情况是每个视频帧仅一个时钟周期)时钟频率依赖于负载数据的格式,并在描述文件(profile)中或者是在负载格式描述中(payload format speci_cation)进行静态描述。也可以通过非RTP方法(non-RTP means)对负载格式动态描述。

如果RTP包是周期性产生的,那么将使用由采样时钟决定的名义上的采样时刻,而不是读取系统时间。例如,对一个固定速率的音频,采样时钟(时间戳时钟)将在每个周期内增加1。如果一个音频从输入设备中读取含有160个采样周期的块,那么对每个块,时间戳的值增加160,而不考虑该块是否用一个包传递或是被丢弃。

时间戳的初始值应当是随机的,就像序号一样。几个连续的RTP包如果(逻辑上)是同时产生的,如:属于同一个视频帧的RTP包,将有相同的序列号。如果数据并不是以它采样的顺序进行传输,那么连续的RTP包可以包含不是单调递增(或递减)的时间戳(RTP包的序列号仍然是单调变化的)。

根据一些文章我自己推敲了一下几个概念如下:   
       时间戳单位:时间戳计算的单位不为秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是为了是时间戳单位更为精准。比如说一个音频的采样频率为8000HZ,那么我们可以把时间戳单位设为1/8000。
       时间戳增量:相邻两个RTP包之间的时间差(以时间戳单位为基准)。

如何设定时间戳之间的增量呢?
       按照刚才时间戳单位来看,1秒钟按照时间戳单位就是8000,那么一秒钟如果可以播放20帧,也就是发送30帧(帧率),那么可以求出相邻两帧之间的时间差,也就是时间戳增量,那么显而易见是用8000/20,那么这个时间戳增量就为400.
       网上大多数列举的一个例子是:例如MPEG,每帧20ms,采样频率8000Hz,设定时间戳单位1/8000,而每个包之间就是160的增量
    这里又该如何理解呢?可以轻易地看出增量是直接8000与20ms相乘的结果,我们可以知道这里两帧之间的时间为20ms,也就是0.02s,这个单位是以秒来衡量的,那么我们要用时间戳单位来表示那么就是8000*0.02=160.所以时间戳增量为160.

还有一点为什么一般都用90000作为视频采样频率呢?
        90k是用于视频同步的时间尺度(TimeScale),就是每秒90k个时钟tick。为什么采用90k呢?目前视频的帧速率主要有25fps、29.97fps、30fps等,而90k刚好是它们的倍数,所以就采用了90k。

关于RTP时间戳及多媒体通信同步的问题/H264关于RTP协议的实现相关推荐

  1. ffmpeg rtp时间戳

    ffmpeg rtp时间戳 ffmpeg  c  一.介绍 在ffmpeg中,每帧都会存在一个pts用来表示该帧图像在视频流中的位置.而在多路流(比如视频.音频)时,往往需要进行多媒体的同步,使得画面 ...

  2. RTP 时间戳的处理

    原文:http://general.blog.51cto.com/927298/328220 RTP 时间戳的处理 时间戳字段是RTP首部中说明数据包时间的同步信息,是数据能以正 确的时间顺序恢复的关 ...

  3. H264关于RTP协议的实现

    完整的C/S架构的基于RTP/RTCP的H.264视频传输方案.此方案中,在服务器端和客户端分别进行了功能模块设计.服务器端:RTP封装模块主要是对H.264码流进行打包封装:RTCP分析模块负责产牛 ...

  4. H264 over RTP 的打包

    多媒体实时通信(如语音或视频通话)一般会使用RTP/UDP进行传输,本文对H264视频在RTP传输的数据格式进行总结,RFC6184 <RTP Payload Format for H.264 ...

  5. h265、h264的RTP包封装区别

    h265.h264的RTP包封装区别 一.NAL单元 1.h264 NAL单元 /** h264 nal头部(1字节)* 0 1 2 3 4 5 6 7* +-+-+-+-+-+-+-+-+-+-+- ...

  6. 采样率,码率,帧率,I 帧,P 帧,B帧,RTP时间戳

    采样率: 每秒钟抽取样本的次数,例如音频的采样率一般为8000Hz:视频 90000 hz 码率: 单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒. 码率 = 采样率 * 采样大小 * ...

  7. 按照RFC3984协议实现H264视频RTP打包(附源代码)

    2011-03-30 10:34:44|  分类: 流媒体 |  标签: |字号大中小 订阅 参考链接:http://topic.csdn.net/u/20090725/11/5FBC75B0-109 ...

  8. H264 over RTP中存在多个SPS、PPS、[SEI]、 IDR序列是否都需要

    这一段从三光吊舱接收数据时,因为对方外协了一个转换盒子,将同步422出来的h264编码的数据转成了RTP进行发送.我们能拿到的就是这个RTP数据.使用wireshark抓了一堆包,然后使用rtp_h2 ...

  9. 关于H264通过RTP传输的打包方式

    Q:现在小弟初次尝试H264的编码通过RTP方式传输,具体实验环境的问题如下: 环境: 服务器端,H264的帧数据(可能超过64k),分成N个1460字节的包,然后加上RTP头发送. 客户端,VLC播 ...

最新文章

  1. Arch Linux PDF格式文件无法显示中文
  2. 怎么用python统计字数_使用Python 统计高频字数的方法
  3. angular代码分析之异常日志设计
  4. 三校生计算机模拟试题1,甘肃省2015年“三校生”考试摸拟试题1
  5. fastdfs 测试客户端_分布式文件服务 FastDFS (第一篇)
  6. SQL性能优化应该考虑哪些?
  7. JavaFX官方教程(五)之在JavaFX中创建表单
  8. 《MySQL——基于位点orGTID的主备切换协议》
  9. 面向小姐姐的编程——JAVA面向对象之封装(二)
  10. 枚举类型的定义和应用
  11. 工程测量(地形图测量)
  12. libmodbus 开发说明
  13. level shifter和isolation cell如何摆放
  14. 艺术论文题目汇总大全
  15. 计算机视觉教程2-6:八大图像特效算法制作你的专属滤镜(附Python代码)
  16. 广西移动摇一摇送话费_跟大家分享一个今天碰见的中国移动中奖坑钱套路
  17. 【海康威视】相关名词术语产品注解
  18. 【jzoj4597】【现世斩】【平衡树】【set】
  19. mysql数据类型、字段类型
  20. 学校计算机班班通维护保养记录,班班通计算机教室管理制度..doc

热门文章

  1. Kubernetes容器上下文环境
  2. 通过ProGet搭建一个内部的Nuget服务器
  3. 3.cocos2dx它Menu,由menu为了实现场景切换
  4. 基于visual Studio2013解决面试题之0807strstr函数
  5. 【NOIP2011 Day 2】观光公交
  6. 添加右键用Sublime Text3 打开文件和文件夹
  7. 企业级rancher搭建Kubernetes(采用rancher管理平台搭建k8s)
  8. bzoj1231 [Usaco2008 Nov]mixup2 混乱的奶牛——状压DP
  9. 【开源程序(C++)】获取bing图片并自动设置为电脑桌面背景
  10. iOS微博项目(七)发微博和定位