织梦CMS - 轻松建站从此开始!

罗索

Darwin Streaming Server 支持UDP穿透

jackyhwei 发布于 2011-06-27 16:08 点击:次 
项目要求使用RTSP协议进行点播直播,找了很多开源流媒体服务器,最后决定使用Drawin做服务器。但是在部署中发现,Drawin不支持Client在NAT后面的情况。 尽管RTSP Client已经发出了RTSP的打洞包。还好, Darwin 是开源的 ,直接上手修改代码。
TAG:

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

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

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

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

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

就是RTPStream.cpp

RTPStream::Write 方法

现实修改RTCP部分

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

修改为

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

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

  1. if ( fTransportType == qtssRTPTransportTypeTCP )
  2.  // write out in interleave format on the RTSP TCP channel 
  3.     err = this->InterleavedWrite( thePacket->packetData, inLen
  4. , outLenWritten, fRTPChannel );        
  5. else if ( fTransportType == qtssRTPTransportTypeReliableUDP ) 
  6.     err = this->ReliableRTPWrite( thePacket->packetData, inLen
  7. , theCurrentPacketDelay ); 
  8. else if ( inLen > 0 ) 
  9.     (void)fSockets->GetSocketA()->SendTo(fRemoteAddr, fRemoteRTPPort
  10. , thePacket->packetData, inLen); 

 

(zblue78)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201104/11322.html]
本文出处:CSDN博客 作者:zblue78
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容