介紹
利用線程池,實現 RTSP 服務器的高并發請求處理。 RTSP 是音視頻的控制視頻的協議,如果您還不了解,可以看看之前我解析 RTSP 協議的文章。音視頻協議解析(RTP/RTCP/RTSP/RTMP)——RTSP解析-CSDN博客
解析
我們先來看 RTP 的實現。RTP 是音視頻協議中負責傳輸數據的協議。
#include<stdint.h>#define RTP_VERSION 2
#define RTP_PAYLOAD_TYPE_H264 96
#define RTP_PAYLOAD_TYPE_AAC 97
#define RTP_HEADER_SIZE 12
#define RTP_MAX_PKT_SIZE 1400class RtpHeader{
public:uint8_t csrcLen; // 4 bitsuint8_t extension; // 1 bituint8_t padding; // 1 bituint8_t version; // 2 bituint8_t payloadType; // 7 bits uint8_t marker; // 1 bituint16_t seq; uint32_t timestamp;uint32_t ssrc;
};class RtpPacket{
public:RtpHeader rtpHeader;uint8_t payload[0];
};void rtpHeaderInit(RtpPacket* rtpPacket, uint8_t csrcLen, uint8_t extension,uint8_t padding, uint8_t version, uint8_t payloadType, uint8_t marker,uint16_t seq, uint32_t timestamp, uint32_t ssrc);int rtspSendPacketOverTcp(int clientSockfd, RtpPacket* rtpPacket, uint32_t dataSize, char channel);int rtspSendPacketOverUdp(int serverRtpSockfd, const char* ip, int16_t port, RtpPacket* rtpPacket, uint32_t dataSize);
RtpHeader:RTP 數據包的頭部
????????csrclen:提供信源長度
????????extension:擴展標志,占 1 bits,如果X=1,則在RTP報頭后跟有一個擴展報頭
????????padding:填充標志,占1位,如果P=1,則在該報文的尾部填充一個或多個額外的八位組,? ??????????????????????????它們不是有效載荷的一部分
????????version:版本號,占 2 bits
????????payloadType:載荷類型
????????marker:標志,占 1 bits,不同的有效載荷有不同的含義,對于視頻,標記一幀的結束;對于
????????????????????????音頻,標記會話的開始。
????????seq:占 16bits,用于標識發送者所發送的RTP報文的序列號
????????timestamp:時間戳,占 32 bits,反映了該RTP報文的第一個八位組的采樣時刻
????????ssrc:同步信源
RtpPacket:RTP 數據包
? ? ? ? rtpheader:數據包頭部
? ? ? ? payload:載荷
好了,RTP 的包頭部和包(packet),我們解析了。剩下的函數,我們下一回再解析。
欲知后事如何,請聽下回分解。