From 097cf273d501bb0884481958cb76314c0d683dfc Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 26 Oct 2018 17:14:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90PlayerProxy=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/MultiMediaSourceMuxer.h | 8 +- src/Device/PlayerProxy.cpp | 118 +++++++++++++---------------- src/Device/PlayerProxy.h | 8 +- src/Player/Track.h | 20 +++++ src/RtmpMuxer/RtmpMuxer.h | 5 +- src/RtspMuxer/RtspMuxer.cpp | 4 +- src/RtspMuxer/RtspMuxer.h | 7 +- 7 files changed, 89 insertions(+), 81 deletions(-) diff --git a/src/Common/MultiMediaSourceMuxer.h b/src/Common/MultiMediaSourceMuxer.h index 08b9ee79..713fd214 100644 --- a/src/Common/MultiMediaSourceMuxer.h +++ b/src/Common/MultiMediaSourceMuxer.h @@ -30,7 +30,7 @@ #include "RtspMuxer/RtspMediaSourceMuxer.h" #include "RtmpMuxer/RtmpMediaSourceMuxer.h" -class MultiMediaSourceMuxer { +class MultiMediaSourceMuxer : public FrameRingWriterInterface{ public: typedef std::shared_ptr Ptr; @@ -48,16 +48,16 @@ public: * 添加音视频媒体 * @param track 媒体描述 */ - void addTrack(const Track::Ptr & track,int mtu = 1400) { + void addTrack(const Track::Ptr & track) { _rtmp->addTrack(track); - _rtsp->addTrack(track,0,mtu); + _rtsp->addTrack(track); } /** * 写入帧数据然后打包rtmp * @param frame 帧数据 */ - void inputFrame(const Frame::Ptr &frame) { + void inputFrame(const Frame::Ptr &frame) override { _rtmp->inputFrame(frame); _rtsp->inputFrame(frame); } diff --git a/src/Device/PlayerProxy.cpp b/src/Device/PlayerProxy.cpp index e85e9b6e..f46d1893 100644 --- a/src/Device/PlayerProxy.cpp +++ b/src/Device/PlayerProxy.cpp @@ -81,35 +81,6 @@ PlayerProxy::PlayerProxy(const char *strVhost, } void PlayerProxy::play(const char* strUrl) { weak_ptr weakSelf = shared_from_this(); - - //todo(xzl) 修复此处 - -// setOnVideoCB( [weakSelf](const H264Frame &data ) { -// auto strongSelf = weakSelf.lock(); -// if(!strongSelf){ -// return; -// } -// if(strongSelf->_pChn){ -// strongSelf->_pChn->inputH264((char *)data.data(), data.size(), data.timeStamp); -// if(!strongSelf->_haveAudio){ -// strongSelf->makeMuteAudio(data.timeStamp); -// } -// }else{ -// strongSelf->initMedia(); -// } -// }); -// setOnAudioCB( [weakSelf](const AACFrame &data ) { -// auto strongSelf = weakSelf.lock(); -// if(!strongSelf){ -// return; -// } -// if(strongSelf->_pChn){ -// strongSelf->_pChn->inputAAC((char *)data.data(), data.size(), data.timeStamp); -// }else{ -// strongSelf->initMedia(); -// } -// }); - std::shared_ptr piFailedCnt(new int(0)); //连续播放失败次数 string strUrlTmp(strUrl); setOnPlayResult([weakSelf,strUrlTmp,piFailedCnt](const SockException &err) { @@ -120,6 +91,7 @@ void PlayerProxy::play(const char* strUrl) { if(!err) { // 播放成功 *piFailedCnt = 0;//连续播放失败次数清0 + strongSelf->onPlaySuccess(); }else if(*piFailedCnt < strongSelf->_iRetryCount || strongSelf->_iRetryCount < 0) { // 播放失败,延时重试播放 strongSelf->rePlay(strUrlTmp,(*piFailedCnt)++); @@ -161,38 +133,6 @@ void PlayerProxy::rePlay(const string &strUrl,int iFailedCnt){ return false; }); } -void PlayerProxy::initMedia() { - if (!isInited()) { - return; - } - _pChn.reset(new DevChannel(_strVhost.data(),_strApp.data(),_strSrc.data(),getDuration(),_bEnableHls,_bEnableMp4)); - _pChn->setListener(shared_from_this()); - - //todo(xzl) 修复此处 - -// if (containVideo()) { -// VideoInfo info; -// info.iFrameRate = getVideoFps(); -// info.iWidth = getVideoWidth(); -// info.iHeight = getVideoHeight(); -// _pChn->initVideo(info); -// } -// -// _haveAudio = containAudio(); -// if (containAudio()) { -// AudioInfo info; -// info.iSampleRate = getAudioSampleRate(); -// info.iChannel = getAudioChannel(); -// info.iSampleBit = getAudioSampleBit(); -// _pChn->initAudio(info); -// }else{ -// AudioInfo info; -// info.iSampleRate = MUTE_ADTS_SAMPLE_RATE; -// info.iChannel = MUTE_ADTS_CHN_CNT; -// info.iSampleBit = MUTE_ADTS_SAMPLE_BIT; -// _pChn->initAudio(info); -// } -} bool PlayerProxy::close() { //通知其停止推流 weak_ptr weakSlef = dynamic_pointer_cast(shared_from_this()); @@ -209,12 +149,56 @@ bool PlayerProxy::close() { return true; } -void PlayerProxy::makeMuteAudio(uint32_t stamp) { - auto iAudioIndex = stamp / MUTE_ADTS_DATA_MS; - if(_iAudioIndex != iAudioIndex){ - _iAudioIndex = iAudioIndex; - _pChn->inputFrame(std::make_shared((char *)MUTE_ADTS_DATA,MUTE_ADTS_DATA_LEN, _iAudioIndex * MUTE_ADTS_DATA_MS)); - //DebugL << _iAudioIndex * MUTE_ADTS_DATA_MS << " " << stamp; + +class MuteAudioMaker : public FrameRingInterfaceDelegate{ +public: + typedef std::shared_ptr Ptr; + + MuteAudioMaker(){}; + virtual ~MuteAudioMaker(){} + void inputFrame(const Frame::Ptr &frame) override { + if(frame->getTrackType() == TrackVideo){ + auto iAudioIndex = frame->stamp() / MUTE_ADTS_DATA_MS; + if(_iAudioIndex != iAudioIndex){ + _iAudioIndex = iAudioIndex; + auto aacFrame = std::make_shared((char *)MUTE_ADTS_DATA, + MUTE_ADTS_DATA_LEN, + _iAudioIndex * MUTE_ADTS_DATA_MS); + FrameRingInterfaceDelegate::inputFrame(aacFrame); + } + } + } +private: + int _iAudioIndex = 0; +}; + +void PlayerProxy::onPlaySuccess() { + _pChn.reset(new DevChannel(_strVhost.data(),_strApp.data(),_strSrc.data(),getDuration(),_bEnableHls,_bEnableMp4)); + _pChn->setListener(shared_from_this()); + + auto videoTrack = getTrack(TrackVideo); + if(videoTrack){ + //添加视频 + _pChn->addTrack(videoTrack->clone()); + //视频数据写入_pChn + videoTrack->addDelegate(_pChn); + } + + auto audioTrack = getTrack(TrackAudio); + if(audioTrack){ + //添加音频 + _pChn->addTrack(audioTrack->clone()); + //音频数据写入_pChn + audioTrack->addDelegate(_pChn); + }else if(videoTrack){ + //没有音频信息,产生一个静音音频 + MuteAudioMaker::Ptr audioMaker = std::make_shared(); + //videoTrack把数据写入MuteAudioMaker + videoTrack->addDelegate(audioMaker); + //添加一个静音Track至_pChn + _pChn->addTrack(std::make_shared()); + //MuteAudioMaker生成静音音频然后写入_pChn; + audioMaker->addDelegate(_pChn); } } diff --git a/src/Device/PlayerProxy.h b/src/Device/PlayerProxy.h index d1ca2b22..d68ff054 100644 --- a/src/Device/PlayerProxy.h +++ b/src/Device/PlayerProxy.h @@ -38,7 +38,9 @@ using namespace toolkit; namespace mediakit { -class PlayerProxy :public MediaPlayer, public std::enable_shared_from_this , public MediaSourceEvent { +class PlayerProxy :public MediaPlayer, + public std::enable_shared_from_this , + public MediaSourceEvent{ public: typedef std::shared_ptr Ptr; @@ -58,7 +60,7 @@ public: private: void initMedia(); void rePlay(const string &strUrl,int iFailedCnt); - void makeMuteAudio(uint32_t stamp); + void onPlaySuccess(); private: bool _bEnableHls; bool _bEnableMp4; @@ -67,8 +69,6 @@ private: string _strVhost; string _strApp; string _strSrc; - bool _haveAudio = false; - int _iAudioIndex = 0; }; } /* namespace mediakit */ diff --git a/src/Player/Track.h b/src/Player/Track.h index 231a663d..7d40dbfd 100644 --- a/src/Player/Track.h +++ b/src/Player/Track.h @@ -41,6 +41,7 @@ class Track : public FrameRingInterfaceDelegate , public CodecInfo{ public: typedef std::shared_ptr Ptr; Track(){} + virtual ~Track(){} /** @@ -48,6 +49,19 @@ public: * @return */ virtual bool ready() = 0; + + /** + * 克隆接口,用于复制本对象用 + * @return + */ + virtual Track::Ptr clone() = 0; + + /** + * 复制拷贝,只能拷贝一些描述信息, + * 环形缓存和代理关系不能拷贝,否则会关系紊乱 + * @param that + */ + Track(const Track &that){} }; class VideoTrack : public Track { @@ -245,6 +259,9 @@ private: void parseSps(const string &sps){ getAVCInfo(sps,_width,_height,_fps); } + Track::Ptr clone() override { + return std::make_shared::type >(*this); + } private: string _sps; string _pps; @@ -369,6 +386,9 @@ private: makeAdtsHeader(aac_cfg,aacFrame); getAACInfo(aacFrame,_sampleRate,_channel); } + Track::Ptr clone() override { + return std::make_shared::type >(*this); + } private: string _cfg; int _sampleRate = 0; diff --git a/src/RtmpMuxer/RtmpMuxer.h b/src/RtmpMuxer/RtmpMuxer.h index c4271746..078b8779 100644 --- a/src/RtmpMuxer/RtmpMuxer.h +++ b/src/RtmpMuxer/RtmpMuxer.h @@ -28,10 +28,11 @@ #define ZLMEDIAKIT_RTMPMUXER_H #include "RtmpMetedata.h" +#include "Player/Frame.h" namespace mediakit{ -class RtmpMuxer{ +class RtmpMuxer : public FrameRingWriterInterface{ public: typedef std::shared_ptr Ptr; @@ -64,7 +65,7 @@ public: * 写入帧数据然后打包rtmp * @param frame 帧数据 */ - void inputFrame(const Frame::Ptr &frame) ; + void inputFrame(const Frame::Ptr &frame) override ; /** * 也可以在外部打包好rtmp然后再写入 diff --git a/src/RtspMuxer/RtspMuxer.cpp b/src/RtspMuxer/RtspMuxer.cpp index e05eb717..1d58de5f 100644 --- a/src/RtspMuxer/RtspMuxer.cpp +++ b/src/RtspMuxer/RtspMuxer.cpp @@ -32,7 +32,9 @@ namespace mediakit { void RtspMuxer::addTrack(const Track::Ptr &track, uint32_t ssrc, int mtu) { auto codec_id = track->getCodecId(); _track_map[codec_id] = track; - + if(mtu == 0){ + mtu = (track->getTrackType() == TrackVideo ? 1400 : 600); + } auto lam = [this,ssrc,mtu,track](){ //异步生成rtp编码器 //根据track生产sdp diff --git a/src/RtspMuxer/RtspMuxer.h b/src/RtspMuxer/RtspMuxer.h index acdada97..10e805fb 100644 --- a/src/RtspMuxer/RtspMuxer.h +++ b/src/RtspMuxer/RtspMuxer.h @@ -28,12 +28,13 @@ #define ZLMEDIAKIT_RTSPMUXER_H #include "RtspSdp.h" +#include "Player/Frame.h" namespace mediakit{ /** * rtsp生成器 */ -class RtspMuxer{ +class RtspMuxer : public FrameRingWriterInterface{ public: typedef std::shared_ptr Ptr; @@ -56,7 +57,7 @@ public: * @param ssrc 媒体rtp ssrc * @param mtu 媒体rtp mtu */ - void addTrack(const Track::Ptr & track,uint32_t ssrc = 0,int mtu = 1400) ; + void addTrack(const Track::Ptr & track,uint32_t ssrc = 0,int mtu = 0) ; /** * 获取完整的SDP字符串 @@ -68,7 +69,7 @@ public: * 写入帧数据然后打包rtp * @param frame 帧数据 */ - void inputFrame(const Frame::Ptr &frame) ; + void inputFrame(const Frame::Ptr &frame) override ; /** * 也可以在外部打包好rtp然后再写入