H264的RTP包如何解包
各位论坛的大神,请教一下,H264的RTP包如何解包。live555的源码太复杂,没怎么去研究。参考网上其它人的方法,进行解包,把解包后的数据写入到文件中,用Elecard StreamEye工具查看,发现只有I帧是正常的,P帧B帧全部花屏没法看。下面是我解包代码。
bool CRtp::ParseRtpPacket(BYTE *pInBuf, int nSize, BYTE **pOutBuf, int *outSize)
{
if (nSize < RTP_HEADER_LENGTH)
{
return NULL;
}
memset(&m_RtpHdr, 0, sizeof(m_RtpHdr));
BYTE *pStart = (BYTE *)&m_RtpHdr;
pStart[0] = pInBuf[0];
pStart[1] = pInBuf[1];
m_RtpHdr.seq = pInBuf[2];
m_RtpHdr.seq <<= 8;
m_RtpHdr.seq |= pInBuf[3];
m_RtpHdr.ts = pInBuf[4];
m_RtpHdr.ts <<= 8;
m_RtpHdr.ts |= pInBuf[5];
m_RtpHdr.ts <<= 8;
m_RtpHdr.ts |= pInBuf[6];
m_RtpHdr.ts <<= 8;
m_RtpHdr.ts |= pInBuf[7];
m_RtpHdr.ssrc = pInBuf[8];
m_RtpHdr.ssrc <<= 8;
m_RtpHdr.ssrc |= pInBuf[9];
m_RtpHdr.ssrc <<= 8;
m_RtpHdr.ssrc |= pInBuf[10];
m_RtpHdr.ssrc <<= 8;
m_RtpHdr.ssrc |= pInBuf[11];
//检查RTP版本
if (m_RtpHdr.v != 2)
{
return false;
}
//检查RTP载荷类型
if (m_RtpHdr.pt != H264_PAYLOADTYPE)
{
return false;
}
BYTE *pPayload = pInBuf + RTP_HEADER_LENGTH;
BYTE nalType = pPayload[0] & 0x1f;
BYTE *pBuf = NULL;
if (nalType == 0x1c) //FU-A
{
if ((pPayload[1] & 0xe0) == 0x80)
{
pBuf = pPayload - 3;
*((DWORD *)pBuf) = 0x01000000;
*(pBuf + 4) = (pPayload[0] & 0xe0) | (pPayload[1] & 0x1f);
*outSize = nSize - RTP_HEADER_LENGTH + 3;
}
else
{
pBuf = pPayload + 2;
*outSize = nSize - RTP_HEADER_LENGTH - 2;
}
}
else
{
pBuf = pPayload - 4;
*((DWORD *)pBuf) = 0x01000000;
*outSize = nSize - RTP_HEADER_LENGTH + 4;
}
memcpy(*pOutBuf, pBuf, nSize);
if (m_RtpHdr.m == 1)
{
return true;
}
else
{
return false;
}
}
...全文
相关推荐
rtp解包组包.zip
1、H264的RTP组包和拆包,主要是对于单帧包和FU-A包的处理; 2、H265的RTP组包和拆包,主要是对于单帧包和FU-A包的处理; 3、H264和H265的SPS数据解析;
基于RTP的H264视频数据打包解包类
RTP的H264视频数据打包解包类说明,H264 RTP打包类、解包类,实现了单个NAL单元包和FU_A分片单元包。对于丢包处理,采用简单的策略:丢弃随后的所有数据包,直到收到关键帧
h264 rtp打包 java版本
从文件中读取h264打包成rtp发送,用java编写 未提供h264文件..
h264封包解包 rtp.zip
这个模块是我自己写的,涉及的东西比较多,包括rtp h264的封包解包,链表的使用,socket tcp client server模块,及makefile编写参考,模块化设计等
RTP打包与解析,荷载PS和H264
RTP打包与解析,荷载类型包括PS和H264


多媒体/流媒体开发
