From 132468e9978446da3b0412a447229e54487d3ddb Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Thu, 15 Nov 2018 15:14:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A7=A3=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E5=99=A8/=E6=92=AD=E6=94=BE=E5=99=A8=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8Track=E5=87=86=E5=A4=87=E5=B0=B1=E7=BB=AA?= =?UTF-8?q?=E5=90=8E=E5=9B=9E=E8=B0=83=E6=92=AD=E6=94=BE=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Extension/Factory.cpp | 4 ++- src/Player/PlayerBase.cpp | 35 +++++++++++++++++++ src/Player/PlayerBase.h | 66 +++++++++++++++++++++++++++++++++-- src/Rtmp/RtmpPlayerImp.h | 1 + src/RtmpMuxer/RtmpDemuxer.cpp | 33 ------------------ src/RtmpMuxer/RtmpDemuxer.h | 28 ++------------- src/Rtsp/RtspPlayerImp.h | 1 + src/RtspMuxer/RtspDemuxer.cpp | 29 --------------- src/RtspMuxer/RtspDemuxer.h | 25 +------------ 9 files changed, 106 insertions(+), 116 deletions(-) diff --git a/src/Extension/Factory.cpp b/src/Extension/Factory.cpp index aca9e71c..22c5d87c 100644 --- a/src/Extension/Factory.cpp +++ b/src/Extension/Factory.cpp @@ -232,8 +232,10 @@ CodecId Factory::getCodecIdByAmf(const AMFValue &val){ WarnL << "暂不支持该Amf:" << type_id; return CodecInvalid; } + }else{ + WarnL << "Metedata不存在相应的Track"; } - WarnL << "暂不支持该Amf:" << val.type(); + return CodecInvalid; } diff --git a/src/Player/PlayerBase.cpp b/src/Player/PlayerBase.cpp index d8a4e184..4a8738e3 100644 --- a/src/Player/PlayerBase.cpp +++ b/src/Player/PlayerBase.cpp @@ -51,4 +51,39 @@ PlayerBase::Ptr PlayerBase::createPlayer(const char* strUrl) { return PlayerBase::Ptr(new RtspPlayerImp()); } +///////////////////////////Demuxer////////////////////////////// +bool Demuxer::isInited() { + if(_ticker.createdTime() < 500){ + //500毫秒内判断条件 + //如果音视频都准备好了 ,说明Track全部就绪 + return (_videoTrack && _videoTrack->ready() && _audioTrack && _audioTrack->ready()); + } + + //500毫秒之后,去除还未就绪的Track + if(_videoTrack && !_videoTrack->ready()){ + //有视频但是视频未就绪 + _videoTrack = nullptr; + } + + if(_audioTrack && !_audioTrack->ready()){ + //有音频但是音频未就绪 + _audioTrack = nullptr; + } + return true; +} + +vector Demuxer::getTracks() const { + vector ret; + if(_videoTrack){ + ret.emplace_back(_videoTrack); + } + if(_audioTrack){ + ret.emplace_back(_audioTrack); + } + return ret; +} + +float Demuxer::getDuration() const { + return _fDuration; +} } /* namespace mediakit */ diff --git a/src/Player/PlayerBase.h b/src/Player/PlayerBase.h index cfcae547..3f31e314 100644 --- a/src/Player/PlayerBase.h +++ b/src/Player/PlayerBase.h @@ -55,7 +55,7 @@ public: * 是否初始化完毕,完毕后方可调用getTrack方法 * @return */ - virtual bool isInited() const { return true; } + virtual bool isInited() { return true; } /** * 获取全部的Track @@ -183,7 +183,7 @@ public: _playResultCB = cb; } - bool isInited() const override{ + bool isInited() override{ if (_parser) { return _parser->isInited(); } @@ -225,12 +225,37 @@ protected: void onShutdown(const SockException &ex) override { if (_shutdownCB) { _shutdownCB(ex); + _shutdownCB = nullptr; } } + void onPlayResult(const SockException &ex) override { - if (_playResultCB) { + if(!_playResultCB){ + return; + } + if(ex){ + //播放失败,则立即回调 _playResultCB(ex); _playResultCB = nullptr; + return; + } + //播放成功 + + if(isInited()){ + //初始化完毕则立即回调 + _playResultCB(ex); + _playResultCB = nullptr; + return; + } + //播放成功却未初始化完毕 + } + void checkInited(){ + if(!_playResultCB){ + return; + } + if(isInited()){ + _playResultCB(SockException(Err_success,"play success")); + _playResultCB = nullptr; } } protected: @@ -240,6 +265,41 @@ protected: MediaSource::Ptr _pMediaSrc; }; + +class Demuxer : public PlayerBase{ +public: + Demuxer(){}; + virtual ~Demuxer(){}; + + /** + * 返回是否完成初始化完毕 + * 在构造RtspDemuxer对象时有些rtsp的sdp不包含sps pps信息 + * 所以要等待接收到到sps的rtp包后才能完成 + * + * 在构造RtmpDemuxer对象时是无法获取sps pps aac_cfg等这些信息, + * 所以要调用inputRtmp后才会获取到这些信息,这时才初始化成功 + * @return + */ + bool isInited() override; + + /** + * 获取所有可用Track,请在isInited()返回true时调用 + * @return + */ + vector getTracks() const override; + + /** + * 获取节目总时长 + * @return + */ + float getDuration() const override; +protected: + AudioTrack::Ptr _audioTrack; + VideoTrack::Ptr _videoTrack; + Ticker _ticker; + float _fDuration = 0; +}; + } /* namespace mediakit */ #endif /* SRC_PLAYER_PLAYERBASE_H_ */ diff --git a/src/Rtmp/RtmpPlayerImp.h b/src/Rtmp/RtmpPlayerImp.h index 19667b70..e4d83d14 100644 --- a/src/Rtmp/RtmpPlayerImp.h +++ b/src/Rtmp/RtmpPlayerImp.h @@ -72,6 +72,7 @@ private: _pRtmpMediaSrc->onWrite(chunkData); } _parser->inputRtmp(chunkData); + checkInited(); } private: diff --git a/src/RtmpMuxer/RtmpDemuxer.cpp b/src/RtmpMuxer/RtmpDemuxer.cpp index 8c1fa67d..2b452fc6 100644 --- a/src/RtmpMuxer/RtmpDemuxer.cpp +++ b/src/RtmpMuxer/RtmpDemuxer.cpp @@ -112,38 +112,5 @@ void RtmpDemuxer::makeAudioTrack(const AMFValue &audioCodec) { } } -vector RtmpDemuxer::getTracks() const { - vector ret; - if(_videoTrack){ - ret.emplace_back(_videoTrack); - } - if(_audioTrack){ - ret.emplace_back(_audioTrack); - } - return ret; -} - -bool RtmpDemuxer::isInited() const { - bool videoReady ,auidoReady; - - if(_videoTrack){ - videoReady = _videoTrack->ready(); - }else{ - videoReady = _tryedGetVideoTrack || _tryedGetAudioTrack; - } - - if(_audioTrack){ - auidoReady = _audioTrack->ready(); - }else{ - auidoReady = _tryedGetVideoTrack || _tryedGetAudioTrack; - } - - return videoReady && auidoReady; -} - -float RtmpDemuxer::getDuration() const { - return _fDuration; -} - } /* namespace mediakit */ diff --git a/src/RtmpMuxer/RtmpDemuxer.h b/src/RtmpMuxer/RtmpDemuxer.h index 50165d84..1730dc6f 100644 --- a/src/RtmpMuxer/RtmpDemuxer.h +++ b/src/RtmpMuxer/RtmpDemuxer.h @@ -39,7 +39,7 @@ using namespace toolkit; namespace mediakit { -class RtmpDemuxer : public PlayerBase{ +class RtmpDemuxer : public Demuxer{ public: typedef std::shared_ptr Ptr; @@ -53,6 +53,7 @@ public: * 这样就会在inputRtmp时异步探测媒体编码格式 */ RtmpDemuxer(const AMFValue &val); + virtual ~RtmpDemuxer(){}; /** * @@ -62,43 +63,18 @@ public: */ static int getTrackCount(const AMFValue &metedata); - virtual ~RtmpDemuxer(){}; - /** * 开始解复用 * @param pkt rtmp包 * @return true 代表是i帧 */ bool inputRtmp(const RtmpPacket::Ptr &pkt); - - /** - * 获取节目总时长 - * @return - */ - float getDuration() const override; - - /** - * 返回是否完成初始化完毕 - * 由于在构造该对象时是无法获取sps pps aac_cfg等这些信息, - * 所以要调用inputRtmp后才会获取到这些信息,这时才初始化成功 - * @return - */ - bool isInited() const override; - - /** - * 获取所有可用Track,请在isInited()返回true时调用 - * @return - */ - vector getTracks() const override; private: void makeVideoTrack(const AMFValue &val); void makeAudioTrack(const AMFValue &val); private: - float _fDuration = 0; bool _tryedGetVideoTrack = false; bool _tryedGetAudioTrack = false; - AudioTrack::Ptr _audioTrack; - VideoTrack::Ptr _videoTrack; RtmpCodec::Ptr _audioRtmpDecoder; RtmpCodec::Ptr _videoRtmpDecoder; }; diff --git a/src/Rtsp/RtspPlayerImp.h b/src/Rtsp/RtspPlayerImp.h index d345e096..b4cd973b 100644 --- a/src/Rtsp/RtspPlayerImp.h +++ b/src/Rtsp/RtspPlayerImp.h @@ -75,6 +75,7 @@ private: _pRtspMediaSrc->onWrite(rtppt,true); } _parser->inputRtp(rtppt); + checkInited(); } private: diff --git a/src/RtspMuxer/RtspDemuxer.cpp b/src/RtspMuxer/RtspDemuxer.cpp index b59d4bbb..bf22e0ff 100644 --- a/src/RtspMuxer/RtspDemuxer.cpp +++ b/src/RtspMuxer/RtspDemuxer.cpp @@ -117,33 +117,4 @@ void RtspDemuxer::makeVideoTrack(const SdpTrack::Ptr &video) { } } -vector RtspDemuxer::getTracks() const { - vector ret; - if(_videoTrack){ - ret.emplace_back(_videoTrack); - } - if(_audioTrack){ - ret.emplace_back(_audioTrack); - } - return ret; -} - -bool RtspDemuxer::isInited() const { - bool videoReady = true ,auidoReady = true; - - if(_videoTrack){ - videoReady = _videoTrack->ready(); - } - - if(_audioTrack){ - auidoReady = _audioTrack->ready(); - } - - return videoReady && auidoReady; -} - -float RtspDemuxer::getDuration() const { - return _fDuration; -} - } /* namespace mediakit */ diff --git a/src/RtspMuxer/RtspDemuxer.h b/src/RtspMuxer/RtspDemuxer.h index 49f81762..5abf8f2c 100644 --- a/src/RtspMuxer/RtspDemuxer.h +++ b/src/RtspMuxer/RtspDemuxer.h @@ -38,7 +38,7 @@ using namespace toolkit; namespace mediakit { -class RtspDemuxer : public PlayerBase{ +class RtspDemuxer : public Demuxer{ public: typedef std::shared_ptr Ptr; RtspDemuxer(const string &sdp); @@ -51,34 +51,11 @@ public: * @return true 代表是i帧第一个rtp包 */ bool inputRtp(const RtpPacket::Ptr &rtp); - - /** - * 获取节目总时长 - * @return - */ - float getDuration() const override; - - /** - * 返回是否完成初始化完毕 - * 由于有些rtsp的sdp不包含sps pps信息 - * 所以要等待接收到到sps的rtp包后才能完成 - * @return - */ - bool isInited() const override; - - /** - * 获取所有可用Track,请在isInited()返回true时调用 - * @return - */ - vector getTracks() const override; private: void makeAudioTrack(const SdpTrack::Ptr &audio); void makeVideoTrack(const SdpTrack::Ptr &video); void loadSdp(const SdpAttr &attr); private: - float _fDuration = 0; - AudioTrack::Ptr _audioTrack; - VideoTrack::Ptr _videoTrack; RtpCodec::Ptr _audioRtpDecoder; RtpCodec::Ptr _videoRtpDecoder; };