接下来看一下librtmp最重要之一的函数 RTMP_SendPacket
首先必须有一份rtmp文档在手配合源码阅读,点击打开链接
顾名思义,即发送一个packet,这是rtmp协议逻辑上数据交互的基本单元(实际物理上还要分成chunk发送)。
先看一下 RTMPPacket 的定义
typedef struct RTMPPacket
{
uint8_t m_headerType;
uint8_t m_packetType;
uint8_t m_hasAbsTimestamp; /* timestamp absolute or relative? */
int m_nChannel;
uint32_t m_nTimeStamp; /* timestamp */
int32_t m_nInfoField2; /* last 4 bytes in a long header */
uint32_t m_nBodySize;
uint32_t m_nBytesRead;
RTMPChunk *m_chunk;
char *m_body;
} RTMPPacket;
重点关注m_body字段
int
RTMPPacket_Alloc(RTMPPacket *p, int nSize)
{
char *ptr = calloc(1, nSize + RTMP_MAX_HEADER_SIZE);
if (!ptr)
return FALSE;
p->m_body = ptr + RTMP_MAX_HEADER_SIZE;
p->m_nBytesRead = 0;
return TRUE;
}
可以看到,实际上分配的空间是nSize + RTMP_MAX_HEADER_SIZE,m_body指向的是所请求空间起始位置加上RTMP_MAX_HEADER_SIZE,这个常量被define为18
接下来正式看下RTMP_SendPacket
int
RTMP_SendPacket( RTMP *r, RTMPPacket *packet, int queue )
{
const RTMPPacket *prevPacket = r->m_vecChannelsOut[packet->m_nChannel];
uint32_t last = 0;
int nSize;
int hSize, cSize;
char *header, *hptr, *hend, hbuf[RTMP_MAX_HEADER_SIZE], c;
uint32_t t;
char *buffer, *tbuf = NULL, *toff = NULL;
int nChunkSize;
int tlen;
prevpacket指当前channel上一个包,rtmp保存上一个包信息的目的便是发送下一个包的时候,有很多重复的包头内容可以不发送,从而节省网络带宽
if (