From 38a002646d23dac9ce1163e15155f6082722c3d7 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 24 Oct 2020 23:31:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DFFmpeg=E6=8B=89=E6=B5=81?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E5=8A=9F=E8=83=BD=E7=BC=BA=E9=99=B7=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9A#533?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/FFmpegSource.cpp | 14 ++++---------- src/Common/MediaSource.cpp | 26 ++++++++++++++++++++++++-- src/Common/MediaSource.h | 9 ++++++--- src/Common/MultiMediaSourceMuxer.cpp | 4 ++-- src/FMP4/FMP4MediaSourceMuxer.h | 2 +- src/Record/HlsRecorder.h | 2 +- src/Rtmp/RtmpMediaSourceImp.h | 16 +++++++++++++++- src/Rtmp/RtmpMediaSourceMuxer.h | 2 +- src/Rtsp/RtspMediaSourceImp.h | 16 +++++++++++++++- src/Rtsp/RtspMediaSourceMuxer.h | 2 +- src/TS/TSMediaSourceMuxer.h | 2 +- 11 files changed, 71 insertions(+), 24 deletions(-) diff --git a/server/FFmpegSource.cpp b/server/FFmpegSource.cpp index 35856aaa..6ae12e85 100644 --- a/server/FFmpegSource.cpp +++ b/server/FFmpegSource.cpp @@ -233,7 +233,7 @@ void FFmpegSource::setOnClose(const function &cb){ } bool FFmpegSource::close(MediaSource &sender, bool force) { - auto listener = _listener.lock(); + auto listener = getDelegate(); if(listener && !listener->close(sender,force)){ //关闭失败 return false; @@ -258,17 +258,11 @@ std::shared_ptr FFmpegSource::getOriginSock(MediaSource &sender) const } void FFmpegSource::onGetMediaSource(const MediaSource::Ptr &src) { - auto listener = src->getListener(); + auto listener = src->getListener(true); if (listener.lock().get() != this) { - //防止多次进入onGetMediaSource函数导致无效递归调用的bug - _listener = listener; + //防止多次进入onGetMediaSource函数导致无限递归调用的bug + setDelegate(listener); src->setListener(shared_from_this()); - } else { - WarnL << "多次触发onGetMediaSource事件:" - << src->getSchema() << "/" - << src->getVhost() << "/" - << src->getApp() << "/" - << src->getId(); } } diff --git a/src/Common/MediaSource.cpp b/src/Common/MediaSource.cpp index daac493f..da4f750d 100644 --- a/src/Common/MediaSource.cpp +++ b/src/Common/MediaSource.cpp @@ -92,8 +92,19 @@ void MediaSource::setListener(const std::weak_ptr &listener){ _listener = listener; } -const std::weak_ptr& MediaSource::getListener() const{ - return _listener; +std::weak_ptr MediaSource::getListener(bool next) const{ + if (!next) { + return _listener; + } + auto listener = dynamic_pointer_cast(_listener.lock()); + if (!listener) { + //不是MediaSourceEventInterceptor对象或者对象已经销毁 + return _listener; + } + //获取被拦截的对象 + auto next_obj = listener->getDelegate(); + //有则返回之 + return next_obj ? next_obj : _listener; } int MediaSource::totalReaderCount(){ @@ -644,6 +655,17 @@ bool MediaSourceEventInterceptor::stopSendRtp(MediaSource &sender){ return false; } +void MediaSourceEventInterceptor::setDelegate(const std::weak_ptr &listener) { + if (listener.lock().get() == this) { + throw std::invalid_argument("can not set self as a delegate"); + } + _listener = listener; +} + +std::shared_ptr MediaSourceEventInterceptor::getDelegate() const{ + return _listener.lock(); +} + /////////////////////////////////////FlushPolicy////////////////////////////////////// static bool isFlushAble_default(bool is_video, uint64_t last_stamp, uint64_t new_stamp, int cache_size) { diff --git a/src/Common/MediaSource.h b/src/Common/MediaSource.h index ed7d23e6..f2043658 100644 --- a/src/Common/MediaSource.h +++ b/src/Common/MediaSource.h @@ -97,6 +97,9 @@ public: MediaSourceEventInterceptor(){} ~MediaSourceEventInterceptor() override {} + void setDelegate(const std::weak_ptr &listener); + std::shared_ptr getDelegate() const; + MediaOriginType getOriginType(MediaSource &sender) const override; string getOriginUrl(MediaSource &sender) const override; std::shared_ptr getOriginSock(MediaSource &sender) const override; @@ -112,7 +115,7 @@ public: void startSendRtp(MediaSource &sender, const string &dst_url, uint16_t dst_port, uint32_t ssrc, bool is_udp, const function &cb) override; bool stopSendRtp(MediaSource &sender) override; -protected: +private: std::weak_ptr _listener; }; @@ -226,9 +229,9 @@ public: ////////////////MediaSourceEvent相关接口实现//////////////// // 设置监听者 - void setListener(const std::weak_ptr &listener); + virtual void setListener(const std::weak_ptr &listener); // 获取监听者 - const std::weak_ptr& getListener() const; + std::weak_ptr getListener(bool next = false) const; // 本协议获取观看者个数,可能返回本协议的观看人数,也可能返回总人数 virtual int readerCount() = 0; diff --git a/src/Common/MultiMediaSourceMuxer.cpp b/src/Common/MultiMediaSourceMuxer.cpp index 6b87c768..e7f31bdb 100644 --- a/src/Common/MultiMediaSourceMuxer.cpp +++ b/src/Common/MultiMediaSourceMuxer.cpp @@ -291,7 +291,7 @@ MultiMediaSourceMuxer::MultiMediaSourceMuxer(const string &vhost, const string & } void MultiMediaSourceMuxer::setMediaListener(const std::weak_ptr &listener) { - _listener = listener; + setDelegate(listener); //拦截事件 _muxer->setMediaListener(shared_from_this()); } @@ -313,7 +313,7 @@ vector MultiMediaSourceMuxer::getTracks(MediaSource &sender, bool tr } int MultiMediaSourceMuxer::totalReaderCount(MediaSource &sender) { - auto listener = _listener.lock(); + auto listener = getDelegate(); if (!listener) { return totalReaderCount(); } diff --git a/src/FMP4/FMP4MediaSourceMuxer.h b/src/FMP4/FMP4MediaSourceMuxer.h index 50b0f83e..3d8482a0 100644 --- a/src/FMP4/FMP4MediaSourceMuxer.h +++ b/src/FMP4/FMP4MediaSourceMuxer.h @@ -32,7 +32,7 @@ public: ~FMP4MediaSourceMuxer() override = default; void setListener(const std::weak_ptr &listener){ - _listener = listener; + setDelegate(listener); _media_src->setListener(shared_from_this()); } diff --git a/src/Record/HlsRecorder.h b/src/Record/HlsRecorder.h index c753c8b4..465a4199 100644 --- a/src/Record/HlsRecorder.h +++ b/src/Record/HlsRecorder.h @@ -34,7 +34,7 @@ public: } void setListener(const std::weak_ptr &listener) { - _listener = listener; + setDelegate(listener); _hls->getMediaSource()->setListener(shared_from_this()); //先注册媒体流,后续可以按需生成 _hls->getMediaSource()->registHls(false); diff --git a/src/Rtmp/RtmpMediaSourceImp.h b/src/Rtmp/RtmpMediaSourceImp.h index 24dc2c4f..f293a3a0 100644 --- a/src/Rtmp/RtmpMediaSourceImp.h +++ b/src/Rtmp/RtmpMediaSourceImp.h @@ -86,7 +86,7 @@ public: _muxer->setMediaListener(getListener()); _muxer->setTrackListener(static_pointer_cast(shared_from_this())); //让_muxer对象拦截一部分事件(比如说录像相关事件) - setListener(_muxer); + MediaSource::setListener(_muxer); for(auto &track : _demuxer->getTracks(false)){ _muxer->addTrack(track); @@ -119,6 +119,20 @@ public: } } + /** + * 设置事件监听器 + * @param listener 监听器 + */ + void setListener(const std::weak_ptr &listener) override{ + if (_muxer) { + //_muxer对象不能处理的事件再给listener处理 + _muxer->setMediaListener(listener); + } else { + //未创建_muxer对象,事件全部给listener处理 + MediaSource::setListener(listener); + } + } + private: bool _all_track_ready = false; bool _recreate_metadata = false; diff --git a/src/Rtmp/RtmpMediaSourceMuxer.h b/src/Rtmp/RtmpMediaSourceMuxer.h index e176beab..c8ef9652 100644 --- a/src/Rtmp/RtmpMediaSourceMuxer.h +++ b/src/Rtmp/RtmpMediaSourceMuxer.h @@ -32,7 +32,7 @@ public: ~RtmpMediaSourceMuxer() override{} void setListener(const std::weak_ptr &listener){ - _listener = listener; + setDelegate(listener); _media_src->setListener(shared_from_this()); } diff --git a/src/Rtsp/RtspMediaSourceImp.h b/src/Rtsp/RtspMediaSourceImp.h index a2d2cbc2..a5cf5130 100644 --- a/src/Rtsp/RtspMediaSourceImp.h +++ b/src/Rtsp/RtspMediaSourceImp.h @@ -77,7 +77,7 @@ public: _muxer->setMediaListener(getListener()); _muxer->setTrackListener(static_pointer_cast(shared_from_this())); //让_muxer对象拦截一部分事件(比如说录像相关事件) - setListener(_muxer); + MediaSource::setListener(_muxer); for(auto &track : _demuxer->getTracks(false)){ _muxer->addTrack(track); @@ -102,6 +102,20 @@ public: _all_track_ready = true; } + /** + * 设置事件监听器 + * @param listener 监听器 + */ + void setListener(const std::weak_ptr &listener) override{ + if (_muxer) { + //_muxer对象不能处理的事件再给listener处理 + _muxer->setMediaListener(listener); + } else { + //未创建_muxer对象,事件全部给listener处理 + MediaSource::setListener(listener); + } + } + private: RtspDemuxer::Ptr _demuxer; MultiMediaSourceMuxer::Ptr _muxer; diff --git a/src/Rtsp/RtspMediaSourceMuxer.h b/src/Rtsp/RtspMediaSourceMuxer.h index 10bd920c..eb2a4bd4 100644 --- a/src/Rtsp/RtspMediaSourceMuxer.h +++ b/src/Rtsp/RtspMediaSourceMuxer.h @@ -32,7 +32,7 @@ public: ~RtspMediaSourceMuxer() override{} void setListener(const std::weak_ptr &listener){ - _listener = listener; + setDelegate(listener); _media_src->setListener(shared_from_this()); } diff --git a/src/TS/TSMediaSourceMuxer.h b/src/TS/TSMediaSourceMuxer.h index faea1f08..34051808 100644 --- a/src/TS/TSMediaSourceMuxer.h +++ b/src/TS/TSMediaSourceMuxer.h @@ -31,7 +31,7 @@ public: ~TSMediaSourceMuxer() override = default; void setListener(const std::weak_ptr &listener){ - _listener = listener; + setDelegate(listener); _media_src->setListener(shared_from_this()); }