From ef0371ef948ec50b421c767d126c8427848e1374 Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Tue, 20 Apr 2021 17:32:22 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/MultiMediaSourceMuxer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Common/MultiMediaSourceMuxer.cpp b/src/Common/MultiMediaSourceMuxer.cpp index 52e34657..7d707008 100644 --- a/src/Common/MultiMediaSourceMuxer.cpp +++ b/src/Common/MultiMediaSourceMuxer.cpp @@ -308,7 +308,7 @@ void MultiMediaSourceMuxer::setTrackListener(const std::weak_ptrtotalReaderCount() + _rtp_sender.size(); + return _muxer->totalReaderCount() + (int)_rtp_sender.size(); #else return _muxer->totalReaderCount(); #endif From 9b951ab69a029524f7c33c8b7d73c108a2864cf8 Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Tue, 20 Apr 2021 17:32:40 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=8D=95track=E6=83=85=E5=86=B5=E4=B8=8B?= =?UTF-8?q?=E6=9C=80=E5=A4=9A=E7=AD=89=E5=BE=853=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/MediaSink.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Common/MediaSink.cpp b/src/Common/MediaSink.cpp index 782b6e3b..96e5427b 100644 --- a/src/Common/MediaSink.cpp +++ b/src/Common/MediaSink.cpp @@ -13,8 +13,8 @@ //最多等待未初始化的Track 10秒,超时之后会忽略未初始化的Track #define MAX_WAIT_MS_READY 10000 -//如果添加Track,最多等待5秒 -#define MAX_WAIT_MS_ADD_TRACK 5000 +//如果直播流只有单Track,最多等待3秒,超时后未收到其他Track的数据,则认为是单Track +#define MAX_WAIT_MS_ADD_TRACK 3000 namespace mediakit{ From 0bb87858a3b0f19435e2be65669905d92bceed36 Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Tue, 20 Apr 2021 17:53:43 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=8F=90=E5=8D=87=E5=8D=95track=E6=83=85?= =?UTF-8?q?=E5=86=B5=E4=B8=8B=E7=A7=92=E5=BC=80=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/MediaSink.h | 33 +++++++++++++++++++++------------ src/Player/PlayerBase.cpp | 18 +++++++++++++++--- src/Player/PlayerBase.h | 29 +++++++++++++---------------- src/Rtmp/RtmpDemuxer.cpp | 9 +++++++-- src/Rtmp/RtmpMediaSourceImp.h | 19 +++++++++++++++++-- src/Rtsp/RtspDemuxer.cpp | 7 +++++-- src/Rtsp/RtspMediaSourceImp.h | 19 +++++++++++++++++-- 7 files changed, 95 insertions(+), 39 deletions(-) diff --git a/src/Common/MediaSink.h b/src/Common/MediaSink.h index 129545c6..af585298 100644 --- a/src/Common/MediaSink.h +++ b/src/Common/MediaSink.h @@ -22,12 +22,10 @@ using namespace toolkit; namespace mediakit{ -class MediaSinkInterface : public FrameWriterInterface { +class TrackListener { public: - typedef std::shared_ptr Ptr; - - MediaSinkInterface(){}; - virtual ~MediaSinkInterface(){}; + TrackListener() = default; + virtual ~TrackListener() = default; /** * 添加track,内部会调用Track的clone方法 @@ -37,25 +35,33 @@ public: virtual void addTrack(const Track::Ptr & track) = 0; /** - * 添加所有Track完毕 + * 添加track完毕 */ - virtual void addTrackCompleted() {} + virtual void addTrackCompleted() {}; /** * 重置track */ - virtual void resetTracks() = 0; + virtual void resetTracks() {}; +}; + +class MediaSinkInterface : public FrameWriterInterface, public TrackListener { +public: + typedef std::shared_ptr Ptr; + + MediaSinkInterface() = default; + ~MediaSinkInterface() override = default; }; /** * 该类的作用是等待Track ready()返回true也就是就绪后再通知派生类进行下一步的操作 * 目的是输入Frame前由Track截取处理下,以便获取有效的信息(譬如sps pps aa_cfg) */ -class MediaSink : public MediaSinkInterface , public TrackSource{ +class MediaSink : public MediaSinkInterface, public TrackSource{ public: typedef std::shared_ptr Ptr; - MediaSink(){} - virtual ~MediaSink(){} + MediaSink() = default; + ~MediaSink() override = default; /** * 输入frame @@ -86,7 +92,8 @@ public: * 获取所有Track * @param trackReady 是否获取已经准备好的Track */ - vector getTracks(bool trackReady = true) const override ; + vector getTracks(bool trackReady = true) const override; + protected: /** * 某track已经准备好,其ready()状态返回true, @@ -105,6 +112,7 @@ protected: * @param frame */ virtual void onTrackFrame(const Frame::Ptr &frame) {}; + private: /** * 触发onAllTrackReady事件 @@ -116,6 +124,7 @@ private: */ void checkTrackIfReady(const Track::Ptr &track); void checkTrackIfReady_l(const Track::Ptr &track); + private: bool _all_track_ready = false; size_t _max_track_size = 2; diff --git a/src/Player/PlayerBase.cpp b/src/Player/PlayerBase.cpp index 289c01ef..1cd4d6f1 100644 --- a/src/Player/PlayerBase.cpp +++ b/src/Player/PlayerBase.cpp @@ -106,13 +106,25 @@ float Demuxer::getDuration() const { return _fDuration; } -void Demuxer::onAddTrack(const Track::Ptr &track){ +void Demuxer::addTrack(const Track::Ptr &track){ if(_listener){ - _listener->onAddTrack(track); + _listener->addTrack(track); } } -void Demuxer::setTrackListener(Demuxer::Listener *listener) { +void Demuxer::addTrackCompleted(){ + if(_listener){ + _listener->addTrackCompleted(); + } +} + +void Demuxer::resetTracks() { + if (_listener) { + _listener->resetTracks(); + } +} + +void Demuxer::setTrackListener(TrackListener *listener) { _listener = listener; } diff --git a/src/Player/PlayerBase.h b/src/Player/PlayerBase.h index adf12ccf..f1762a37 100644 --- a/src/Player/PlayerBase.h +++ b/src/Player/PlayerBase.h @@ -19,6 +19,7 @@ #include "Util/mini.h" #include "Util/RingBuffer.h" #include "Common/MediaSource.h" +#include "Common/MediaSink.h" #include "Extension/Frame.h" #include "Extension/Track.h" using namespace toolkit; @@ -227,18 +228,10 @@ protected: MediaSource::Ptr _pMediaSrc; }; - -class Demuxer : public PlayerBase{ +class Demuxer : public PlayerBase, public TrackListener{ public: - class Listener{ - public: - Listener() = default; - virtual ~Listener() = default; - virtual void onAddTrack(const Track::Ptr &track) = 0; - }; - - Demuxer(){}; - virtual ~Demuxer(){}; + Demuxer() = default; + ~Demuxer() override = default; /** * 返回是否完成初始化完毕 @@ -267,15 +260,19 @@ public: /** * 设置track监听器 */ - void setTrackListener(Listener *listener); + void setTrackListener(TrackListener *listener); + protected: - void onAddTrack(const Track::Ptr &track); + void addTrack(const Track::Ptr &track) override; + void addTrackCompleted() override; + void resetTracks() override; + protected: - Listener *_listener = nullptr; + float _fDuration = 0; + Ticker _ticker; AudioTrack::Ptr _audioTrack; VideoTrack::Ptr _videoTrack; - Ticker _ticker; - float _fDuration = 0; + TrackListener *_listener = nullptr; }; } /* namespace mediakit */ diff --git a/src/Rtmp/RtmpDemuxer.cpp b/src/Rtmp/RtmpDemuxer.cpp index 38cffe8c..4b82e8a0 100644 --- a/src/Rtmp/RtmpDemuxer.cpp +++ b/src/Rtmp/RtmpDemuxer.cpp @@ -72,6 +72,11 @@ bool RtmpDemuxer::loadMetaData(const AMFValue &val){ } catch (std::exception &ex) { WarnL << ex.what(); } + + if (ret) { + //metadata中存在track相关的描述,那么我们根据metadata判断有多少个track + addTrackCompleted(); + } return ret; } @@ -114,7 +119,7 @@ void RtmpDemuxer::makeVideoTrack(const AMFValue &videoCodec, int bit_rate) { if (_video_rtmp_decoder) { //设置rtmp解码器代理,生成的frame写入该Track _video_rtmp_decoder->addDelegate(_videoTrack); - onAddTrack(_videoTrack); + addTrack(_videoTrack); _try_get_video_track = true; } else { //找不到相应的rtmp解码器,该track无效 @@ -133,7 +138,7 @@ void RtmpDemuxer::makeAudioTrack(const AMFValue &audioCodec,int sample_rate, int if (_audio_rtmp_decoder) { //设置rtmp解码器代理,生成的frame写入该Track _audio_rtmp_decoder->addDelegate(_audioTrack); - onAddTrack(_audioTrack); + addTrack(_audioTrack); _try_get_audio_track = true; } else { //找不到相应的rtmp解码器,该track无效 diff --git a/src/Rtmp/RtmpMediaSourceImp.h b/src/Rtmp/RtmpMediaSourceImp.h index 350a7812..88c95065 100644 --- a/src/Rtmp/RtmpMediaSourceImp.h +++ b/src/Rtmp/RtmpMediaSourceImp.h @@ -27,7 +27,7 @@ using namespace std; using namespace toolkit; namespace mediakit { -class RtmpMediaSourceImp: public RtmpMediaSource, public Demuxer::Listener , public MultiMediaSourceMuxer::Listener { +class RtmpMediaSourceImp: public RtmpMediaSource, public TrackListener , public MultiMediaSourceMuxer::Listener { public: typedef std::shared_ptr Ptr; @@ -97,13 +97,28 @@ public: /** * _demuxer触发的添加Track事件 */ - void onAddTrack(const Track::Ptr &track) override { + void addTrack(const Track::Ptr &track) override { if(_muxer){ _muxer->addTrack(track); track->addDelegate(_muxer); } } + /** + * _demuxer触发的Track添加完毕事件 + */ + void addTrackCompleted() override { + if (_muxer) { + _muxer->addTrackCompleted(); + } + } + + void resetTracks() override { + if (_muxer) { + _muxer->resetTracks(); + } + } + /** * _muxer触发的所有Track就绪的事件 */ diff --git a/src/Rtsp/RtspDemuxer.cpp b/src/Rtsp/RtspDemuxer.cpp index 151e51d9..d82ddfc8 100644 --- a/src/Rtsp/RtspDemuxer.cpp +++ b/src/Rtsp/RtspDemuxer.cpp @@ -38,6 +38,9 @@ void RtspDemuxer::loadSdp(const SdpParser &attr) { break; } } + //rtsp能通过sdp立即知道有多少个track + addTrackCompleted(); + auto titleTrack = attr.getTrack(TrackTitle); if(titleTrack){ _fDuration = titleTrack->_duration; @@ -83,7 +86,7 @@ void RtspDemuxer::makeAudioTrack(const SdpTrack::Ptr &audio) { if(_audioRtpDecoder){ //设置rtp解码器代理,生成的frame写入该Track _audioRtpDecoder->addDelegate(_audioTrack); - onAddTrack(_audioTrack); + addTrack(_audioTrack); } else{ //找不到相应的rtp解码器,该track无效 _audioTrack.reset(); @@ -101,7 +104,7 @@ void RtspDemuxer::makeVideoTrack(const SdpTrack::Ptr &video) { if(_videoRtpDecoder){ //设置rtp解码器代理,生成的frame写入该Track _videoRtpDecoder->addDelegate(_videoTrack); - onAddTrack(_videoTrack); + addTrack(_videoTrack); }else{ //找不到相应的rtp解码器,该track无效 _videoTrack.reset(); diff --git a/src/Rtsp/RtspMediaSourceImp.h b/src/Rtsp/RtspMediaSourceImp.h index 4ecc93b7..8ca3df5a 100644 --- a/src/Rtsp/RtspMediaSourceImp.h +++ b/src/Rtsp/RtspMediaSourceImp.h @@ -18,7 +18,7 @@ using namespace toolkit; namespace mediakit { -class RtspMediaSourceImp : public RtspMediaSource, public Demuxer::Listener , public MultiMediaSourceMuxer::Listener { +class RtspMediaSourceImp : public RtspMediaSource, public TrackListener, public MultiMediaSourceMuxer::Listener { public: typedef std::shared_ptr Ptr; @@ -88,13 +88,28 @@ public: /** * _demuxer触发的添加Track事件 */ - void onAddTrack(const Track::Ptr &track) override { + void addTrack(const Track::Ptr &track) override { if(_muxer){ _muxer->addTrack(track); track->addDelegate(_muxer); } } + /** + * _demuxer触发的Track添加完毕事件 + */ + void addTrackCompleted() override { + if (_muxer) { + _muxer->addTrackCompleted(); + } + } + + void resetTracks() override { + if (_muxer) { + _muxer->resetTracks(); + } + } + /** * _muxer触发的所有Track就绪的事件 */