Commit 585201ec by xiongziliang

修复接收rtsp推流的兼容性问题

parent 1a3afcee
...@@ -48,7 +48,7 @@ bool RtpReceiver::handleOneRtp(int track_index,SdpTrack::Ptr &track, unsigned ch ...@@ -48,7 +48,7 @@ bool RtpReceiver::handleOneRtp(int track_index,SdpTrack::Ptr &track, unsigned ch
auto &rtp = *rtp_ptr; auto &rtp = *rtp_ptr;
auto length = rtp_raw_len + 4; auto length = rtp_raw_len + 4;
rtp.interleaved = track->_interleaved; rtp.interleaved = 2 * track->_type;
rtp.mark = rtp_raw_ptr[1] >> 7; rtp.mark = rtp_raw_ptr[1] >> 7;
rtp.PT = rtp_raw_ptr[1] & 0x7F; rtp.PT = rtp_raw_ptr[1] & 0x7F;
//序列号 //序列号
......
...@@ -587,10 +587,9 @@ void RtspSession::handleReq_Setup(const Parser &parser) { ...@@ -587,10 +587,9 @@ void RtspSession::handleReq_Setup(const Parser &parser) {
throw SockException(Err_shutdown, "can not setup one track twice"); throw SockException(Err_shutdown, "can not setup one track twice");
} }
trackRef->_inited = true; //现在初始化 trackRef->_inited = true; //现在初始化
trackRef->_interleaved = trackRef->_type * 2;
if(_rtpType == Rtsp::RTP_Invalid){ if(_rtpType == Rtsp::RTP_Invalid){
auto strTransport = parser["Transport"]; auto &strTransport = parser["Transport"];
if(strTransport.find("TCP") != string::npos){ if(strTransport.find("TCP") != string::npos){
_rtpType = Rtsp::RTP_TCP; _rtpType = Rtsp::RTP_TCP;
}else if(strTransport.find("multicast") != string::npos){ }else if(strTransport.find("multicast") != string::npos){
...@@ -605,9 +604,22 @@ void RtspSession::handleReq_Setup(const Parser &parser) { ...@@ -605,9 +604,22 @@ void RtspSession::handleReq_Setup(const Parser &parser) {
switch (_rtpType) { switch (_rtpType) {
case Rtsp::RTP_TCP: { case Rtsp::RTP_TCP: {
if(_pushSrc){
//rtsp推流时,interleaved由推流者决定
auto key_values = Parser::parseArgs(parser["Transport"],";","=");
int interleaved_rtp = -1 , interleaved_rtcp = -1;
if(2 == sscanf(key_values["interleaved"].data(),"%d-%d",&interleaved_rtp,&interleaved_rtcp)){
trackRef->_interleaved = interleaved_rtp;
}else{
throw SockException(Err_shutdown, "can not find interleaved when setup of rtp over tcp");
}
}else{
//rtsp播放时,由于数据共享分发,所以interleaved必须由服务器决定
trackRef->_interleaved = 2 * trackRef->_type;
}
sendRtspResponse("200 OK", sendRtspResponse("200 OK",
{"Transport",StrPrinter << "RTP/AVP/TCP;unicast;" {"Transport",StrPrinter << "RTP/AVP/TCP;unicast;"
<< "interleaved=" << trackRef->_type * 2 << "-" << trackRef->_type * 2 + 1 << ";" << "interleaved=" << (int)trackRef->_interleaved << "-" << (int)trackRef->_interleaved + 1 << ";"
<< "ssrc=" << printSSRC(trackRef->_ssrc), << "ssrc=" << printSSRC(trackRef->_ssrc),
"x-Transport-Options" , "late-tolerance=1.400000", "x-Transport-Options" , "late-tolerance=1.400000",
"x-Dynamic-Rate" , "1" "x-Dynamic-Rate" , "1"
...@@ -1134,7 +1146,7 @@ void RtspSession::sendRtpPacket(const RtpPacket::Ptr & pkt) { ...@@ -1134,7 +1146,7 @@ void RtspSession::sendRtpPacket(const RtpPacket::Ptr & pkt) {
} }
#if RTSP_SERVER_SEND_RTCP #if RTSP_SERVER_SEND_RTCP
int iTrackIndex = getTrackIndexByInterleaved(pkt->interleaved); int iTrackIndex = getTrackIndexByTrackType(pkt->type);
if(iTrackIndex == -1){ if(iTrackIndex == -1){
return; return;
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论