从h264字节流中提取Nalu数据

 
 

网上的代码多数是从本地h264文件中解析nalu数据,    如果想要处理从x264编码器中出来的实时流数据,可以这样做。

// NALU单元
typedef struct _NaluUnit
{
    int type;
    int size;
    unsigned char *data;
}NaluUnit;
int ReadOneNaluFromBuf(NaluUnit &nalu, uint8_t *buf, int buf_size)
{
	int i = 0;
	uint8_t *pFileBuf = buf;

	int nStartCodeCnt = 0;
	while( i<buf_size )
	{    
		// find begin start_code
		if( pFileBuf[i++] == 0x00 && pFileBuf[i++] == 0x00)
		{
			if(pFileBuf[i++] == 0x01)	
			{
				nStartCodeCnt = 3;
			} 
			else
			{
				i--;		
				if(pFileBuf[i++] == 0x00 && pFileBuf[i++] == 0x01){
					nStartCodeCnt = 4;
				}
				else continue;
			}
		}
		else continue;

		//找结束的
		int pos = i;
		int nStartCodeCnt2 = 0;
		while (pos<buf_size)
		{
			if( pFileBuf[pos++] == 0x00 && pFileBuf[pos++] == 0x00 )
			{
				if( pFileBuf[pos++] == 0x01 ) {
					nStartCodeCnt2 = 3;
					break;
				} 
				else
				{
					pos--;		
					if(pFileBuf[pos++] == 0x00 && pFileBuf[pos++] == 0x01)
					{
						nStartCodeCnt2 = 4;
						break;
					}
					else continue;
				}
			}
		}
		if( pos == buf_size)
			nalu.size = pos-i;	
		else
			nalu.size = (pos-nStartCodeCnt2)-i;
		
		nalu.type = pFileBuf[i]&0x1f;
		nalu.data = &pFileBuf[i];

		return pos - nStartCodeCnt2;
	}
	return 0;
}

用法:

//
int SendH264Buff( unsigned char *data,unsigned int size)
{
	NaluUnit naluUnit;  
	uint32_t now,last_update;

	int nOffset = 0;
	int  nPos =0;
	while(1) 
	{
		nPos = ReadOneNaluFromBuf(naluUnit, data + nOffset, size);
		nOffset += nPos;
		int bKeyframe = (naluUnit.type == 0x05) ? TRUE : FALSE;
		SendH264Packet(naluUnit.data,naluUnit.size,bKeyframe,tick);
		if (nOffset>=size)
			break;
	}

	return 0;
}


欢迎关注微信公众号: 
   音视频开发训练营公众号  
 
音视频开发训练营QQ群:
 576912843

猜你喜欢

转载自blog.csdn.net/machh/article/details/80257375
今日推荐