From 636068b2b8bb3c6cf5c5d17d0ffe48f9d80fd283 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sun, 6 Sep 2020 17:52:33 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B2=BE=E7=AE=80=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E5=96=84=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/MediaSource.h | 6 ++--- src/Rtmp/RtmpMediaSourceImp.h | 48 +++++------------------------------ src/Rtsp/RtspMediaSourceImp.h | 45 ++++---------------------------- 3 files changed, 14 insertions(+), 85 deletions(-) diff --git a/src/Common/MediaSource.h b/src/Common/MediaSource.h index 9d4bd0e9..9d18d38d 100644 --- a/src/Common/MediaSource.h +++ b/src/Common/MediaSource.h @@ -131,7 +131,7 @@ public: vector getTracks(bool ready = true) const override; // 设置监听者 - virtual void setListener(const std::weak_ptr &listener); + void setListener(const std::weak_ptr &listener); // 获取监听者 const std::weak_ptr& getListener() const; @@ -152,9 +152,9 @@ public: // 该流无人观看 void onNoneReader(); // 开启或关闭录制 - virtual bool setupRecord(Recorder::type type, bool start, const string &custom_path); + bool setupRecord(Recorder::type type, bool start, const string &custom_path); // 获取录制状态 - virtual bool isRecording(Recorder::type type); + bool isRecording(Recorder::type type); // 同步查找流 static Ptr find(const string &schema, const string &vhost, const string &app, const string &id); diff --git a/src/Rtmp/RtmpMediaSourceImp.h b/src/Rtmp/RtmpMediaSourceImp.h index 53976a88..f4c070b3 100644 --- a/src/Rtmp/RtmpMediaSourceImp.h +++ b/src/Rtmp/RtmpMediaSourceImp.h @@ -61,26 +61,14 @@ public: * 输入rtmp并解析 */ void onWrite(const RtmpPacket::Ptr &pkt,bool key_pos = true) override { - if(_all_track_ready && !_muxer->isEnabled()){ + if (_all_track_ready && !_muxer->isEnabled()) { //获取到所有Track后,并且未开启转协议,那么不需要解复用rtmp key_pos = pkt->isVideoKeyFrame(); - }else{ + } else { //需要解复用rtmp key_pos = _demuxer->inputRtmp(pkt); } - - RtmpMediaSource::onWrite(pkt,key_pos); - } - - /** - * 设置监听器 - * @param listener - */ - void setListener(const std::weak_ptr &listener) override { - RtmpMediaSource::setListener(listener); - if(_muxer){ - _muxer->setMediaListener(listener); - } + RtmpMediaSource::onWrite(pkt, key_pos); } /** @@ -90,33 +78,6 @@ public: return readerCount() + (_muxer ? _muxer->totalReaderCount() : 0); } - /** - * 设置录制状态 - * @param type 录制类型 - * @param start 开始或停止 - * @param custom_path 开启录制时,指定自定义路径 - * @return 是否设置成功 - */ - bool setupRecord(Recorder::type type, bool start, const string &custom_path) override{ - if(_muxer){ - return _muxer->setupRecord(*this,type, start, custom_path); - } - return RtmpMediaSource::setupRecord(type, start, custom_path); - } - - /** - * 获取录制状态 - * @param type 录制类型 - * @return 录制状态 - */ - bool isRecording(Recorder::type type) override{ - if(_muxer){ - return _muxer->isRecording(*this,type); - } - return RtmpMediaSource::isRecording(type); - } - - /** * 设置协议转换 * @param enableRtsp 是否转换成rtsp @@ -128,6 +89,9 @@ public: _muxer = std::make_shared(getVhost(), getApp(), getId(), _demuxer->getDuration(), enableRtsp, false, enableHls, enableMP4); _muxer->setMediaListener(getListener()); _muxer->setTrackListener(static_pointer_cast(shared_from_this())); + //让_muxer对象拦截一部分事件(比如说录像相关事件) + setListener(_muxer); + for(auto &track : _demuxer->getTracks(false)){ _muxer->addTrack(track); track->addDelegate(_muxer); diff --git a/src/Rtsp/RtspMediaSourceImp.h b/src/Rtsp/RtspMediaSourceImp.h index e6a12ccc..5ca1df78 100644 --- a/src/Rtsp/RtspMediaSourceImp.h +++ b/src/Rtsp/RtspMediaSourceImp.h @@ -48,28 +48,17 @@ public: * 输入rtp并解析 */ void onWrite(const RtpPacket::Ptr &rtp, bool key_pos) override { - if(_all_track_ready && !_muxer->isEnabled()){ + if (_all_track_ready && !_muxer->isEnabled()) { //获取到所有Track后,并且未开启转协议,那么不需要解复用rtp //在关闭rtp解复用后,无法知道是否为关键帧,这样会导致无法秒开,或者开播花屏 key_pos = rtp->type == TrackVideo; - }else{ + } else { //需要解复用rtp key_pos = _demuxer->inputRtp(rtp); } RtspMediaSource::onWrite(rtp, key_pos); } - /** - * 设置监听器 - * @param listener - */ - void setListener(const std::weak_ptr &listener) override { - RtspMediaSource::setListener(listener); - if(_muxer){ - _muxer->setMediaListener(listener); - } - } - /** * 获取观看总人数,包括(hls/rtsp/rtmp) */ @@ -77,33 +66,6 @@ public: return readerCount() + (_muxer ? _muxer->totalReaderCount() : 0); } - /** - * 设置录制状态 - * @param type 录制类型 - * @param start 开始或停止 - * @param custom_path 开启录制时,指定自定义路径 - * @return 是否设置成功 - */ - bool setupRecord(Recorder::type type, bool start, const string &custom_path) override{ - if(_muxer){ - return _muxer->setupRecord(*this,type, start, custom_path); - } - return RtspMediaSource::setupRecord(type, start, custom_path); - } - - /** - * 获取录制状态 - * @param type 录制类型 - * @return 录制状态 - */ - bool isRecording(Recorder::type type) override{ - if(_muxer){ - return _muxer->isRecording(*this,type); - } - return RtspMediaSource::isRecording(type); - } - - /** * 设置协议转换 * @param enableRtmp 是否转换成rtmp @@ -115,6 +77,9 @@ public: _muxer = std::make_shared(getVhost(), getApp(), getId(), _demuxer->getDuration(), false, enableRtmp, enableHls, enableMP4); _muxer->setMediaListener(getListener()); _muxer->setTrackListener(static_pointer_cast(shared_from_this())); + //让_muxer对象拦截一部分事件(比如说录像相关事件) + setListener(_muxer); + for(auto &track : _demuxer->getTracks(false)){ _muxer->addTrack(track); track->addDelegate(_muxer);