項目要求使用RTSP協議進行點播直播,
找了很多開源流媒體服務器,最後決定使用Drawin做服務器。
但是在部署中發現,Drawin不支持Client在NAT後面的情況。 儘管RTSP Client已經發出了RTSP的打洞包。
還好, Darwin 是開源的 ,直接上手修改代碼。
其實修改的部分很少,也很簡單。
就是RTPStream.cpp
RTPStream::Write 方法
現實修改RTCP部分
if ( fTransportType == qtssRTPTransportTypeTCP )// write out in interleave format on the RTSP TCP channel
{
err = this->InterleavedWrite( thePacket->packetData, inLen, outLenWritten, fRTCPChannel );
}
else if ( inLen > 0 )
{
(void)fSockets->GetSocketB()->SendTo(fRemoteAddr, fRemoteRTCPPort, thePacket->packetData, inLen);
}
修改爲
if ( fTransportType == qtssRTPTransportTypeTCP )// write out in interleave format on the RTSP TCP channel
{
err = this->InterleavedWrite( thePacket->packetData, inLen, outLenWritten, fRTCPChannel );
}
else if ( inLen > 0 )
{
UInt32 iRemoteAddr=0;
UInt16 iRemotePort=0;
char szBuff[64];
UInt32 iBufLen=sizeof(szBuff);
UInt32 iRecvLen=0;
(void)fSockets->GetSocketB()->RecvFrom(&iRemoteAddr,&iRemotePort,szBuff,iBufLen,&iRecvLen);
if (iRemoteAddr==fRemoteAddr
&&iRemotePort!=0
&&iRecvLen>0)
{
fRemoteRTCPPort=iRemotePort;
}
(void)fSockets->GetSocketB()->SendTo(fRemoteAddr, fRemoteRTCPPort, thePacket->packetData, inLen);
}
以類似的方法修改RTP的發送部分
if ( fTransportType == qtssRTPTransportTypeTCP ) // write out in interleave format on the RTSP TCP channel
err = this->InterleavedWrite( thePacket->packetData, inLen, outLenWritten, fRTPChannel );
else if ( fTransportType == qtssRTPTransportTypeReliableUDP )
err = this->ReliableRTPWrite( thePacket->packetData, inLen, theCurrentPacketDelay );
else if ( inLen > 0 )
(void)fSockets->GetSocketA()->SendTo(fRemoteAddr, fRemoteRTPPort, thePacket->packetData, inLen);