Header 如何在h.264 RTP数据包中查找Nal报头

Header 如何在h.264 RTP数据包中查找Nal报头,header,h.264,rtp,Header,H.264,Rtp,我需要通过解析一个RTP包来找到NAL报头,其中每个NAL单元被封装到一个RTP包中,然后我解析NAL报头以知道它是否是PPS单元。我尝试了以下方法,但没有结果: dataBuffer = (char*)MESSAGE_ReturnPacket(msg); byte * hdr = (byte*)dataBuffer + RTP_HDR_SIZE; //dataBuffer contains the RTP packet RTPParsing((

我需要通过解析一个RTP包来找到NAL报头,其中每个NAL单元被封装到一个RTP包中,然后我解析NAL报头以知道它是否是PPS单元。我尝试了以下方法,但没有结果:

       dataBuffer = (char*)MESSAGE_ReturnPacket(msg);

       byte * hdr = (byte*)dataBuffer + RTP_HDR_SIZE; //dataBuffer contains  the RTP packet

        RTPParsing((byte*)dataBuffer,rp,hdr);

        if (rp.nal_type == 8 )
        {
            printf("\n  PPS is found \n");

        }
        else
       {
       printf("\n No PPS is found\n");

        }
在哪里

    int RTPParsing(byte *pData,RTPpacket_t &rp, byte *hdr)
    {
    if ((pData[0] & 0xc0) != (2 << 6)){
    printf("[RTP] version is incorrect! dump = 0x%x 0x%x 0x%x 0x%x 

    \n",pData[0], pData[1], pData[2], pData[3]);
    return 0;
    }

/* parse RTP header */

rp.v = (pData[0] & 0xc0) >> 6; /* protocol version */
rp.p = (pData[0] & 0x40) >> 5; /* padding flag */
rp.x = (pData[0] & 0x20) >> 4; /* header extension flag */
rp.cc = (pData[0] & 0x0f);  /* CSRC count */
rp.m = (pData[1] & 0x80) >> 7; /* marker bit */
rp.pt = (pData[1] & 0x7F); //Payload Type
rp.seq = ntohs (((unsigned short *) pData)[1]);    /* sequence number */
rp.timestamp = ntohl (((unsigned int *) pData)[1]); /* timestamp */
rp.ssrc = ntohl (((unsigned int *) pData)[2]);  /* synchronization source */
rp.nal_type = (hdr[1] & 0x1F); // get NAL unit's type

if (rp.cc)

    {
    for (int i = 0; i < rp.cc; i++)
    {
        //fprintf (out, " csrc: 0x%08x",ntohl (((unsigned int *) data)[3 + i]));
    }
    }
    return 0;
    }
int RTPParsing(字节*pData,RTPpacket\u t&rp,字节*hdr)
{
如果((pData[0]&0xc0)!=(2>6;/*协议版本)*/
rp.p=(pData[0]&0x40)>>5;/*填充标志*/
rp.x=(pData[0]&0x20)>>4;/*头扩展标志*/
rp.cc=(pData[0]&0x0f);/*csc计数*/
rp.m=(pData[1]&0x80)>>7;/*标记位*/
rp.pt=(pData[1]&0x7F);//有效负载类型
rp.seq=ntohs(((无符号短*)pData)[1]);/*序列号*/
rp.timestamp=ntohl((unsigned int*)pData)[1];/*timestamp*/
rp.ssrc=ntohl(((unsigned int*)pData)[2];/*同步源*/
rp.nal_type=(hdr[1]&0x1F);//获取nal单元的类型
如果(rp.cc)
{
对于(int i=0;i
有什么帮助吗?

根据单NAL单元模式,NAL单元的第一个字节共同充当 RTP有效载荷头“

偏移量不正确(1而不是0):

此外,硬编码
RTP_HDR_SIZE
为12(如果您正在这样做)可能会导致问题,因为报头的大小可能会因扩展报头、CSRC等的不同而不同。

在单NAL单元模式下,“NAL单元的第一个字节共同充当 RTP有效载荷头“

偏移量不正确(1而不是0):

另外,硬编码
RTP_HDR_SIZE
as 12(如果您正在这样做)可能会导致问题,因为标头的大小可能会因扩展标头、CSRC等的不同而有所不同

rp.nal_type = (hdr[1] & 0x1F); // get NAL unit's type