mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
流未找到事件中,可以立即返回播放失败: #417
This commit is contained in:
parent
85f28ce1f0
commit
f84b3d90b4
@ -1 +1 @@
|
|||||||
Subproject commit 60aab3b9f6230312c882b9d3d360ed27c94ebd9f
|
Subproject commit 17e82574991134f798ae32f82d48e2d6c6b97b06
|
@ -178,7 +178,7 @@ static void eraseIfEmpty(MAP &map, IT0 it0, IT1 it1, IT2 it2) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
void MediaSource::findAsync_l(const MediaInfo &info, const std::shared_ptr<TcpSession> &session, bool retry, const function<void(const MediaSource::Ptr &src)> &cb){
|
void MediaSource::findAsync_l(const MediaInfo &info, const std::shared_ptr<TcpSession> &session, bool retry, const function<void(const MediaSource::Ptr &src)> &cb){
|
||||||
auto src = MediaSource::find_l(info._schema, info._vhost, info._app, info._streamid, true);
|
auto src = MediaSource::find_l(info._schema, info._vhost, info._app, info._streamid, true);
|
||||||
@ -189,28 +189,33 @@ void MediaSource::findAsync_l(const MediaInfo &info, const std::shared_ptr<TcpSe
|
|||||||
|
|
||||||
void *listener_tag = session.get();
|
void *listener_tag = session.get();
|
||||||
weak_ptr<TcpSession> weakSession = session;
|
weak_ptr<TcpSession> weakSession = session;
|
||||||
//广播未找到流,此时可以立即去拉流,这样还来得及
|
|
||||||
NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastNotFoundStream,info, static_cast<SockInfo &>(*session));
|
|
||||||
|
|
||||||
//最多等待一定时间,如果这个时间内,流未注册上,那么返回未找到流
|
|
||||||
GET_CONFIG(int, maxWaitMS, General::kMaxStreamWaitTimeMS);
|
GET_CONFIG(int, maxWaitMS, General::kMaxStreamWaitTimeMS);
|
||||||
|
auto onTimeout = session->getPoller()->doDelayTask(maxWaitMS, [cb, listener_tag]() {
|
||||||
//若干秒后执行等待媒体注册超时回调
|
//最多等待一定时间,如果这个时间内,流未注册上,那么返回未找到流
|
||||||
auto onRegistTimeout = session->getPoller()->doDelayTask(maxWaitMS,[cb,listener_tag](){
|
|
||||||
//取消监听该事件
|
|
||||||
NoticeCenter::Instance().delListener(listener_tag, Broadcast::kBroadcastMediaChanged);
|
NoticeCenter::Instance().delListener(listener_tag, Broadcast::kBroadcastMediaChanged);
|
||||||
cb(nullptr);
|
cb(nullptr);
|
||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
auto onRegist = [listener_tag,weakSession,info,cb,onRegistTimeout](BroadcastMediaChangedArgs) {
|
auto cancelAll = [onTimeout, listener_tag]() {
|
||||||
|
//取消延时任务,防止多次回调
|
||||||
|
onTimeout->cancel();
|
||||||
|
//取消媒体注册事件监听
|
||||||
|
NoticeCenter::Instance().delListener(listener_tag, Broadcast::kBroadcastMediaChanged);
|
||||||
|
};
|
||||||
|
|
||||||
|
function<void()> closePlayer = [cb, cancelAll]() {
|
||||||
|
cancelAll();
|
||||||
|
//告诉播放器,流不存在,这样会立即断开播放器
|
||||||
|
cb(nullptr);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto onRegist = [weakSession, info, cb, cancelAll](BroadcastMediaChangedArgs) {
|
||||||
auto strongSession = weakSession.lock();
|
auto strongSession = weakSession.lock();
|
||||||
if (!strongSession) {
|
if (!strongSession) {
|
||||||
//自己已经销毁
|
//自己已经销毁
|
||||||
//取消延时任务,防止多次回调
|
cancelAll();
|
||||||
onRegistTimeout->cancel();
|
|
||||||
//取消事件监听
|
|
||||||
NoticeCenter::Instance().delListener(listener_tag,Broadcast::kBroadcastMediaChanged);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,10 +228,7 @@ void MediaSource::findAsync_l(const MediaInfo &info, const std::shared_ptr<TcpSe
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//取消延时任务,防止多次回调
|
cancelAll();
|
||||||
onRegistTimeout->cancel();
|
|
||||||
//取消事件监听
|
|
||||||
NoticeCenter::Instance().delListener(listener_tag,Broadcast::kBroadcastMediaChanged);
|
|
||||||
|
|
||||||
//播发器请求的流终于注册上了,切换到自己的线程再回复
|
//播发器请求的流终于注册上了,切换到自己的线程再回复
|
||||||
strongSession->async([weakSession, info, cb]() {
|
strongSession->async([weakSession, info, cb]() {
|
||||||
@ -239,8 +241,11 @@ void MediaSource::findAsync_l(const MediaInfo &info, const std::shared_ptr<TcpSe
|
|||||||
findAsync_l(info, strongSession, false, cb);
|
findAsync_l(info, strongSession, false, cb);
|
||||||
}, false);
|
}, false);
|
||||||
};
|
};
|
||||||
|
|
||||||
//监听媒体注册事件
|
//监听媒体注册事件
|
||||||
NoticeCenter::Instance().addListener(listener_tag, Broadcast::kBroadcastMediaChanged, onRegist);
|
NoticeCenter::Instance().addListener(listener_tag, Broadcast::kBroadcastMediaChanged, onRegist);
|
||||||
|
//广播未找到流,此时可以立即去拉流,这样还来得及
|
||||||
|
NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastNotFoundStream, info, static_cast<SockInfo &>(*session), closePlayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MediaSource::findAsync(const MediaInfo &info, const std::shared_ptr<TcpSession> &session,const function<void(const Ptr &src)> &cb){
|
void MediaSource::findAsync(const MediaInfo &info, const std::shared_ptr<TcpSession> &session,const function<void(const Ptr &src)> &cb){
|
||||||
|
@ -111,7 +111,7 @@ extern const string kBroadcastFlowReport;
|
|||||||
|
|
||||||
//未找到流后会广播该事件,请在监听该事件后去拉流或其他方式产生流,这样就能按需拉流了
|
//未找到流后会广播该事件,请在监听该事件后去拉流或其他方式产生流,这样就能按需拉流了
|
||||||
extern const string kBroadcastNotFoundStream;
|
extern const string kBroadcastNotFoundStream;
|
||||||
#define BroadcastNotFoundStreamArgs const MediaInfo &args,SockInfo &sender
|
#define BroadcastNotFoundStreamArgs const MediaInfo &args,SockInfo &sender, const function<void()> &closePlayer
|
||||||
|
|
||||||
//某个流无人消费时触发,目的为了实现无人观看时主动断开拉流等业务逻辑
|
//某个流无人消费时触发,目的为了实现无人观看时主动断开拉流等业务逻辑
|
||||||
extern const string kBroadcastStreamNoneReader;
|
extern const string kBroadcastStreamNoneReader;
|
||||||
|
Loading…
Reference in New Issue
Block a user