diff --git a/src/Common/MediaSink.cpp b/src/Common/MediaSink.cpp index b9d3be98..542131bf 100644 --- a/src/Common/MediaSink.cpp +++ b/src/Common/MediaSink.cpp @@ -25,6 +25,8 @@ */ #include "MediaSink.h" +//最多等待未初始化的Track 10秒,超时之后会忽略未初始化的Track +#define MAX_WAIT_MS 10000 namespace mediakit{ @@ -53,6 +55,7 @@ void MediaSink::addTrack(const Track::Ptr &track_in) { }else{ _allTrackReady = false; _trackReadyCallback[codec_id] = lam; + _ticker.resetTime(); } } @@ -64,8 +67,9 @@ void MediaSink::inputFrame(const Frame::Ptr &frame) { return; } it->second->inputFrame(frame); + if(!_allTrackReady && !_trackReadyCallback.empty() && it->second->ready()){ - //Track由未就绪状态装换成就绪状态,我们就生成sdp以及rtp编码器 + //Track由未就绪状态装换成就绪状态,我们就触发onTrackReady回调 auto it_callback = _trackReadyCallback.find(codec_id); if(it_callback != _trackReadyCallback.end()){ it_callback->second(); @@ -73,9 +77,26 @@ void MediaSink::inputFrame(const Frame::Ptr &frame) { } } - if(!_allTrackReady && _trackReadyCallback.empty()){ + if(!_allTrackReady && (_trackReadyCallback.empty() || _ticker.elapsedTime() > MAX_WAIT_MS)){ _allTrackReady = true; - onAllTrackReady(); + + if(!_trackReadyCallback.empty()){ + //这是超时强制忽略未准备好的Track + _trackReadyCallback.clear(); + //移除未准备好的Track + for(auto it = _track_map.begin() ; it != _track_map.end() ; ){ + if(!it->second->ready()){ + it = _track_map.erase(it); + continue; + } + ++it; + } + } + + if(!_track_map.empty()){ + //最少有一个有效的Track + onAllTrackReady(); + } } } @@ -83,11 +104,14 @@ bool MediaSink::isAllTrackReady() const { return _allTrackReady; } -Track::Ptr MediaSink::getTrack(TrackType type) const { +Track::Ptr MediaSink::getTrack(TrackType type,bool trackReady) const { lock_guard lck(_mtx); for (auto &pr : _track_map){ if(pr.second->getTrackType() == type){ - return pr.second; + if(!trackReady){ + return pr.second; + } + return pr.second->ready() ? pr.second : nullptr; } } return nullptr; diff --git a/src/Common/MediaSink.h b/src/Common/MediaSink.h index 0963f73d..44712096 100644 --- a/src/Common/MediaSink.h +++ b/src/Common/MediaSink.h @@ -29,6 +29,7 @@ #include #include +#include "Util/TimeTicker.h" #include "Extension/Frame.h" #include "Extension/Track.h" @@ -70,10 +71,11 @@ public: /** * 获取特定类型的Track - * @param type + * @param type track类型 + * @param trackReady 是否获取已经准备好的Track * @return */ - Track::Ptr getTrack(TrackType type) const ; + Track::Ptr getTrack(TrackType type,bool trackReady = true) const ; protected: /** * 某track已经准备好,其ready()状态返回true, @@ -97,6 +99,7 @@ private: map _track_map; map > _trackReadyCallback; bool _allTrackReady = false; + Ticker _ticker; };