获取H264的NALU

来源:互联网 发布:网络冗余设计 编辑:程序博客网 时间:2024/05/22 17:37
class CPH264
{
public:


private:
std::vector<BufferedData*> m_vector_video;


public:
std::vector<BufferedData*> * get_vector_h264NALU()
{
return &m_vector_video;
}


public:
std::vector<BufferedData*> * GetH264NALU( unsigned char * ph264Buf, int nBufLen )
{
std::vector<int> vecrot_StartCodePos;


for ( int i = 0; i < nBufLen-4; i++ )
{
int nNextStartCodePos = 0;


int nStartCode = find_StartCode( ph264Buf + i );


if ( nStartCode == 0 )
{
continue;
}


vecrot_StartCodePos.push_back(i);


i = i+nStartCode-1; 


}




for ( int i = 0 ; i< vecrot_StartCodePos.size(); i++ )
{
int nStartCodePos = vecrot_StartCodePos.at(i);


int nCodeLen = find_StartCode( ph264Buf + nStartCodePos );



int nNalBufLen = 0;


if ( i < vecrot_StartCodePos.size() - 1 )
{
nNalBufLen = vecrot_StartCodePos.at(i+1) - vecrot_StartCodePos.at(i) - nCodeLen;
}
else
{
nNalBufLen = nBufLen - vecrot_StartCodePos.back() - nCodeLen;
}




BufferedData * pNALbuf = new BufferedData;


pNALbuf->PushBack( ph264Buf + nStartCodePos + nCodeLen, nNalBufLen );


m_vector_video.push_back(pNALbuf);




{
static FILE * f = fopen("E:\\nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn.h264","w+b");
fwrite(  ph264Buf + nStartCodePos + nCodeLen, 1,  nNalBufLen, f );
}


}









return 0;
}


private:
int find_StartCode( unsigned char * ph264Buf )
{
if ( find_StartCode3( ph264Buf ) )
{
return 3;
}
else
if ( find_StartCode4(ph264Buf) )
{
return 4;
}


return 0;
}


int find_StartCode3( unsigned char * ph264Buf )
{
if ( ph264Buf[0] == 0  && ph264Buf[1] == 0 && ph264Buf[2] == 1 )
{
return 1;
}  


return 0;
}


int find_StartCode4( unsigned char * ph264Buf )
{
if ( ph264Buf[0] == 0  && ph264Buf[1] == 0 && ph264Buf[2] == 0 &&  ph264Buf[3] == 1  )
{
return 1;
}  


return 0;
}
};
0 0
原创粉丝点击