Darwin Streaming Server 支持UDP穿透

本文介绍了一种通过修改Darwin开源流媒体服务器中的RTPStream.cpp文件来实现RTSP协议下客户端在NAT环境中的点播直播功能。文章详细展示了如何调整代码以确保RTCP和RTP包能够正确地穿过NAT设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

就是RTPStream.cpp

RTPStream::Write 方法

现实修改RTCP部分

 
  1. if ( fTransportType == qtssRTPTransportTypeTCP )// write out in interleave format on the RTSP TCP channel 
  2.     err = this->InterleavedWrite( thePacket->packetData, inLen, outLenWritten, fRTCPChannel ); 
  3. else if ( inLen > 0 ) 
  4.     (void)fSockets->GetSocketB()->SendTo(fRemoteAddr, fRemoteRTCPPort, thePacket->packetData, inLen); 

修改为

 
  1. if ( fTransportType == qtssRTPTransportTypeTCP )// write out in interleave format on the RTSP TCP channel 
  2.     err = this->InterleavedWrite( thePacket->packetData, inLen, outLenWritten, fRTCPChannel ); 
  3. else if ( inLen > 0 ) 
  4. UInt32 iRemoteAddr=0; 
  5. UInt16 iRemotePort=0; 
  6. char szBuff[64]; 
  7. UInt32 iBufLen=sizeof(szBuff); 
  8. UInt32 iRecvLen=0; 
  9. (void)fSockets->GetSocketB()->RecvFrom(&iRemoteAddr,&iRemotePort,szBuff,iBufLen,&iRecvLen); 
  10. if (iRemoteAddr==fRemoteAddr 
  11.     &&iRemotePort!=0 
  12.     &&iRecvLen>0) 
  13.     fRemoteRTCPPort=iRemotePort; 
  14.  
  15.     (void)fSockets->GetSocketB()->SendTo(fRemoteAddr, fRemoteRTCPPort, thePacket->packetData, inLen); 

以类似的方法修改RTP的发送部分

 

转自 http://www.rosoo.net/a/201104/11322.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值