diff --git a/src/Common/MediaSink.cpp b/src/Common/MediaSink.cpp index f579f122..048f98e4 100644 --- a/src/Common/MediaSink.cpp +++ b/src/Common/MediaSink.cpp @@ -59,6 +59,7 @@ void MediaSink::resetTracks() { _track_map.clear(); _trackReadyCallback.clear(); _ticker.resetTime(); + _max_track_size = 2; } void MediaSink::inputFrame(const Frame::Ptr &frame) { @@ -82,7 +83,7 @@ void MediaSink::inputFrame(const Frame::Ptr &frame) { if(!_allTrackReady){ if(_ticker.elapsedTime() > MAX_WAIT_MS_READY){ //如果超过规定时间,那么不再等待并忽略未准备好的Track - addTrackCompleted(); + emitAllTrackReady(); return; } @@ -91,21 +92,26 @@ void MediaSink::inputFrame(const Frame::Ptr &frame) { return; } - if(_track_map.size() == 2){ + if(_track_map.size() == _max_track_size){ //如果已经添加了音视频Track,并且不存在未准备好的Track,那么说明所有Track都准备好了 - addTrackCompleted(); + emitAllTrackReady(); return; } if(_track_map.size() == 1 && _ticker.elapsedTime() > MAX_WAIT_MS_ADD_TRACK){ //如果只有一个Track,那么在该Track添加后,我们最多还等待若干时间(可能后面还会添加Track) - addTrackCompleted(); + emitAllTrackReady(); return; } } } -void MediaSink::addTrackCompleted() { +void MediaSink::addTrackCompleted(){ + lock_guard lck(_mtx); + _max_track_size = _track_map.size(); +} + +void MediaSink::emitAllTrackReady() { if (_allTrackReady) { return; } diff --git a/src/Common/MediaSink.h b/src/Common/MediaSink.h index 832bbe9c..02bf1460 100644 --- a/src/Common/MediaSink.h +++ b/src/Common/MediaSink.h @@ -116,12 +116,18 @@ protected: * @param frame */ virtual void onTrackFrame(const Frame::Ptr &frame) {}; +private: + /** + * 触发onAllTrackReady事件 + */ + void emitAllTrackReady(); private: mutable recursive_mutex _mtx; map _track_map; map > _trackReadyCallback; bool _allTrackReady = false; Ticker _ticker; + int _max_track_size = 2; }; diff --git a/src/Player/PlayerProxy.cpp b/src/Player/PlayerProxy.cpp index 6b5fca6e..1ba1d1b7 100644 --- a/src/Player/PlayerProxy.cpp +++ b/src/Player/PlayerProxy.cpp @@ -291,6 +291,9 @@ void PlayerProxy::onPlaySuccess() { audioMaker->addDelegate(_mediaMuxer); } + //添加完毕所有track,防止单track情况下最大等待3秒 + _mediaMuxer->addTrackCompleted(); + if(_pMediaSrc){ _pMediaSrc->setTrackSource(_mediaMuxer); } diff --git a/src/Record/MP4Reader.cpp b/src/Record/MP4Reader.cpp index 020fa6bc..3fd552b4 100644 --- a/src/Record/MP4Reader.cpp +++ b/src/Record/MP4Reader.cpp @@ -151,6 +151,9 @@ MP4Reader::MP4Reader(const string &strVhost,const string &strApp, const string & H264Track::Ptr track = std::make_shared(_strSps,_strPps); _mediaMuxer->addTrack(track); } + + //添加完毕所有track,防止单track情况下最大等待3秒 + _mediaMuxer->addTrackCompleted(); }