rtmp直播拉流客户端EasyRTMPClient设计过程中时间戳问题汇总
EasyRTMPClient 简介
EasyRTMPClient是EasyDarwin流媒体团队开发、提供的一套非常稳定、易用、支持重连接的RTMPClient工具,以SDK形式提供,接口调用非常简单。该EasyRTMPClient库未使用或参考现有的任何RTMP库,完全由EasyDarwin团队自主实现,因此,EasyRTMPClient更易于维护,稳定性、可扩展性得以提升,同时,本RTMP库全平台支持(包括windows/linux 32&64,ARM各平台,android, ios)!
相关连接
EasyRTMPClient调用示例地址:https://github.com/EasyDSS/EasyRTMPClient
由EasyDarwin团队推出的 RTMP协议教程:
谈谈RTMP时间戳的形式
RTMP时间戳基本概念
RTMP消息包一共分成三种类型。一类是命令(通知)消息,一类是音频消息,一类是视频消息。在实际开发过程中,我们主要关心的是音频和视频消息包的时间戳。RTMP消息分为块头和消息头,而RTMP消息包的时间戳主要存储于消息头域中的,用三个字节以大端序来存储,如果时间戳超过0xFFFFFF时,则将消息包域的时间戳域设成0xFFFFFF,然后在消息包域和负载之间会插入四节来表示时间戳,该四字节时间戳域通常称为扩展时间戳。
RTMP时间戳的形式
按adobe公司已公开的rtmp资料来看,rtmp消息包的时间戳主要有两种形式,一种称为递增模式,一种称为差值模式。
递增模式
此时间戳格式与flv文件tag的时间戳保持一致。即音频、视频时间戳基于同一个时钟来进行递增。
如:A0 -> V0 ->A1 -> A2 -> V1 ….
基于此种模块,它们的时间戳值一定满足:V1 >= A2 >= A1 >= V0 >= A0。通常,在打音频或视频时间戳时,可直接取系统时间戳即可。
差值模式
此时间戳格式,则较前一种有很大不同,主要区别是,音频和视频时间戳不在基于同一时钟来处理。无论音频还是视频消息包,每次打的时间戳都是相较于同一类消息包的前一条消息的时间戳的差值,或者可以将该值理解成为某一帧的duration值。例如,在某个流中,视频是25帧,那么此时,视频帧消息包的时间戳每次打的值基本都是在40左右(40=1000ms / 25f, 实际情况可能距该值上浮或下降几毫秒),音频每包时间戳跟视频包同理。
EasyRTMPClient 中的处理
在实际的开发过程当中,我们通常无法预知对端的流是采用以上何种时间戳格式来进行处理的(当然,可以通过RTMP协商的时候进行约束)。为了减少上层开发的工作量,EasyRTMPClient在实际开发过程中,对上述两种时间戳都进行了兼容。输出统一的格式,与flv文件tag时间戳保持一致,即使用递增模式。
在RTMP中,音频包时间戳和视频包时间戳处理方法基本是一致的,因此,下面只贴出EasyRTMPClient对上述两种时间戳的视频处理代码为:
if ( 0xFFFFFF != pkt->timestamp )
{
pkt->extendTimestamp = pkt->timestamp;
}
s = pkt->extendTimestamp / 1000;
us = ( pkt->extendTimestamp % 1000 ) * 1000;
if ( 0 == easyRtmp->preTimestamp.s && 0 == easyRtmp->preTimestamp.us )
{
easyRtmp->preTimestamp.s = s;
easyRtmp->preTimestamp.us = us;
}
else
{
if ( s >= easyRtmp->preTimestamp.s && us >= easyRtmp->preTimestamp.us )
{
goto _WRITE_TIMESTAMP;
}
ms = easyRtmp->videoTimestamp.s * 1000 + easyRtmp->videoTimestamp.us / 1000;
ms += pkt->extendTimestamp;
s = ms / 1000;
us = ( ms % 1000 ) * 1000;
easyRtmp->videoTimestamp.s = s;
easyRtmp->videoTimestamp.us = us;
}
_WRITE_TIMESTAMP:
easyRtmp->preTimestamp.s = s;
easyRtmp->preTimestamp.us = us;
获取更多信息
EasyRTMPClient交流群:544917793
Copyright © EasyDarwin.org 2012-2017
rtmp直播拉流客户端EasyRTMPClient设计过程中时间戳问题汇总的更多相关文章
- rtmp直播拉流客户端EasyRTMPClient TCP窗口大小设计方法
EasyRTMPClient 简介 EasyRTMPClient是EasyDarwin流媒体团队开发.提供的一套非常稳定.易用.支持重连接的RTMPClient工具,以SDK形式提供,接口调用非常简单 ...
- 网易考拉Android客户端网络模块设计
本文来自网易云社区 作者:王鲁才 客户端开发中不可避免的需要接触到访问网络的需求,如何把访问网络模块设计的更具有扩展性是每一个移动开发者不得不面对的事情.现在有很多主流的网络请求处理框架,如Squar ...
- [学习笔记] Web设计过程中该做和不该做的
原文网址: http://www.javascriptstyle.com/the-dos-and-donts-of-web-design -该做的: QR代码QR代码即快速响应代码,这是矩阵条形码的一 ...
- PF2.1版本总结,在设计过程中遇到的问题以及技术分享
在距离上一次的版本发布已经过去4个月的时间,因为个人的能力以及时间有限,所以这次的版本会推迟这么久.可是无论怎样,PF2.1带着自身的完善总算不负所望推出.在这次的版本调整中让我深有体会到了程序设计中 ...
- ambari安装过程中的问题汇总
今天重新安装ambari过程中,遇到了几个问题,耗费了我很长时间,在此记录一下 ambari重新安装可参考我之前的一篇随笔 http://www.cnblogs.com/6tian/p/4097401 ...
- 在APP开发设计过程中:如何设计启动页面?
心理学上有一个“7秒理论”,说的是,一个人对另一个人的印象,在初次见面的七秒内就会形成,最近更有研究表明,这个时间可能更短——不到1秒.所以初次见面所展示的形象真的很重要.同理,用户在使用APP时,每 ...
- dropload.js(上拉加载插件使用过程中遇到的坑)
dropload.js相关介绍和使用以及demo下载详见:https://github.com/ximan/dropload (原文出处) 之前因为项目需要一个上拉加载的效果,然后无意中看到了此插件, ...
- AD设计过程中的注意事项
1.编译报错:off sheet at....是纸张太小的原因,选择大一点的纸张报错就会消失.
- 【Linux】【Jenkins】代码编译和执行过程中的问题汇总
1.问题1:java.io.FileNotFoundException: /root/.jenkins/workspace/Videoyi_AutoTest_Maven/config-log4j\lo ...
随机推荐
- Codeforces 703D Mishka and Interesting sum(离线 + 树状数组)
题目链接 Mishka and Interesting sum 题意 给定一个数列和$q$个询问,每次询问区间$[l, r]$中出现次数为偶数的所有数的异或和. 设区间$[l, r]$的异或和为$ ...
- Sharing Cookies --AtCoder
题目描述 Snuke is giving cookies to his three goats.He has two cookie tins. One contains A cookies, and ...
- 平衡树之非旋Treap
平衡树(二叉树) 线段树不支持插入or删除一个数于是平衡树产生了 常见平衡树:treap(比sbt慢,好写吧),SBT(快,比较好写,有些功能不支持),splay(特别慢,复杂度当做根号n来用,功能强 ...
- oracle查询、删除表中相同的数据
delete FROM tablename a WHERE rowid > ( SELECT min(rowid) FROM tablename b WHERE b.id = a.id and ...
- mac 下bash命令
可以一行写一条命令 nginx uwsgi /Users/***/djangoprojects/bpmTest/uwsgi.ini 将上述命令保存成**.sh文件 这样,然后bash ***.sh 实 ...
- python函数式编程学习之map,reduce,filter,sorted
map(f, list)函数用于将函数f运用到list里的每个元素中 写个例子 def pow(x): return x*x map(pow, [2,3,4]) reduce(f, list)函数用于 ...
- Codis的源码编译生成tar包
一.Go环境的安装 1.下载地址 https://golang.org/dl/2.解压 tar -zxvf go1.7.1.linux-amd64.tar.gz -C /usr/local 3.修改配 ...
- BZOJ 4128 Matrix BSGS+矩阵求逆
题意:链接 方法: BSGS+矩阵求逆 解析: 这题就是把Ax=B(mod C)的A和B换成了矩阵. 然而别的地方并没有修改. 所以就涉及到矩阵的逆元这个问题. 矩阵的逆元怎么求呢? 先在原矩阵后接一 ...
- 【日常学习】【并查集+map】codevs2639 约会计划题解
然而我居然让诸城一中悲剧机房的C++可以编译了··· 直接上题目 题目描写叙述 Description cc是个超级帅哥,口才又好.rp极高(这句话似乎降rp),又非常的幽默,所以非常多mm都跟他关系 ...
- shell中sed命令
sed -i '/cd ${LDIR_DEST}\/webextend\/pc && ln -s \/hard\/www_winclient\/bboxpc.exe ./a\ \tcd ...