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 ...
随机推荐
- 全局变量 全局函数vue 方法
定义全局变量 原理: 设置一个专用的的全局变量模块文件,模块里面定义一些变量初始状态,用export default 暴露出去,在main.js里面使用Vue.prototype挂载到vue实例上面或 ...
- Codeforces 583 DIV2 Robot's Task 贪心
原题链接:http://codeforces.com/problemset/problem/583/B 题意: 就..要打开一个电脑,必须至少先打开其他若干电脑,每次转向有个花费,让你设计一个序列,使 ...
- jzyzOJ 1658【bzoj1798改编】
#include<iostream> #include<cstring> #include<cstdio> #include<ctime> #inclu ...
- Maven 多模块父子工程 (含Spring Boot示例)
一.为什么要用Maven多模块 假设有这样一个项目,很常见的Java Web应用.在这个应用中,我们分了几层: Dao Service Web 对应的,在一个项目中,我们会看到一些包名: org.xx ...
- Apache/Nginx为PHP设置、添加$_SERVER服务器环境变量
在PHP开发中为了区分线上生产环境还是本地开发环境, 如果我们能通过判断$_SERVER['RUNTIME_ENVIROMENT']为 'DEV'还是'PRO'来区分该多好, 可惜的是$_SERVER ...
- django中引入json
try: from django.utils import simplejson as jsonexcept: import simplejson as json
- 用户空间和内核空间通讯之【Netlink 上】
原文地址:用户空间和内核空间通讯之[Netlink 上] 作者:wjlkoorey258 引言 Alan Cox在内核1.3版本的开发阶段最先引入了Netlink,刚开始时Netlink是以字符驱动接 ...
- Mysql的时间戳转date类型
mysql 的 时间戳转date类型 select FROM_UNIXTIME(1491031706235/1000,'%Y-%m-%d') from dual;
- netty实现长连接心跳检
主要逻辑: 使用netty实现长连接,主要靠心跳来维持服务器端及客户端连接. 实现的逻辑主要是: 服务器端方面: 1, 服务器在网络空闲操作一定时间后,服务端失败心跳计数器加1. 2, 如果收到客户端 ...
- win10 只要打开文件对话框就卡死解决方法
我电脑的问题是:win10系统,只要打开 文件对话框就卡死,假死,cpu100% 一直没有解决,但是只要把缩略图关了,就ok. 但是又想要留着缩略图,还是得显示,于是乎一直在找解决办法. 此方法好像可 ...