Commit 537ae2f4 by 夏楚 Committed by GitHub

Merge pull request #651 from sunhui2013/master

添加停止、恢复rtp代理rtp超时检查功能,解决播放器暂停后断流问题
parents fd15fe70 cbc1f919
...@@ -1024,6 +1024,68 @@ ...@@ -1024,6 +1024,68 @@
"response": [] "response": []
}, },
{ {
"name": "暂停RTP超时检查(pauseRtpCheck)",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{ZLMediaKit_URL}}/index/api/pauseRtpCheck?secret={{ZLMediaKit_secret}}&stream_id=test",
"host": [
"{{ZLMediaKit_URL}}"
],
"path": [
"index",
"api",
"pauseRtpCheck"
],
"query": [
{
"key": "secret",
"value": "{{ZLMediaKit_secret}}",
"description": "api操作密钥(配置文件配置),如果操作ip是127.0.0.1,则不需要此参数"
},
{
"key": "stream_id",
"value": "test",
"description": "该端口绑定的流id"
}
]
}
},
"response": []
},
{
"name": "恢复RTP超时检查(resumeRtpCheck)",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{ZLMediaKit_URL}}/index/api/resumeRtpCheck?secret={{ZLMediaKit_secret}}&stream_id=test",
"host": [
"{{ZLMediaKit_URL}}"
],
"path": [
"index",
"api",
"resumeRtpCheck"
],
"query": [
{
"key": "secret",
"value": "{{ZLMediaKit_secret}}",
"description": "api操作密钥(配置文件配置),如果操作ip是127.0.0.1,则不需要此参数"
},
{
"key": "stream_id",
"value": "test",
"description": "该端口绑定的流id"
}
]
}
},
"response": []
},
{
"name": "获取RTP服务器列表(listRtpServer)", "name": "获取RTP服务器列表(listRtpServer)",
"request": { "request": {
"method": "GET", "method": "GET",
......
...@@ -875,6 +875,37 @@ void installWebApi() { ...@@ -875,6 +875,37 @@ void installWebApi() {
} }
}); });
api_regist1("/index/api/pauseRtpCheck", [](API_ARGS1) {
CHECK_SECRET();
CHECK_ARGS("stream_id");
//只是暂停流的检查,流媒体服务器做为流负载服务,收流就转发,RTSP/RTMP有自己暂停协议
lock_guard<recursive_mutex> lck(s_rtpServerMapMtx);
auto it = s_rtpServerMap.find(allArgs["stream_id"]);
if (it == s_rtpServerMap.end())
{
val["hit"] = 0;
return;
}
auto server = it->second;
server->pauseRtpCheck();
val["hit"] = 1;
});
api_regist1("/index/api/resumeRtpCheck", [](API_ARGS1) {
CHECK_SECRET();
CHECK_ARGS("stream_id");
lock_guard<recursive_mutex> lck(s_rtpServerMapMtx);
auto it = s_rtpServerMap.find(allArgs["stream_id"]);
if (it == s_rtpServerMap.end())
{
val["hit"] = 0;
return;
}
auto server = it->second;
server->resumeRtpCheck();
val["hit"] = 1;
});
#endif//ENABLE_RTPPROXY #endif//ENABLE_RTPPROXY
......
...@@ -28,6 +28,7 @@ RtpProcess::RtpProcess(const string &stream_id) { ...@@ -28,6 +28,7 @@ RtpProcess::RtpProcess(const string &stream_id) {
_media_info._vhost = DEFAULT_VHOST; _media_info._vhost = DEFAULT_VHOST;
_media_info._app = RTP_APP_NAME; _media_info._app = RTP_APP_NAME;
_media_info._streamid = stream_id; _media_info._streamid = stream_id;
_stop_rtp_check.store(false);
GET_CONFIG(string, dump_dir, RtpProxy::kDumpDir); GET_CONFIG(string, dump_dir, RtpProxy::kDumpDir);
{ {
...@@ -134,6 +135,8 @@ void RtpProcess::addTrackCompleted() { ...@@ -134,6 +135,8 @@ void RtpProcess::addTrackCompleted() {
} }
bool RtpProcess::alive() { bool RtpProcess::alive() {
if(_stop_rtp_check.load())
return true;
GET_CONFIG(int, timeoutSec, RtpProxy::kTimeoutSec) GET_CONFIG(int, timeoutSec, RtpProxy::kTimeoutSec)
if (_last_frame_time.elapsedTime() / 1000 < timeoutSec) { if (_last_frame_time.elapsedTime() / 1000 < timeoutSec) {
return true; return true;
...@@ -141,6 +144,10 @@ bool RtpProcess::alive() { ...@@ -141,6 +144,10 @@ bool RtpProcess::alive() {
return false; return false;
} }
void RtpProcess::setStopCheckRtp(bool is_check){
_stop_rtp_check = is_check;
}
void RtpProcess::onDetach() { void RtpProcess::onDetach() {
if (_on_detach) { if (_on_detach) {
_on_detach(); _on_detach();
......
...@@ -53,6 +53,11 @@ public: ...@@ -53,6 +53,11 @@ public:
*/ */
void setOnDetach(const function<void()> &cb); void setOnDetach(const function<void()> &cb);
/**
* 设置onDetach事件回调,false检查RTP超时,true停止
*/
void setStopCheckRtp(bool is_check=false);
/// SockInfo override /// SockInfo override
string get_local_ip() override; string get_local_ip() override;
uint16_t get_local_port() override; uint16_t get_local_port() override;
...@@ -89,6 +94,7 @@ private: ...@@ -89,6 +94,7 @@ private:
std::shared_ptr<FILE> _save_file_video; std::shared_ptr<FILE> _save_file_video;
ProcessInterface::Ptr _process; ProcessInterface::Ptr _process;
MultiMediaSourceMuxer::Ptr _muxer; MultiMediaSourceMuxer::Ptr _muxer;
std::atomic_bool _stop_rtp_check;
}; };
}//namespace mediakit }//namespace mediakit
......
...@@ -90,5 +90,16 @@ uint16_t RtpServer::getPort() { ...@@ -90,5 +90,16 @@ uint16_t RtpServer::getPort() {
return _udp_server ? _udp_server->get_local_port() : 0; return _udp_server ? _udp_server->get_local_port() : 0;
} }
void RtpServer::pauseRtpCheck(){
if(_rtp_process)
_rtp_process->setStopCheckRtp(true);
}
void RtpServer::resumeRtpCheck(){
if(_rtp_process)
_rtp_process->setStopCheckRtp(false);
}
}//namespace mediakit }//namespace mediakit
#endif//defined(ENABLE_RTPPROXY) #endif//defined(ENABLE_RTPPROXY)
\ No newline at end of file
...@@ -56,6 +56,14 @@ public: ...@@ -56,6 +56,14 @@ public:
* 设置RtpProcess onDetach事件回调 * 设置RtpProcess onDetach事件回调
*/ */
void setOnDetach(const function<void()> &cb); void setOnDetach(const function<void()> &cb);
/**
* 暂停Rtp服务的RTP流检测
*/
void pauseRtpCheck();
/**
* 恢复Rtp服务的RTP流检测
*/
void resumeRtpCheck();
protected: protected:
Socket::Ptr _udp_server; Socket::Ptr _udp_server;
......
...@@ -106,7 +106,7 @@ void RtspSession::onManager() { ...@@ -106,7 +106,7 @@ void RtspSession::onManager() {
} }
} }
if ((_rtp_type == Rtsp::RTP_UDP || _push_src ) && _alive_ticker.elapsedTime() > keep_alive_sec * 1000) { if ((_rtp_type == Rtsp::RTP_UDP || _push_src ) && _alive_ticker.elapsedTime() > keep_alive_sec * 1000 && _enable_send_rtp) {
//如果是推流端或者rtp over udp类型的播放端,那么就做超时检测 //如果是推流端或者rtp over udp类型的播放端,那么就做超时检测
shutdown(SockException(Err_timeout,"rtp over udp session timeouted")); shutdown(SockException(Err_timeout,"rtp over udp session timeouted"));
return; return;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论