动态代理拉流等待拉流结果

This commit is contained in:
xiongziliang 2019-05-20 18:08:55 +08:00
parent fbead02868
commit ce7a0223f1
3 changed files with 32 additions and 6 deletions

View File

@ -363,7 +363,7 @@ void installWebApi() {
}); });
API_REGIST(api,addStreamProxy,{ API_REGIST_INVOKER(api,addStreamProxy,{
CHECK_SECRET(); CHECK_SECRET();
CHECK_ARGS("vhost","app","stream","url","secret"); CHECK_ARGS("vhost","app","stream","url","secret");
//添加拉流代理 //添加拉流代理
@ -376,12 +376,20 @@ void installWebApi() {
)); ));
//指定RTP over TCP(播放rtsp时有效) //指定RTP over TCP(播放rtsp时有效)
(*player)[kRtpType] = allArgs["rtp_type"].as<int>(); (*player)[kRtpType] = allArgs["rtp_type"].as<int>();
//开始播放,如果播放失败或者播放中止,将会自动重试若干次,重试次数在配置文件中配置,默认一直重试 //开始播放,如果播放失败或者播放中止,将会自动重试若干次,默认一直重试
player->setPlayCallbackOnce([invoker,val,headerOut,player](const SockException &ex){
if(ex){
const_cast<Value &>(val)["code"] = API::OtherFailed;
const_cast<Value &>(val)["msg"] = ex.what();
}else{
const_cast<Value &>(val)["data"]["id"] = (uint64_t)player.get();
lock_guard<recursive_mutex> lck(s_proxyMapMtx);
s_proxyMap[(uint64_t)player.get()] = player;
}
const_cast<PlayerProxy::Ptr &>(player).reset();
invoker("200 OK", headerOut, val.toStyledString());
});
player->play(allArgs["url"]); player->play(allArgs["url"]);
val["data"]["id"] = player.get();
lock_guard<recursive_mutex> lck(s_proxyMapMtx);
s_proxyMap[(uint64_t)player.get()] = player;
}); });
API_REGIST(api,delStreamProxy,{ API_REGIST(api,delStreamProxy,{

View File

@ -75,6 +75,10 @@ PlayerProxy::PlayerProxy(const string &strVhost,
_bEnableMp4 = bEnableMp4; _bEnableMp4 = bEnableMp4;
_iRetryCount = iRetryCount; _iRetryCount = iRetryCount;
} }
void PlayerProxy::setPlayCallbackOnce(const function<void(const SockException &ex)> &cb){
_playCB = cb;
}
void PlayerProxy::play(const string &strUrlTmp) { void PlayerProxy::play(const string &strUrlTmp) {
weak_ptr<PlayerProxy> weakSelf = shared_from_this(); weak_ptr<PlayerProxy> weakSelf = shared_from_this();
std::shared_ptr<int> piFailedCnt(new int(0)); //连续播放失败次数 std::shared_ptr<int> piFailedCnt(new int(0)); //连续播放失败次数
@ -83,6 +87,12 @@ void PlayerProxy::play(const string &strUrlTmp) {
if(!strongSelf) { if(!strongSelf) {
return; return;
} }
if(strongSelf->_playCB) {
strongSelf->_playCB(err);
strongSelf->_playCB = nullptr;
}
if(!err) { if(!err) {
// 播放成功 // 播放成功
*piFailedCnt = 0;//连续播放失败次数清0 *piFailedCnt = 0;//连续播放失败次数清0

View File

@ -56,7 +56,14 @@ public:
virtual ~PlayerProxy(); virtual ~PlayerProxy();
/**
* play结果回调play执行之前有效
* @param cb
*/
void setPlayCallbackOnce(const function<void(const SockException &ex)> &cb);
void play(const string &strUrl) override; void play(const string &strUrl) override;
bool close() override; bool close() override;
private: private:
void rePlay(const string &strUrl,int iFailedCnt); void rePlay(const string &strUrl,int iFailedCnt);
@ -70,6 +77,7 @@ private:
string _strApp; string _strApp;
string _strSrc; string _strSrc;
Timer::Ptr _timer; Timer::Ptr _timer;
function<void(const SockException &ex)> _playCB;
}; };
} /* namespace mediakit */ } /* namespace mediakit */