Commit 585201ec by xiongziliang

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

parent 1a3afcee
......@@ -48,7 +48,7 @@ bool RtpReceiver::handleOneRtp(int track_index,SdpTrack::Ptr &track, unsigned ch
auto &rtp = *rtp_ptr;
auto length = rtp_raw_len + 4;
rtp.interleaved = track->_interleaved;
rtp.interleaved = 2 * track->_type;
rtp.mark = rtp_raw_ptr[1] >> 7;
rtp.PT = rtp_raw_ptr[1] & 0x7F;
//序列号
......
......@@ -587,10 +587,9 @@ void RtspSession::handleReq_Setup(const Parser &parser) {
throw SockException(Err_shutdown, "can not setup one track twice");
}
trackRef->_inited = true; //现在初始化
trackRef->_interleaved = trackRef->_type * 2;
if(_rtpType == Rtsp::RTP_Invalid){
auto strTransport = parser["Transport"];
auto &strTransport = parser["Transport"];
if(strTransport.find("TCP") != string::npos){
_rtpType = Rtsp::RTP_TCP;
}else if(strTransport.find("multicast") != string::npos){
......@@ -600,14 +599,27 @@ void RtspSession::handleReq_Setup(const Parser &parser) {
}
}
//允许接收rtp、rtcp包
//允许接收rtp、rtcp包
RtspSplitter::enableRecvRtp(_rtpType == Rtsp::RTP_TCP);
switch (_rtpType) {
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",
{"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),
"x-Transport-Options" , "late-tolerance=1.400000",
"x-Dynamic-Rate" , "1"
......@@ -1134,7 +1146,7 @@ void RtspSession::sendRtpPacket(const RtpPacket::Ptr & pkt) {
}
#if RTSP_SERVER_SEND_RTCP
int iTrackIndex = getTrackIndexByInterleaved(pkt->interleaved);
int iTrackIndex = getTrackIndexByTrackType(pkt->type);
if(iTrackIndex == -1){
return;
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论