mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-29 14:45:55 +08:00
支持客户端自定义设置EventPoller对象,提高线程安全性
This commit is contained in:
parent
6e2002e451
commit
9247cb9571
@ -32,13 +32,17 @@ using namespace toolkit;
|
|||||||
|
|
||||||
namespace mediakit {
|
namespace mediakit {
|
||||||
|
|
||||||
MediaPlayer::MediaPlayer() {
|
MediaPlayer::MediaPlayer(const EventPoller::Ptr &poller) {
|
||||||
|
_poller = poller;
|
||||||
|
if(!_poller){
|
||||||
|
_poller = EventPollerPool::Instance().getPoller();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MediaPlayer::~MediaPlayer() {
|
MediaPlayer::~MediaPlayer() {
|
||||||
}
|
}
|
||||||
void MediaPlayer::play(const string &strUrl) {
|
void MediaPlayer::play(const string &strUrl) {
|
||||||
_parser = PlayerBase::createPlayer(strUrl);
|
_parser = PlayerBase::createPlayer(_poller,strUrl);
|
||||||
_parser->setOnShutdown(_shutdownCB);
|
_parser->setOnShutdown(_shutdownCB);
|
||||||
_parser->setOnPlayResult(_playResultCB);
|
_parser->setOnPlayResult(_playResultCB);
|
||||||
_parser->setMediaSouce(_pMediaSrc);
|
_parser->setMediaSouce(_pMediaSrc);
|
||||||
@ -47,11 +51,7 @@ void MediaPlayer::play(const string &strUrl) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EventPoller::Ptr MediaPlayer::getPoller(){
|
EventPoller::Ptr MediaPlayer::getPoller(){
|
||||||
auto parser = dynamic_pointer_cast<SocketHelper>(_parser);
|
return _poller;
|
||||||
if(!parser){
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return parser->getPoller();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MediaPlayer::pause(bool bPause) {
|
void MediaPlayer::pause(bool bPause) {
|
||||||
|
@ -41,13 +41,14 @@ class MediaPlayer : public PlayerImp<PlayerBase,PlayerBase> {
|
|||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<MediaPlayer> Ptr;
|
typedef std::shared_ptr<MediaPlayer> Ptr;
|
||||||
|
|
||||||
MediaPlayer();
|
MediaPlayer(const EventPoller::Ptr &poller = nullptr);
|
||||||
virtual ~MediaPlayer();
|
virtual ~MediaPlayer();
|
||||||
void play(const string &strUrl) override;
|
void play(const string &strUrl) override;
|
||||||
void pause(bool bPause) override;
|
void pause(bool bPause) override;
|
||||||
void teardown() override;
|
void teardown() override;
|
||||||
EventPoller::Ptr getPoller();
|
EventPoller::Ptr getPoller();
|
||||||
|
private:
|
||||||
|
EventPoller::Ptr _poller;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace mediakit */
|
} /* namespace mediakit */
|
||||||
|
@ -33,7 +33,7 @@ using namespace toolkit;
|
|||||||
|
|
||||||
namespace mediakit {
|
namespace mediakit {
|
||||||
|
|
||||||
PlayerBase::Ptr PlayerBase::createPlayer(const string &strUrl) {
|
PlayerBase::Ptr PlayerBase::createPlayer(const EventPoller::Ptr &poller,const string &strUrl) {
|
||||||
static auto releasePlayer = [](PlayerBase *ptr){
|
static auto releasePlayer = [](PlayerBase *ptr){
|
||||||
onceToken token(nullptr,[&](){
|
onceToken token(nullptr,[&](){
|
||||||
delete ptr;
|
delete ptr;
|
||||||
@ -42,12 +42,12 @@ PlayerBase::Ptr PlayerBase::createPlayer(const string &strUrl) {
|
|||||||
};
|
};
|
||||||
string prefix = FindField(strUrl.data(), NULL, "://");
|
string prefix = FindField(strUrl.data(), NULL, "://");
|
||||||
if (strcasecmp("rtsp",prefix.data()) == 0) {
|
if (strcasecmp("rtsp",prefix.data()) == 0) {
|
||||||
return PlayerBase::Ptr(new RtspPlayerImp(),releasePlayer);
|
return PlayerBase::Ptr(new RtspPlayerImp(poller),releasePlayer);
|
||||||
}
|
}
|
||||||
if (strcasecmp("rtmp",prefix.data()) == 0) {
|
if (strcasecmp("rtmp",prefix.data()) == 0) {
|
||||||
return PlayerBase::Ptr(new RtmpPlayerImp(),releasePlayer);
|
return PlayerBase::Ptr(new RtmpPlayerImp(poller),releasePlayer);
|
||||||
}
|
}
|
||||||
return PlayerBase::Ptr(new RtspPlayerImp(),releasePlayer);
|
return PlayerBase::Ptr(new RtspPlayerImp(poller),releasePlayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerBase::PlayerBase() {
|
PlayerBase::PlayerBase() {
|
||||||
|
@ -86,7 +86,7 @@ public:
|
|||||||
class PlayerBase : public DemuxerBase, public mINI{
|
class PlayerBase : public DemuxerBase, public mINI{
|
||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<PlayerBase> Ptr;
|
typedef std::shared_ptr<PlayerBase> Ptr;
|
||||||
static Ptr createPlayer(const string &strUrl);
|
static Ptr createPlayer(const EventPoller::Ptr &poller,const string &strUrl);
|
||||||
|
|
||||||
PlayerBase();
|
PlayerBase();
|
||||||
virtual ~PlayerBase(){}
|
virtual ~PlayerBase(){}
|
||||||
@ -154,7 +154,10 @@ class PlayerImp : public Parent
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<PlayerImp> Ptr;
|
typedef std::shared_ptr<PlayerImp> Ptr;
|
||||||
PlayerImp(){}
|
|
||||||
|
template<typename ...ArgsType>
|
||||||
|
PlayerImp(ArgsType &&...args):Parent(std::forward<ArgsType>(args)...){}
|
||||||
|
|
||||||
virtual ~PlayerImp(){}
|
virtual ~PlayerImp(){}
|
||||||
void setOnShutdown(const function<void(const SockException &)> &cb) override {
|
void setOnShutdown(const function<void(const SockException &)> &cb) override {
|
||||||
if (_parser) {
|
if (_parser) {
|
||||||
|
@ -66,7 +66,8 @@ PlayerProxy::PlayerProxy(const string &strVhost,
|
|||||||
const string &strSrc,
|
const string &strSrc,
|
||||||
bool bEnableHls,
|
bool bEnableHls,
|
||||||
bool bEnableMp4,
|
bool bEnableMp4,
|
||||||
int iRetryCount){
|
int iRetryCount,
|
||||||
|
const EventPoller::Ptr &poller) : MediaPlayer(poller){
|
||||||
_strVhost = strVhost;
|
_strVhost = strVhost;
|
||||||
_strApp = strApp;
|
_strApp = strApp;
|
||||||
_strSrc = strSrc;
|
_strSrc = strSrc;
|
||||||
@ -127,21 +128,18 @@ void PlayerProxy::rePlay(const string &strUrl,int iFailedCnt){
|
|||||||
WarnL << "重试播放[" << iFailedCnt << "]:" << strUrl;
|
WarnL << "重试播放[" << iFailedCnt << "]:" << strUrl;
|
||||||
strongPlayer->MediaPlayer::play(strUrl);
|
strongPlayer->MediaPlayer::play(strUrl);
|
||||||
return false;
|
return false;
|
||||||
}, nullptr);
|
}, getPoller());
|
||||||
}
|
}
|
||||||
bool PlayerProxy::close() {
|
bool PlayerProxy::close() {
|
||||||
//通知其停止推流
|
//通知其停止推流
|
||||||
weak_ptr<PlayerProxy> weakSlef = dynamic_pointer_cast<PlayerProxy>(shared_from_this());
|
weak_ptr<PlayerProxy> weakSlef = dynamic_pointer_cast<PlayerProxy>(shared_from_this());
|
||||||
auto poller = getPoller();
|
getPoller()->async_first([weakSlef]() {
|
||||||
if(poller) {
|
auto stronSelf = weakSlef.lock();
|
||||||
poller->async_first([weakSlef]() {
|
if (stronSelf) {
|
||||||
auto stronSelf = weakSlef.lock();
|
stronSelf->_mediaMuxer.reset();
|
||||||
if (stronSelf) {
|
stronSelf->teardown();
|
||||||
stronSelf->_mediaMuxer.reset();
|
}
|
||||||
stronSelf->teardown();
|
});
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,8 @@ public:
|
|||||||
const string &strSrc,
|
const string &strSrc,
|
||||||
bool bEnableHls = true,
|
bool bEnableHls = true,
|
||||||
bool bEnableMp4 = false,
|
bool bEnableMp4 = false,
|
||||||
int iRetryCount = -1);
|
int iRetryCount = -1,
|
||||||
|
const EventPoller::Ptr &poller = nullptr);
|
||||||
|
|
||||||
virtual ~PlayerProxy();
|
virtual ~PlayerProxy();
|
||||||
|
|
||||||
|
@ -32,21 +32,27 @@ using namespace toolkit;
|
|||||||
|
|
||||||
namespace mediakit {
|
namespace mediakit {
|
||||||
|
|
||||||
MediaPusher::MediaPusher(const MediaSource::Ptr &src) {
|
MediaPusher::MediaPusher(const MediaSource::Ptr &src,
|
||||||
|
const EventPoller::Ptr &poller) {
|
||||||
_src = src;
|
_src = src;
|
||||||
|
_poller = poller;
|
||||||
|
if(!_poller){
|
||||||
|
_poller = EventPollerPool::Instance().getPoller();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MediaPusher::MediaPusher(const string &schema,
|
MediaPusher::MediaPusher(const string &schema,
|
||||||
const string &strVhost,
|
const string &strVhost,
|
||||||
const string &strApp,
|
const string &strApp,
|
||||||
const string &strStream) {
|
const string &strStream,
|
||||||
_src = MediaSource::find(schema,strVhost,strApp,strStream);
|
const EventPoller::Ptr &poller) :
|
||||||
|
MediaPusher(MediaSource::find(schema,strVhost,strApp,strStream),poller){
|
||||||
}
|
}
|
||||||
|
|
||||||
MediaPusher::~MediaPusher() {
|
MediaPusher::~MediaPusher() {
|
||||||
}
|
}
|
||||||
void MediaPusher::publish(const string &strUrl) {
|
void MediaPusher::publish(const string &strUrl) {
|
||||||
_parser = PusherBase::createPusher(_src.lock(),strUrl);
|
_parser = PusherBase::createPusher(_poller,_src.lock(),strUrl);
|
||||||
_parser->setOnShutdown(_shutdownCB);
|
_parser->setOnShutdown(_shutdownCB);
|
||||||
_parser->setOnPublished(_publishCB);
|
_parser->setOnPublished(_publishCB);
|
||||||
_parser->mINI::operator=(*this);
|
_parser->mINI::operator=(*this);
|
||||||
@ -54,11 +60,7 @@ void MediaPusher::publish(const string &strUrl) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EventPoller::Ptr MediaPusher::getPoller(){
|
EventPoller::Ptr MediaPusher::getPoller(){
|
||||||
auto parser = dynamic_pointer_cast<SocketHelper>(_parser);
|
return _poller;
|
||||||
if(!parser){
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return parser->getPoller();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,15 +42,18 @@ public:
|
|||||||
MediaPusher(const string &schema,
|
MediaPusher(const string &schema,
|
||||||
const string &strVhost,
|
const string &strVhost,
|
||||||
const string &strApp,
|
const string &strApp,
|
||||||
const string &strStream);
|
const string &strStream,
|
||||||
|
const EventPoller::Ptr &poller = nullptr);
|
||||||
|
|
||||||
MediaPusher(const MediaSource::Ptr &src);
|
MediaPusher(const MediaSource::Ptr &src,
|
||||||
|
const EventPoller::Ptr &poller = nullptr);
|
||||||
|
|
||||||
virtual ~MediaPusher();
|
virtual ~MediaPusher();
|
||||||
void publish(const string &strUrl) override;
|
void publish(const string &strUrl) override;
|
||||||
EventPoller::Ptr getPoller();
|
EventPoller::Ptr getPoller();
|
||||||
private:
|
private:
|
||||||
std::weak_ptr<MediaSource> _src;
|
std::weak_ptr<MediaSource> _src;
|
||||||
|
EventPoller::Ptr _poller;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace mediakit */
|
} /* namespace mediakit */
|
||||||
|
@ -35,7 +35,8 @@ using namespace mediakit::Client;
|
|||||||
|
|
||||||
namespace mediakit {
|
namespace mediakit {
|
||||||
|
|
||||||
PusherBase::Ptr PusherBase::createPusher(const MediaSource::Ptr &src,
|
PusherBase::Ptr PusherBase::createPusher(const EventPoller::Ptr &poller,
|
||||||
|
const MediaSource::Ptr &src,
|
||||||
const string & strUrl) {
|
const string & strUrl) {
|
||||||
static auto releasePusher = [](PusherBase *ptr){
|
static auto releasePusher = [](PusherBase *ptr){
|
||||||
onceToken token(nullptr,[&](){
|
onceToken token(nullptr,[&](){
|
||||||
@ -45,12 +46,12 @@ PusherBase::Ptr PusherBase::createPusher(const MediaSource::Ptr &src,
|
|||||||
};
|
};
|
||||||
string prefix = FindField(strUrl.data(), NULL, "://");
|
string prefix = FindField(strUrl.data(), NULL, "://");
|
||||||
if (strcasecmp("rtsp",prefix.data()) == 0) {
|
if (strcasecmp("rtsp",prefix.data()) == 0) {
|
||||||
return PusherBase::Ptr(new RtspPusher(dynamic_pointer_cast<RtspMediaSource>(src)),releasePusher);
|
return PusherBase::Ptr(new RtspPusher(poller,dynamic_pointer_cast<RtspMediaSource>(src)),releasePusher);
|
||||||
}
|
}
|
||||||
if (strcasecmp("rtmp",prefix.data()) == 0) {
|
if (strcasecmp("rtmp",prefix.data()) == 0) {
|
||||||
return PusherBase::Ptr(new RtmpPusher(dynamic_pointer_cast<RtmpMediaSource>(src)),releasePusher);
|
return PusherBase::Ptr(new RtmpPusher(poller,dynamic_pointer_cast<RtmpMediaSource>(src)),releasePusher);
|
||||||
}
|
}
|
||||||
return PusherBase::Ptr(new RtspPusher(dynamic_pointer_cast<RtspMediaSource>(src)),releasePusher);
|
return PusherBase::Ptr(new RtspPusher(poller,dynamic_pointer_cast<RtspMediaSource>(src)),releasePusher);
|
||||||
}
|
}
|
||||||
|
|
||||||
PusherBase::PusherBase() {
|
PusherBase::PusherBase() {
|
||||||
|
@ -44,7 +44,8 @@ public:
|
|||||||
typedef std::shared_ptr<PusherBase> Ptr;
|
typedef std::shared_ptr<PusherBase> Ptr;
|
||||||
typedef std::function<void(const SockException &ex)> Event;
|
typedef std::function<void(const SockException &ex)> Event;
|
||||||
|
|
||||||
static Ptr createPusher(const MediaSource::Ptr &src,
|
static Ptr createPusher(const EventPoller::Ptr &poller,
|
||||||
|
const MediaSource::Ptr &src,
|
||||||
const string &strUrl);
|
const string &strUrl);
|
||||||
|
|
||||||
PusherBase();
|
PusherBase();
|
||||||
@ -78,7 +79,10 @@ template<typename Parent,typename Parser>
|
|||||||
class PusherImp : public Parent {
|
class PusherImp : public Parent {
|
||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<PusherImp> Ptr;
|
typedef std::shared_ptr<PusherImp> Ptr;
|
||||||
PusherImp(){}
|
|
||||||
|
template<typename ...ArgsType>
|
||||||
|
PusherImp(ArgsType &&...args):Parent(std::forward<ArgsType>(args)...){}
|
||||||
|
|
||||||
virtual ~PusherImp(){}
|
virtual ~PusherImp(){}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -36,7 +36,7 @@ using namespace mediakit::Client;
|
|||||||
namespace mediakit {
|
namespace mediakit {
|
||||||
|
|
||||||
unordered_map<string, RtmpPlayer::rtmpCMDHandle> RtmpPlayer::g_mapCmd;
|
unordered_map<string, RtmpPlayer::rtmpCMDHandle> RtmpPlayer::g_mapCmd;
|
||||||
RtmpPlayer::RtmpPlayer() {
|
RtmpPlayer::RtmpPlayer(const EventPoller::Ptr &poller) : TcpClient(poller) {
|
||||||
static onceToken token([]() {
|
static onceToken token([]() {
|
||||||
g_mapCmd.emplace("_error",&RtmpPlayer::onCmd_result);
|
g_mapCmd.emplace("_error",&RtmpPlayer::onCmd_result);
|
||||||
g_mapCmd.emplace("_result",&RtmpPlayer::onCmd_result);
|
g_mapCmd.emplace("_result",&RtmpPlayer::onCmd_result);
|
||||||
|
@ -48,7 +48,7 @@ namespace mediakit {
|
|||||||
class RtmpPlayer:public PlayerBase, public TcpClient, public RtmpProtocol{
|
class RtmpPlayer:public PlayerBase, public TcpClient, public RtmpProtocol{
|
||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<RtmpPlayer> Ptr;
|
typedef std::shared_ptr<RtmpPlayer> Ptr;
|
||||||
RtmpPlayer();
|
RtmpPlayer(const EventPoller::Ptr &poller);
|
||||||
virtual ~RtmpPlayer();
|
virtual ~RtmpPlayer();
|
||||||
|
|
||||||
void play(const string &strUrl) override;
|
void play(const string &strUrl) override;
|
||||||
|
@ -43,7 +43,7 @@ namespace mediakit {
|
|||||||
class RtmpPlayerImp: public PlayerImp<RtmpPlayer,RtmpDemuxer> {
|
class RtmpPlayerImp: public PlayerImp<RtmpPlayer,RtmpDemuxer> {
|
||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<RtmpPlayerImp> Ptr;
|
typedef std::shared_ptr<RtmpPlayerImp> Ptr;
|
||||||
RtmpPlayerImp(){};
|
RtmpPlayerImp(const EventPoller::Ptr &poller) : PlayerImp<RtmpPlayer,RtmpDemuxer>(poller){};
|
||||||
virtual ~RtmpPlayerImp(){
|
virtual ~RtmpPlayerImp(){
|
||||||
DebugL<<endl;
|
DebugL<<endl;
|
||||||
};
|
};
|
||||||
|
@ -36,7 +36,7 @@ namespace mediakit {
|
|||||||
|
|
||||||
static int kSockFlags = SOCKET_DEFAULE_FLAGS | FLAG_MORE;
|
static int kSockFlags = SOCKET_DEFAULE_FLAGS | FLAG_MORE;
|
||||||
|
|
||||||
RtmpPusher::RtmpPusher(const RtmpMediaSource::Ptr &src){
|
RtmpPusher::RtmpPusher(const EventPoller::Ptr &poller,const RtmpMediaSource::Ptr &src) : TcpClient(poller){
|
||||||
_pMediaSrc=src;
|
_pMediaSrc=src;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ namespace mediakit {
|
|||||||
class RtmpPusher: public RtmpProtocol , public TcpClient , public PusherBase{
|
class RtmpPusher: public RtmpProtocol , public TcpClient , public PusherBase{
|
||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<RtmpPusher> Ptr;
|
typedef std::shared_ptr<RtmpPusher> Ptr;
|
||||||
RtmpPusher(const RtmpMediaSource::Ptr &src);
|
RtmpPusher(const EventPoller::Ptr &poller,const RtmpMediaSource::Ptr &src);
|
||||||
virtual ~RtmpPusher();
|
virtual ~RtmpPusher();
|
||||||
|
|
||||||
void publish(const string &strUrl) override ;
|
void publish(const string &strUrl) override ;
|
||||||
|
@ -43,7 +43,7 @@ using namespace mediakit::Client;
|
|||||||
|
|
||||||
namespace mediakit {
|
namespace mediakit {
|
||||||
|
|
||||||
RtspPlayer::RtspPlayer(void){
|
RtspPlayer::RtspPlayer(const EventPoller::Ptr &poller) : TcpClient(poller){
|
||||||
RtpReceiver::setPoolSize(64);
|
RtpReceiver::setPoolSize(64);
|
||||||
}
|
}
|
||||||
RtspPlayer::~RtspPlayer(void) {
|
RtspPlayer::~RtspPlayer(void) {
|
||||||
|
@ -52,7 +52,7 @@ class RtspPlayer: public PlayerBase,public TcpClient, public RtspSplitter, publi
|
|||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<RtspPlayer> Ptr;
|
typedef std::shared_ptr<RtspPlayer> Ptr;
|
||||||
|
|
||||||
RtspPlayer();
|
RtspPlayer(const EventPoller::Ptr &poller) ;
|
||||||
virtual ~RtspPlayer(void);
|
virtual ~RtspPlayer(void);
|
||||||
void play(const string &strUrl) override;
|
void play(const string &strUrl) override;
|
||||||
void pause(bool bPause) override;
|
void pause(bool bPause) override;
|
||||||
|
@ -44,7 +44,7 @@ namespace mediakit {
|
|||||||
class RtspPlayerImp: public PlayerImp<RtspPlayer,RtspDemuxer> {
|
class RtspPlayerImp: public PlayerImp<RtspPlayer,RtspDemuxer> {
|
||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<RtspPlayerImp> Ptr;
|
typedef std::shared_ptr<RtspPlayerImp> Ptr;
|
||||||
RtspPlayerImp(){};
|
RtspPlayerImp(const EventPoller::Ptr &poller) : PlayerImp<RtspPlayer,RtspDemuxer>(poller){}
|
||||||
virtual ~RtspPlayerImp(){
|
virtual ~RtspPlayerImp(){
|
||||||
DebugL<<endl;
|
DebugL<<endl;
|
||||||
};
|
};
|
||||||
|
@ -13,7 +13,7 @@ namespace mediakit {
|
|||||||
|
|
||||||
static int kSockFlags = SOCKET_DEFAULE_FLAGS | FLAG_MORE;
|
static int kSockFlags = SOCKET_DEFAULE_FLAGS | FLAG_MORE;
|
||||||
|
|
||||||
RtspPusher::RtspPusher(const RtspMediaSource::Ptr &src) {
|
RtspPusher::RtspPusher(const EventPoller::Ptr &poller,const RtspMediaSource::Ptr &src) : TcpClient(poller){
|
||||||
_pMediaSrc = src;
|
_pMediaSrc = src;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ namespace mediakit {
|
|||||||
class RtspPusher : public TcpClient, public RtspSplitter, public PusherBase {
|
class RtspPusher : public TcpClient, public RtspSplitter, public PusherBase {
|
||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<RtspPusher> Ptr;
|
typedef std::shared_ptr<RtspPusher> Ptr;
|
||||||
RtspPusher(const RtspMediaSource::Ptr &src);
|
RtspPusher(const EventPoller::Ptr &poller,const RtspMediaSource::Ptr &src);
|
||||||
virtual ~RtspPusher();
|
virtual ~RtspPusher();
|
||||||
|
|
||||||
void publish(const string &strUrl) override;
|
void publish(const string &strUrl) override;
|
||||||
|
Loading…
Reference in New Issue
Block a user