GBT28181中的RTP
来源:互联网 发布:windows输入法不见了 编辑:程序博客网 时间:2024/06/11 05:42
国标中说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 -1;}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 0;}
//pData是一帧数据的首地址,dataLen是该帧的长度while(dataLen > 0){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 = 0;pData = NULL;}}
值得一提的是,时间戳增量并不一定要严格按照固定的值增长,比如:
帧率为25帧的视频数据,时间戳增量一般为3600,但是实际的帧率可能是动态的,上一帧的时间和下一帧的时间间隔可能不是严格的40ms,实际上也不可能这么严格,
那么我在打时间戳的时候可以把这一帧的时间戳打成3500的增量,再把下一帧的增量达成3700,这也没关系。
- GBT28181中的RTP
- H.264中的RTP
- webrtc中的rtp解析
- webrtc中的rtp扩展 rtp-hdrext
- H264在RTP中的传输
- rtp中的sdp信息生成
- GBT28181相关博文
- RTP
- RTP
- RTP
- RTP
- RTP
- RTP
- RTP
- RTP
- RTP
- rtp
- rtp
- cells(11)
- [android]网络通信demo
- Android ScrollView HorizontalScrollView 实现全方向(上下左右)反弹效果
- oracle 函数大全
- Android左侧推出导航的简单实现
- GBT28181中的RTP
- 数学之路(2)-数据分析-R基础(24)
- 将一个字符串转换为整型数的实现
- cells(12)
- 笔试/面试题_设计模式
- 适用于Android设计风格的ActionBar
- CSS+DIV实现鼠标经过背景变色
- PHP中sha1_file与md5_file哪个更快?
- Getting started with rrdtools