Darwin Streaming Server 支持UDP穿透

项目要求使用RTSP协议进行点播直播,

找了很多开源流媒体服务器,最后决定使用Drawin做服务器。

但是在部署中发现,Drawin不支持Client在NAT后面的情况。 尽管RTSP Client已经发出了RTSP的打洞包。

还好, Darwin 是开源的 ,直接上手修改代码。

其实修改的部分很少,也很简单。

就是RTPStream.cpp

RTPStream::Write 方法

现实修改RTCP部分

+ expand sourceview plaincopy to clipboardprint?
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 )
        {
            (void)fSockets->GetSocketB()->SendTo(fRemoteAddr, fRemoteRTCPPort, thePacket->packetData, inLen);
        }

修改为

view plaincopy to clipboardprint?
01.     if ( fTransportType == qtssRTPTransportTypeTCP )// write out in interleave format on the RTSP TCP channel  
02.     {  
03.         err = this->InterleavedWrite( thePacket->packetData, inLen, outLenWritten, fRTCPChannel );  
04.     }  
05.     else if ( inLen > 0 )  
06.     {  
07.UInt32 iRemoteAddr=0;  
08.UInt16 iRemotePort=0;  
09.char szBuff[64];  
10.UInt32 iBufLen=sizeof(szBuff);  
11.UInt32 iRecvLen=0;  
12.(void)fSockets->GetSocketB()->RecvFrom(&iRemoteAddr,&iRemotePort,szBuff,iBufLen,&iRecvLen);  
13.if (iRemoteAddr==fRemoteAddr  
14.    &&iRemotePort!=0  
15.    &&iRecvLen>0)  
16.{  
17.    fRemoteRTCPPort=iRemotePort;  
18.}  
19. 
20.         (void)fSockets->GetSocketB()->SendTo(fRemoteAddr, fRemoteRTCPPort, thePacket->packetData, inLen);  
21.     } 
        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的发送部分

view plaincopy to clipboardprint?
01.if ( fTransportType == qtssRTPTransportTypeTCP )    // write out in interleave format on the RTSP TCP channel  
02.    err = this->InterleavedWrite( thePacket->packetData, inLen, outLenWritten, fRTPChannel );         
03.else if ( fTransportType == qtssRTPTransportTypeReliableUDP )  
04.    err = this->ReliableRTPWrite( thePacket->packetData, inLen, theCurrentPacketDelay );  
05.else if ( inLen > 0 )  
06.    (void)fSockets->GetSocketA()->SendTo(fRemoteAddr, fRemoteRTPPort, thePacket->packetData, inLen);


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zblue78/archive/2010/06/24/5692595.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值