兼容一些奇怪sdp的rtsp url

This commit is contained in:
xiongziliang 2019-11-21 16:31:50 +08:00
parent e7bd5a4174
commit 54f2c0b53c
5 changed files with 36 additions and 22 deletions

View File

@ -68,6 +68,7 @@ Track::Ptr Factory::getTrackBySdp(const SdpTrack::Ptr &track) {
auto sps = decodeBase64(base64_SPS);
auto pps = decodeBase64(base64_PPS);
if(sps.empty() || pps.empty()){
//如果sdp里面没有sps/pps,那么可能在后续的rtp里面恢复出sps/pps
return std::make_shared<H264Track>();
}
@ -80,6 +81,10 @@ Track::Ptr Factory::getTrackBySdp(const SdpTrack::Ptr &track) {
auto vps = decodeBase64(map["sprop-vps"]);
auto sps = decodeBase64(map["sprop-sps"]);
auto pps = decodeBase64(map["sprop-pps"]);
if(sps.empty() || pps.empty()){
//如果sdp里面没有sps/pps,那么可能在后续的rtp里面恢复出sps/pps
return std::make_shared<H265Track>();
}
return std::make_shared<H265Track>(vps,sps,pps,0,0,0);
}

View File

@ -69,12 +69,18 @@ PlayerBase::PlayerBase() {
///////////////////////////Demuxer//////////////////////////////
bool Demuxer::isInited(int analysisMs) {
if(_ticker.createdTime() < analysisMs){
//analysisMs毫秒内判断条件
//如果音视频都准备好了 说明Track全部就绪
return (_videoTrack && _videoTrack->ready() && _audioTrack && _audioTrack->ready());
if(analysisMs && _ticker.createdTime() > analysisMs){
//analysisMs毫秒后强制初始化完毕
return true;
}
if (_videoTrack && !_videoTrack->ready()) {
//视频未准备好
return false;
}
if (_audioTrack && !_audioTrack->ready()) {
//音频未准备好
return false;
}
//analysisMs毫秒后强制初始化完毕
return true;
}

View File

@ -236,18 +236,10 @@ protected:
}
void onPlayResult(const SockException &ex) override {
if(!_playResultCB){
return;
}
if(ex){
//播放失败,则立即回调
if(_playResultCB) {
_playResultCB(ex);
_playResultCB = nullptr;
return;
}
//播放成功
_playResultCB(ex);
_playResultCB = nullptr;
}
void onResume() override{

View File

@ -61,6 +61,7 @@ protected:
void seekToMilliSecond(uint32_t ms);
protected:
void onMediaData_l(const RtmpPacket::Ptr &chunkData);
//在获取config帧后才触发onPlayResult_l(而不是收到play命令回复)所以此时所有track都初始化完毕了
void onPlayResult_l(const SockException &ex, bool handshakeCompleted);
//form Tcpclient

View File

@ -75,19 +75,29 @@ private:
}
_parser->inputRtp(rtp);
//由于我们重载isInited方法强制认为一旦获取sdp那么就初始化Track成功
//所以我们不需要在后续检验是否初始化成功
//checkInited(0);
if(_maxAnalysisMS && _parser->isInited(_maxAnalysisMS)){
PlayerImp<RtspPlayer,RtspDemuxer>::onPlayResult(SockException(Err_success,"play rtsp success"));
_maxAnalysisMS = 0;
}
}
bool isInited(int analysisMs) override{
//rtsp是通过sdp来完成track的初始化的所以我们强制返回true
//认为已经初始化完毕这样可以提高rtsp打开速度
return true;
//在RtspPlayer中触发onPlayResult事件只是代表收到play回复了
//并不代表所有track初始化成功了(这跟rtmp播放器不一样)
//如果sdp里面信息不完整只能尝试延后从rtp中恢复关键信息并初始化track
//如果超过这个时间还未获取成功那么会强制触发onPlayResult事件(虽然此时有些track还未初始化成功)
void onPlayResult(const SockException &ex) override {
//isInited判断条件无超时
if(_parser->isInited(0)){
//已经初始化成功说明sdp里面有完善的信息
PlayerImp<RtspPlayer,RtspDemuxer>::onPlayResult(ex);
}else{
//还没初始化成功说明sdp里面信息不完善还有一些track未初始化成功
_maxAnalysisMS = (*this)[Client::kMaxAnalysisMS];
}
}
private:
RtspMediaSource::Ptr _pRtspMediaSrc;
int _maxAnalysisMS = 0;
};
} /* namespace mediakit */