前面的部分讲了关于RTSP连接的交互过程,在RTSP推流的过程中,RTSP协议只是做一个控制作用,底层真正进行传输的流媒体协议还是RTP协议。做这一部分主要是要先了解RTP协议的封装格式,这里我不详细讲了,网上有很多博客都有讲,我这里主要是讲一下实现方式。
在建立了RTSP连接之后,就是在客户端发回PLAY指令之后,在setup阶段被设置的回调函数会被调用,下面是回调函数的代码
unsigned int RtpSend(unsigned int u32Rtp, unsigned char *pData, int s32DataSize, unsigned int u32TimeStamp)
{
int s32NalSize = 0;
int nalhead_pos = 0,naltail_pos = 0;
HndRtp hRtp = (HndRtp)u32Rtp;
unsigned char * nalubuffer = NULL;
hRtp->u32TimeStampCurr = u32TimeStamp;
while(nalhead_pos<s32DataSize)
{
if(pData[nalhead_pos++] == 0x00 &&
pData[nalhead_pos++] == 0x00)
{
if(pData[nalhead_pos++] == 0x00 &&
pData[nalhead_pos++] == 0x01 ){
goto gotnal_head;
}
else
continue;
}
else
continue;
gotnal_head:
naltail_pos = nalhead_pos;
while (naltail_pos<s32DataSize)
{
if(pData[naltail_pos++] == 0x00 &&
pData[naltail_pos++] == 0x00 )
{
if(pData[naltail_pos++] == 0x00 &&
pData[naltail_pos++] == 0x01)
{
s32NalSize = (naltail_pos-4)-nalhead_pos;
break;
}
}
}
if(nalhead_pos<s32DataSize && naltail_pos<s32DataSize){
nalubuffer=(unsigned char*)malloc(s32NalSize);
memset(nalubuffer,0,s32NalSize);
memcpy(nalubuffer,pData+nalhead_pos,s32NalSize);
//SendNalu264(hRtp, nalubuffer,s32NalSize);
test_SendNalu264(hRtp, nalubuffer,s32NalSize);
free(nalubuffer);
nalhead_pos = naltail_pos-4;
}
if(nalhead_pos<s32DataSize && naltail_pos>=s32DataSize){
s32NalSize = s32DataSize -nalhead_pos;
nalubuffer=(unsigned char*)malloc(s32NalSize);
memset(nalubuffer,0,s32NalSize);
memcpy(nalubuffer,pData+nalhead_pos,s32NalSize);
//Se