From 0efe7a26b5d7fc9254a8288bbc1164ad9b95c43f Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 16 Nov 2018 18:46:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BD=AC=E7=A0=81=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=A4=B1=E8=B4=A5=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Player/PlayerBase.cpp | 36 +++++++++++++++++--------------- src/Player/PlayerBase.h | 30 ++++++++++++++------------ src/Rtmp/RtmpToRtspMediaSource.h | 2 +- src/Rtsp/RtspToRtmpMediaSource.h | 2 +- 4 files changed, 38 insertions(+), 32 deletions(-) diff --git a/src/Player/PlayerBase.cpp b/src/Player/PlayerBase.cpp index 4a8738e3..14b2295d 100644 --- a/src/Player/PlayerBase.cpp +++ b/src/Player/PlayerBase.cpp @@ -52,33 +52,35 @@ PlayerBase::Ptr PlayerBase::createPlayer(const char* strUrl) { } ///////////////////////////Demuxer////////////////////////////// -bool Demuxer::isInited() { - if(_ticker.createdTime() < 500){ - //500毫秒内判断条件 +bool Demuxer::isInited(int analysisMs) { + if(_ticker.createdTime() < analysisMs){ + //analysisMs毫秒内判断条件 //如果音视频都准备好了 ,说明Track全部就绪 return (_videoTrack && _videoTrack->ready() && _audioTrack && _audioTrack->ready()); } - - //500毫秒之后,去除还未就绪的Track - if(_videoTrack && !_videoTrack->ready()){ - //有视频但是视频未就绪 - _videoTrack = nullptr; - } - - if(_audioTrack && !_audioTrack->ready()){ - //有音频但是音频未就绪 - _audioTrack = nullptr; - } + //analysisMs毫秒后强制初始化完毕 return true; } -vector Demuxer::getTracks() const { +vector Demuxer::getTracks(bool trackReady) const { vector ret; if(_videoTrack){ - ret.emplace_back(_videoTrack); + if(trackReady){ + if(_videoTrack->ready()){ + ret.emplace_back(_videoTrack); + } + }else{ + ret.emplace_back(_videoTrack); + } } if(_audioTrack){ - ret.emplace_back(_audioTrack); + if(trackReady){ + if(_audioTrack->ready()){ + ret.emplace_back(_audioTrack); + } + }else{ + ret.emplace_back(_audioTrack); + } } return ret; } diff --git a/src/Player/PlayerBase.h b/src/Player/PlayerBase.h index 3f31e314..f547adeb 100644 --- a/src/Player/PlayerBase.h +++ b/src/Player/PlayerBase.h @@ -53,23 +53,26 @@ public: /** * 是否初始化完毕,完毕后方可调用getTrack方法 + * @param analysisMs 数据流最大分析时间 单位毫秒 * @return */ - virtual bool isInited() { return true; } + virtual bool isInited(int analysisMs = 2000) { return true; } /** * 获取全部的Track + * @param trackReady 是否获取全部已经准备好的Track * @return */ - virtual vector getTracks() const { return vector();} + virtual vector getTracks(bool trackReady = true) const { return vector();} /** * 获取特定Track - * @param type + * @param type track类型 + * @param trackReady 是否获取全部已经准备好的Track * @return */ - virtual Track::Ptr getTrack(TrackType type) const { - auto tracks = getTracks(); + virtual Track::Ptr getTrack(TrackType type , bool trackReady = true) const { + auto tracks = getTracks(trackReady); for(auto &track : tracks){ if(track->getTrackType() == type){ return track; @@ -183,11 +186,11 @@ public: _playResultCB = cb; } - bool isInited() override{ + bool isInited(int analysisMs = 2000) override{ if (_parser) { - return _parser->isInited(); + return _parser->isInited(analysisMs); } - return PlayerBase::isInited(); + return PlayerBase::isInited(analysisMs); } float getDuration() const override { if (_parser) { @@ -215,11 +218,11 @@ public: _pMediaSrc = src; } - vector getTracks() const override{ + vector getTracks(bool trackReady = true) const override{ if (_parser) { - return _parser->getTracks(); + return _parser->getTracks(trackReady); } - return PlayerBase::getTracks(); + return PlayerBase::getTracks(trackReady); } protected: void onShutdown(const SockException &ex) override { @@ -278,15 +281,16 @@ public: * * 在构造RtmpDemuxer对象时是无法获取sps pps aac_cfg等这些信息, * 所以要调用inputRtmp后才会获取到这些信息,这时才初始化成功 + * @param analysisMs 数据流最大分析时间 单位毫秒 * @return */ - bool isInited() override; + bool isInited(int analysisMs = 2000) override; /** * 获取所有可用Track,请在isInited()返回true时调用 * @return */ - vector getTracks() const override; + vector getTracks(bool trackReady = true) const override; /** * 获取节目总时长 diff --git a/src/Rtmp/RtmpToRtspMediaSource.h b/src/Rtmp/RtmpToRtspMediaSource.h index 3e53a488..5fd30d8b 100644 --- a/src/Rtmp/RtmpToRtspMediaSource.h +++ b/src/Rtmp/RtmpToRtspMediaSource.h @@ -72,7 +72,7 @@ public: getId(), std::make_shared( _rtmpDemuxer->getDuration())); - for (auto &track : _rtmpDemuxer->getTracks()){ + for (auto &track : _rtmpDemuxer->getTracks(false)){ _rtspMuxer->addTrack(track); _recorder->addTrack(track); track->addDelegate(_rtspMuxer); diff --git a/src/Rtsp/RtspToRtmpMediaSource.h b/src/Rtsp/RtspToRtmpMediaSource.h index e715b9e3..92b2c3b6 100644 --- a/src/Rtsp/RtspToRtmpMediaSource.h +++ b/src/Rtsp/RtspToRtmpMediaSource.h @@ -66,7 +66,7 @@ public: getId(), std::make_shared( _rtspDemuxer->getDuration())); - for (auto &track : _rtspDemuxer->getTracks()) { + for (auto &track : _rtspDemuxer->getTracks(false)) { _rtmpMuxer->addTrack(track); _recorder->addTrack(track); track->addDelegate(_rtmpMuxer);