Darwin Streaming Server 支持UDP穿透

項目要求使用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);


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章