索性一口气把RTMP_ReadPacket也记录下来,好尽快开始对具体上层协议实现细节进行细读。
与RTMP_SendPacket不同,RTMP_ReadPacket需要多次调用(每次读取一个chunk),并配合RTMPPacket_IsReady这个宏使用才能读取一个完整的RTMPPacket。
大致如下:
while(isPlaying && RTMP_ReadPacket(r,&packet)){
if(RTMPPacket_IsReady(&packet)){
//已成功接收到一个完整包,在此进行处理
}
}
其中,
#define RTMPPacket_IsReady(a) ((a)->m_nBytesRead == (a)->m_nBodySize)
下面开始看一下 RTMP_ReadPacket
int
RTMP_ReadPacket( RTMP *r, RTMPPacket *packet )
{
uint8_t hbuf[RTMP_MAX_HEADER_SIZE] = { 0 };
char *header = (char *) hbuf;
int nSize, hSize, nToRead, nChunk;
int didAlloc = FALSE;
RTMP_Log( RTMP_LOGDEBUG2, "%s: fd=%d", __FUNCTION__, r->m_sb.sb_socket );
if ( ReadN( r, (char *) hbuf, 1 ) == 0 )
{
RTMP_Log( RTMP_LOGERROR, "%s, failed to read RTMP packet header", __FUNCTION__ );
return(FALSE);
}
ReadN也是老朋友了,读取第一个字节,开始对packet流进行解析
packet->m_headerType = (hbuf[0] & 0xc0) >> 6;
packet->m_nChannel = (hbuf[0] & 0x3f);
header++;
if ( packet->m_nChannel == 0 )
{
if ( ReadN( r, (char *) &hbuf[1], 1 ) != 1 )
{
RTMP_Log( RTMP_LOGERROR, "%s, failed to read RTMP packet header 2nd byte",
__FUNCTION__ );
return(FALSE);
}
packet->m_nChannel = hbuf[1];
packet->m_nChannel += 64;
header++;
}else if ( packet->m_nChan