H264的RTP包如何解包

冰川人看世界 冰川人看世界 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
各位论坛的大神,请教一下,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;
}
}
...全文

相关推荐

评论 4
收藏 已收藏
分享
返回顶部