GBT28181中的RTP
国标中说h264数据按照RFC3984打包,但是国标的测试工具——SPVMN,却不支持RFC3984的打包方式。
无奈之下直接用RFC3550的方式打包,其实就是分包,然后加上RTP头,对于一帧的结束,在RTP头中把MARK置1,并且在一帧的开始把时间戳增加而已。
这种打包方式其实和RFC有冲突,打包处理的RTP数据用VLC播放解码不正常,但用SPVMN是可以播的。
这种方式下没有测试音视频混合的情况,待测。
贴上代码(代码不全,体现下流程和重点):
int NewRTPPacket(unsigned short channel, unsigned short sequenceNumber, unsigned long timeStamp, \
RTSP_DATE_TIME time, const unsigned char *pRTPData, unsigned long dataLen, bool bIsKeyFrame, bool mark)
{
if (dataLen > MAX_RTP_PAYLOAD_DATA_LEN)
{
assert(false);
return -;
}
m_Sec = time.seconds;
m_MicroSec = time.microsecond;
Clear(); m_bIsKeyFrame = bIsKeyFrame;
m_channel = channel;
m_pRTPHeader->sequenceNumber = htons(sequenceNumber);
m_pRTPHeader->timeStamp = htonl(timeStamp); m_rtpDataLen = dataLen + sizeof(RTP_HEADER); CreateCommonInfo(RTP_PAYLOAD_TYPE_H264, mark, STREAM_LIVE_VIDEO); memcpy(m_pRTPData + sizeof(RTP_HEADER) + sizeof(INTERLEAVED_INFO), pRTPData, dataLen);
}
int CreateRFC3550Packet(unsigned short channel, const unsigned char *pRTPData, unsigned long dataLen, \
bool bIsKeyFrame, unsigned long TimeStamp, bool mark)
{
CRTPPacket *pRTPPacket = m_mapRTPPacketFree[channel]->front();
m_mapRTPPacketFree[channel]->pop_front(); pRTPPacket->NewRTPPacket(channel, ++m_VSequenceNum[channel], TimeStamp, \
RTSPGetCurrTime(), pRTPData, dataLen, bIsKeyFrame, mark); m_mapRTPPacket[channel]->push_back(pRTPPacket);
DistributePacket(pRTPPacket, channel); return ;
}
//pData是一帧数据的首地址,dataLen是该帧的长度
while(dataLen > )
{
if (dataLen > MAX_RTP_PAYLOAD_DATA_LEN)
{
CreateRFC3550Packet(channel, pData, MAX_RTP_PAYLOAD_DATA_LEN, bIsKeyFrame, m_LastFrameTs[streamType][channel], false);
dataLen -= MAX_RTP_PAYLOAD_DATA_LEN;
pData += MAX_RTP_PAYLOAD_DATA_LEN;
}
else
{
CreateRFC3550Packet(channel, pData, dataLen, bIsKeyFrame, m_LastFrameTs[streamType][channel], true);
dataLen = ;
pData = NULL;
}
}
值得一提的是,时间戳增量并不一定要严格按照固定的值增长,比如:
帧率为25帧的视频数据,时间戳增量一般为3600,但是实际的帧率可能是动态的,上一帧的时间和下一帧的时间间隔可能不是严格的40ms,实际上也不可能这么严格,
那么我在打时间戳的时候可以把这一帧的时间戳打成3500的增量,再把下一帧的增量达成3700,这也没关系。
注: 本文转载自 http://blog.csdn.net/c__allen/article/details/8960631
GBT28181中的RTP的更多相关文章
- 轻便的gb28181协议中的rtp+ps格式视频流的封装和解析
streams 轻便的gb28181协议中的rtp+ps格式视频流的封装和解析 packet packet实现ps的相关封装和解析, example/enc 通过joy4来读本地视频文件,然后调用Rt ...
- doubango(6)--Doubango协议栈中对RTP的管理
相关数据结构 1. tsip_dialog_invite_t 描述: 一个invite_dialog代表了一个invite期间的所有的信令流程,因此,它首先是一个普遍的dialog的特殊化结构, ...
- 多媒体开发之---h264中 的RTP PAYLOAD 格式
H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+ |0|1|2|3|4|5|6|7 ...
- Android IOS WebRTC 音视频开发总结(八十六)-- WebRTC中RTP/RTCP协议实现分析
本文主要介绍WebRTC中的RTP/RTCP协议,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID ...
- Live555中RTP包的打包与发送过程分析
这里主要分析一下,live555中关于RTP打包发送的部分.在处理完PLAY命令之后,就开始发送RTP数据包了(其实在发送PLAY命令的response包之前,就会发送一个RTP包,这里传输就已经开始 ...
- (转载)H.264码流的RTP封包说明
H.264的NALU,RTP封包说明(转自牛人) 2010-06-30 16:28 H.264 RTP payload 格式 H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) ...
- TCP、UDP、RTP(RTCP)异同与区别
OSI七层模型OSI 中的层 功能 TCP/IP协议族 应 用层 ...
- RTP协议分析(转自:http://blog.csdn.net/bripengandre/article/details/2238818)
RTP协议分析 第1章. RTP概述 1.1. RTP是什么 RTP全名是Real-time Transport Protocol(实时传输协议).它是IETF提出的一个标准,对应的RFC文 ...
- H264关于RTP协议的实现
完整的C/S架构的基于RTP/RTCP的H.264视频传输方案.此方案中,在服务器端和客户端分别进行了功能模块设计. 服务器端:RTP封装模块主要是对H.264码流进行打包封装:RTCP分析模块负责产 ...
随机推荐
- struct2(四)编写Struct2 的Action
简介: 1.映射一个Action到一个类上面 2.把结果返回到view展示 3.编写Action对应的控制逻辑 1. Action Mapping <action name="he ...
- java_抽象类应用
本例子通过一个实例来具体阐述抽象类的应用,首先一个抽象类Person2,里面定义了一些人的共有属性(年龄,姓名),和抽象方法want(),want()方法来具体实现不同的人的需求(学生想要成绩,工人想 ...
- hdu 5392 Infoplane in Tina Town(数学)
Problem Description There is a big stone with smooth surface in Tina Town. When people go towards it ...
- javascript正則表達式 "\b"问题
preface 昨晚在看<javascript权威指南>后.看见作者自己封装一个兼容全部浏览器的山寨HTML5新API classLIst类.自己想了想认为自己也要去玩一下.可是能力还是有 ...
- Android-隐式Intent
隐式Intent表示不具体明确要打开的activity,利用隐式intent我们可以打开其他应用. 一个隐式intent的主要组成部分: 1.action 要执行的操作. 通常以intent类的常量表 ...
- linux服务器伪分布模式安装hadoop-1.1.2
1:环境准备 1台linux服务器, hadoop安装包(apache官方网下载) jdk1.6+ 2:安装jdk ,配置好环境变量(etc/profile),java -version 测 ...
- 去除tableView上面的黑色部分 解决办法
把上面的黑色去掉 只需在 viewDidLoad 中添加代码 self.automaticallyAdjustsScrollViewInsets=NO;就好了... 效果图 如下
- javascript作用域和作用域链
1.作用域 作用域,它是指对某一变量和方法具有访问权限的代码空间.当我们在定义变量的时候,会定义两种变量,一种是在全局环境下定义的变量,叫全局变量,一种是在函数中定义的变量叫局部变量.全局变量的作用域 ...
- poj3090欧拉函数求和
E - (例题)欧拉函数求和 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:65536KB ...
- VB6基本数据库应用(四):数据的提取,新增和修改
列的第四篇,上一篇在:http://blog.csdn.net/jiluoxingren/article/details/9474661 数据的提取,新增和修改 由于在写第三章的时候没有充分考虑这一章 ...