它表示了rtmp协议
// rtmp表示了rtmp协议 typedef struct RTMP { int m_inChunkSize; int m_outChunkSize; int m_nBWCheckCounter; int m_nBytesIn; int m_nBytesInSent; int m_nBufferMS; int m_stream_id; /* returned in _result from createStream */ int m_mediaChannel; uint32_t m_mediaStamp; uint32_t m_pauseStamp; int m_pausing; int m_nServerBW; int m_nClientBW; uint8_t m_nClientBW2; uint8_t m_bPlaying; uint8_t m_bSendEncoding; uint8_t m_bSendCounter; int m_numInvokes; int m_numCalls; RTMP_METHOD *m_methodCalls; /* remote method calls queue */ // 远程调用队列 RTMPPacket *m_vecChannelsIn[RTMP_CHANNELS]; RTMPPacket *m_vecChannelsOut[RTMP_CHANNELS]; int m_channelTimestamp[RTMP_CHANNELS]; /* abs timestamp of last packet */ double m_fAudioCodecs; /* audioCodecs for the connect packet */ double m_fVideoCodecs; /* videoCodecs for the connect packet */ double m_fEncoding; /* AMF0 or AMF3 */ double m_fDuration; /* duration of stream in seconds */ int m_msgCounter; /* RTMPT stuff */ int m_polling; int m_resplen; int m_unackd; AVal m_clientID; // 用户id RTMP_READ m_read; // rtmp的读状态 RTMPPacket m_write; // 用于写的packet RTMPSockBuf m_sb; // 套接字缓存区 RTMP_LNK Link; // 表示一个rtmp的连接 } RTMP;rtmp链接
它表示了一个rtmp的链接
// 表示一个rtmp连接 typedef struct RTMP_LNK { AVal hostname; AVal sockshost; AVal playpath0; /* parsed from URL */ AVal playpath; /* passed in explicitly */ AVal tcUrl; AVal swfUrl; AVal swfHash; AVal pageUrl; AVal app; AVal auth; AVal FlashVer; AVal subscribepath; AVal usherToken; AVal WeebToken; AVal token; AMFObject extras; int edepth; int seekTime; int stopTime;#define RTMP_LF_AUTH 0x0001 /* using auth param */#define RTMP_LF_LIVE 0x0002 /* stream is live */#define RTMP_LF_SWFV 0x0004 /* do SWF verification */#define RTMP_LF_PLST 0x0008 /* send playlist before play */#define RTMP_LF_BUFX 0x0010 /* toggle stream on BufferEmpty msg */#define RTMP_LF_FTCU 0x0020 /* free tcUrl on close */ int lFlags; int swfAge; int swfSize; int PRotocol; int ConnectPacket; int CombineConnectPacket; int timeout; /* connection timeout in seconds */ AVal Extras; AVal HandshakeResponse; unsigned short socksport; unsigned short port;#ifdef CRYPTO#define RTMP_SWF_HASHLEN 32 void *dh; /* for encryption */ void *rc4keyIn; void *rc4keyOut; uint32_t SWFSize; uint8_t SWFHash[RTMP_SWF_HASHLEN]; char SWFVerificationResponse[RTMP_SWF_HASHLEN+10];#endif } RTMP_LNK;rtmp消息块
在libRtmp中,数据收发的单位是消息块(message chunk),而不是消息(message)。
其中每个字段的值,可以对照http://blog.csdn.net/nb_vol_1/article/details/58603868进行学习!
// rtmp消息块 typedef struct RTMPPacket { // chunk basic header(大部分情况是一个字节) uint8_t m_headerType; // Message type ID(1-7协议控制;8,9音视频;10以后为AMF编码消息) uint8_t m_packetType; // 是否含有Extend timeStamp字段 uint8_t m_hasAbsTimestamp; /* timestamp absolute or relative? */ // channel 即 stream id字段 int m_nChannel; // 时间戳 uint32_t m_nTimeStamp; /* timestamp */ // message stream id int32_t m_nInfoField2; /* last 4 bytes in a long header */ // chunk体的长度 uint32_t m_nBodySize; uint32_t m_nBytesRead; RTMPChunk *m_chunk; // 原始rtmp消息块 char *m_body; } RTMPPacket;原始的rtmp消息块
原始的rtmp消息块表示其中的数据都是没有经过解析的,是原始的字节流
// 原始的rtmp消息块 typedef struct RTMPChunk { int c_headerSize; // 头部的长度 int c_chunkSize; // chunk的大小 char *c_chunk; // 数据 char c_header[RTMP_MAX_HEADER_SIZE]; // chunk头部 } RTMPChunk;远程调用方法
/* ** 远程调用方法 */ typedef struct RTMP_METHOD { AVal name; int num; } RTMP_METHOD;读函数包装器
/* state for read() wrapper */ // read函数的包装器,包括状态等等 typedef struct RTMP_READ { char *buf; char *bufpos; unsigned int buflen; uint32_t timestamp; uint8_t dataType; uint8_t flags;#define RTMP_READ_HEADER 0x01#define RTMP_READ_RESUME 0x02#define RTMP_READ_NO_IGNORE 0x04#define RTMP_READ_GOTKF 0x08#define RTMP_READ_GOTFLVK 0x10#define RTMP_READ_SEEKING 0x20 int8_t status;#define RTMP_READ_COMPLETE -3#define RTMP_READ_ERROR -2#define RTMP_READ_EOF -1#define RTMP_READ_IGNORE 0 /* if bResume == TRUE */ uint8_t initialFrameType; uint32_t nResumeTS; char *metaHeader; char *initialFrame; uint32_t nMetaHeaderSize; uint32_t nInitialFrameSize; uint32_t nIgnoredFrameCounter; uint32_t nIgnoredFlvFrameCounter; } RTMP_READ;套接字缓冲区
// 套接字缓冲区 typedef struct RTMPSockBuf { int sb_socket; int sb_size; /* number of unprocessed bytes in buffer */ char *sb_start; /* pointer into sb_pBuffer of next byte to process */ char sb_buf[RTMP_BUFFER_CACHE_SIZE]; /* data read from socket */ int sb_timedout; void *sb_ssl; } RTMPSockBuf;字符串
/*** AVal表示一个字符串*/ typedef struct AVal { char *av_val; int av_len; } AVal;
新闻热点
疑难解答