From 3630839bc9778b05419d968dbf88d0bda000d123 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Wed, 29 Apr 2020 11:59:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B3=E9=97=AD=E8=BD=AC=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E5=B0=86=E5=85=B3=E9=97=AD=E8=A7=A3=E5=A4=8D?= =?UTF-8?q?=E7=94=A8=E4=BB=A5=E6=8F=90=E4=BE=9B=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/MultiMediaSourceMuxer.cpp | 18 ++++++++++++++++-- src/Common/MultiMediaSourceMuxer.h | 8 ++++++++ src/Rtmp/RtmpMediaSourceImp.h | 11 ++++++++++- src/Rtsp/RtspMediaSourceImp.h | 11 ++++++++++- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/Common/MultiMediaSourceMuxer.cpp b/src/Common/MultiMediaSourceMuxer.cpp index 6047062e..58217d2b 100644 --- a/src/Common/MultiMediaSourceMuxer.cpp +++ b/src/Common/MultiMediaSourceMuxer.cpp @@ -22,17 +22,21 @@ MultiMuxerPrivate::MultiMuxerPrivate(const string &vhost, bool enable_mp4) { if (enable_rtmp) { _rtmp = std::make_shared(vhost, app, stream, std::make_shared(dur_sec)); + _enable_rtxp = true; } if (enable_rtsp) { _rtsp = std::make_shared(vhost, app, stream, std::make_shared(dur_sec)); + _enable_rtxp = true; } if (enable_hls) { _hls = Recorder::createRecorder(Recorder::type_hls, vhost, app, stream); + _enable_record = true; } if (enable_mp4) { _mp4 = Recorder::createRecorder(Recorder::type_mp4, vhost, app, stream); + _enable_record = true; } } @@ -102,6 +106,7 @@ bool MultiMuxerPrivate::setupRecord(MediaSource &sender, Recorder::type type, bo //停止录制 _hls = nullptr; } + _enable_record = _hls || _mp4; return true; } case Recorder::type_mp4 : { @@ -112,10 +117,10 @@ bool MultiMuxerPrivate::setupRecord(MediaSource &sender, Recorder::type type, bo //停止录制 _mp4 = nullptr; } + _enable_record = _hls || _mp4; return true; } - default: - return false; + default : return false; } } @@ -163,6 +168,10 @@ void MultiMuxerPrivate::onTrackReady(const Track::Ptr &track) { } } +bool MultiMuxerPrivate::isEnabled(){ + return _enable_rtxp || _enable_record; +} + void MultiMuxerPrivate::onTrackFrame(const Frame::Ptr &frame) { if (_rtmp) { _rtmp->inputFrame(frame); @@ -293,4 +302,9 @@ void MultiMediaSourceMuxer::inputFrame(const Frame::Ptr &frame) { _muxer->inputFrame(frame); } +bool MultiMediaSourceMuxer::isEnabled(){ + return _muxer->isEnabled(); +} + + }//namespace mediakit \ No newline at end of file diff --git a/src/Common/MultiMediaSourceMuxer.h b/src/Common/MultiMediaSourceMuxer.h index 5ba6b8fe..04109745 100644 --- a/src/Common/MultiMediaSourceMuxer.h +++ b/src/Common/MultiMediaSourceMuxer.h @@ -45,6 +45,7 @@ private: void setTrackListener(Listener *listener); bool setupRecord(MediaSource &sender, Recorder::type type, bool start, const string &custom_path); bool isRecording(MediaSource &sender, Recorder::type type); + bool isEnabled(); private: void onTrackReady(const Track::Ptr & track) override; void onTrackFrame(const Frame::Ptr &frame) override; @@ -57,6 +58,8 @@ private: MediaSinkInterface::Ptr _mp4; Listener *_listener = nullptr; std::weak_ptr _meida_listener; + bool _enable_rtxp = false; + bool _enable_record = false; }; class MultiMediaSourceMuxer : public MediaSourceEvent, public MediaSinkInterface, public TrackSource, public std::enable_shared_from_this{ @@ -167,6 +170,11 @@ public: * @param frame 帧 */ void inputFrame(const Frame::Ptr &frame) override; + + /** + * 判断是否生效(是否正在转其他协议) + */ + bool isEnabled(); private: MultiMuxerPrivate::Ptr _muxer; std::weak_ptr _listener; diff --git a/src/Rtmp/RtmpMediaSourceImp.h b/src/Rtmp/RtmpMediaSourceImp.h index 954180b9..e78f1286 100644 --- a/src/Rtmp/RtmpMediaSourceImp.h +++ b/src/Rtmp/RtmpMediaSourceImp.h @@ -57,7 +57,14 @@ public: * 输入rtmp并解析 */ void onWrite(const RtmpPacket::Ptr &pkt,bool key_pos = true) override { - key_pos = _demuxer->inputRtmp(pkt); + if(_all_track_ready && !_muxer->isEnabled()){ + //获取到所有Track后,并且未开启转协议,那么不需要解复用rtmp + key_pos = pkt->isVideoKeyFrame(); + }else{ + //需要解复用rtmp + key_pos = _demuxer->inputRtmp(pkt); + } + RtmpMediaSource::onWrite(pkt,key_pos); } @@ -138,10 +145,12 @@ public: */ void onAllTrackReady() override{ setTrackSource(_muxer); + _all_track_ready = true; } private: RtmpDemuxer::Ptr _demuxer; MultiMediaSourceMuxer::Ptr _muxer; + bool _all_track_ready = false; }; } /* namespace mediakit */ diff --git a/src/Rtsp/RtspMediaSourceImp.h b/src/Rtsp/RtspMediaSourceImp.h index 495158f3..91a97992 100644 --- a/src/Rtsp/RtspMediaSourceImp.h +++ b/src/Rtsp/RtspMediaSourceImp.h @@ -48,7 +48,14 @@ public: * 输入rtp并解析 */ void onWrite(const RtpPacket::Ptr &rtp, bool key_pos) override { - key_pos = _demuxer->inputRtp(rtp); + if(_all_track_ready && !_muxer->isEnabled()){ + //获取到所有Track后,并且未开启转协议,那么不需要解复用rtp + //在关闭rtp解复用后,无法知道是否为关键帧,这样会导致无法秒开,或者开播花屏 + key_pos = rtp->type == TrackVideo; + }else{ + //需要解复用rtp + key_pos = _demuxer->inputRtp(rtp); + } RtspMediaSource::onWrite(rtp, key_pos); } @@ -129,10 +136,12 @@ public: */ void onAllTrackReady() override{ setTrackSource(_muxer); + _all_track_ready = true; } private: RtspDemuxer::Ptr _demuxer; MultiMediaSourceMuxer::Ptr _muxer; + bool _all_track_ready = false; }; } /* namespace mediakit */