介绍
利用线程池,实现 RTSP 服务器的高并发请求处理。 RTSP 是音视频的控制视频的协议,如果您还不了解,可以看看之前我解析 RTSP 协议的文章。音视频协议解析(RTP/RTCP/RTSP/RTMP)------RTSP解析-CSDN博客
解析
我们先来看 RTP 的实现。RTP 是音视频协议中负责传输数据的协议。
cpp
#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 1400
class RtpHeader{
public:
uint8_t csrcLen; // 4 bits
uint8_t extension; // 1 bit
uint8_t padding; // 1 bit
uint8_t version; // 2 bit
uint8_t payloadType; // 7 bits
uint8_t marker; // 1 bit
uint16_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),我们解析了。剩下的函数,我们下一回再解析。
欲知后事如何,请听下回分解。