网上的代码多数是从本地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