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 ...
随机推荐
- codevs——1169 传纸条(棋盘DP)
2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 小渊和小 ...
- Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色
Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色 在图12.10~12.12中我们会看到在各个平台下活动指示器的颜色是不一样的.Android的活动指示器默认是深粉色的: ...
- iphone之判断屏幕方向
有两种方法可以判断 1,程序刚开始运行的时候,不能获取当前方向.给你说几种方式,你试一下: 1. 可以在启动后0.01秒执行初始化的代码,这个时候就可以获取设备方向了. 2. 另外一种方式,借助状态栏 ...
- VS2010中 打开vc6.0的工程时,遇到的问题及解决办法
用VS2010打开vc6.0的工程时,遇到了很多的问题,下面记录下解决办法. 1. 报错: error C2065: “i”: 未声明的标识符 解决办法: 提出 i 的申明,因为 i 的申明可能在fo ...
- 2016.7.12 针对不同的数据库类型generatorConfig文件中的数据库配置
百度了很多资料,没有专门说这个的.大家都是配置自己的数据库,大部分是mysql.因为我使用的是postgresql,还是找了一会才找到配置指导. 毕竟第一次配置,还是要看着别人的指导比较安心.配置完后 ...
- 2016.7.14 generator基于注解和基于xml自动生成代码的区别
1.generator配置文件generatorConfig.xml的区别 2.生成代码的区别 注:二者的实体类都一样. (1)基于XML 生成的文件有: 后面省略. 也就是说,基于xml的方式,是要 ...
- codeforces 486C Palindrome Transformation 贪心求构造回文
点击打开链接 C. Palindrome Transformation time limit per test 1 second memory limit per test 256 megabytes ...
- 进程间通信(IPC)介绍(转)
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量.共享存储.Socket ...
- 强制重启Linux系统的几种方法
实际生产环境中某些情况下 Linux 服务器系统在出现致命错误需要远程进行重启,通过常规的 reboot.init 6 等方法无法正常重启(例如重启时卡在驱动程序里等情况),这时就需要通过下面介绍的几 ...
- int a; int* a; int** a; int (*a)[]; int (*a)(int)
a) int a;表示一个内存空间,这个空间用来存放一个整数(int):b) int* a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间:c) int ...