diff --git a/api/tests/h264_media_server.c b/api/tests/h264_media_server.c index 051d477c..3e0084f5 100644 --- a/api/tests/h264_media_server.c +++ b/api/tests/h264_media_server.c @@ -10,6 +10,7 @@ #include #include +#include #ifdef _WIN32 #include "windows.h" #else diff --git a/server/WebApi.cpp b/server/WebApi.cpp index 261446aa..35c8a3c6 100755 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -368,6 +368,38 @@ Value makeMediaSourceJson(MediaSource &media){ return item; } +uint16_t openRtpServer(uint16_t local_port, const string &stream_id, bool enable_tcp, const string &local_ip, bool re_use_port, uint32_t ssrc) { + lock_guard lck(s_rtpServerMapMtx); + if (s_rtpServerMap.find(stream_id) != s_rtpServerMap.end()) { + //为了防止RtpProcess所有权限混乱的问题,不允许重复添加相同的stream_id + return 0; + } + + RtpServer::Ptr server = std::make_shared(); + server->start(local_port, stream_id, enable_tcp, local_ip.c_str(), re_use_port, ssrc); + server->setOnDetach([stream_id]() { + //设置rtp超时移除事件 + lock_guard lck(s_rtpServerMapMtx); + s_rtpServerMap.erase(stream_id); + }); + + //保存对象 + s_rtpServerMap.emplace(stream_id, server); + //回复json + return server->getPort(); +} + +bool closeRtpServer(const string &stream_id) { + lock_guard lck(s_rtpServerMapMtx); + auto it = s_rtpServerMap.find(stream_id); + if (it == s_rtpServerMap.end()) { + return false; + } + auto server = it->second; + s_rtpServerMap.erase(it); + return true; +} + void getStatisticJson(const function &cb) { auto obj = std::make_shared(objectValue); auto &val = *obj; @@ -1056,40 +1088,23 @@ void installWebApi() { CHECK_SECRET(); CHECK_ARGS("port", "enable_tcp", "stream_id"); auto stream_id = allArgs["stream_id"]; - - lock_guard lck(s_rtpServerMapMtx); - if (s_rtpServerMap.find(stream_id) != s_rtpServerMap.end()) { - //为了防止RtpProcess所有权限混乱的问题,不允许重复添加相同的stream_id + auto port = openRtpServer(allArgs["port"], stream_id, allArgs["enable_tcp"].as(), "::", + allArgs["re_use_port"].as(), allArgs["ssrc"].as()); + if(port == 0) { throw InvalidArgsException("该stream_id已存在"); } - - RtpServer::Ptr server = std::make_shared(); - server->start(allArgs["port"], stream_id, allArgs["enable_tcp"].as(), "::", - allArgs["re_use_port"].as(), allArgs["ssrc"].as()); - server->setOnDetach([stream_id]() { - //设置rtp超时移除事件 - lock_guard lck(s_rtpServerMapMtx); - s_rtpServerMap.erase(stream_id); - }); - - //保存对象 - s_rtpServerMap.emplace(stream_id, server); //回复json - val["port"] = server->getPort(); + val["port"] = port; }); api_regist("/index/api/closeRtpServer",[](API_ARGS_MAP){ CHECK_SECRET(); CHECK_ARGS("stream_id"); - lock_guard lck(s_rtpServerMapMtx); - auto it = s_rtpServerMap.find(allArgs["stream_id"]); - if(it == s_rtpServerMap.end()){ + if(!closeRtpServer(allArgs["stream_id"])){ val["hit"] = 0; return; } - auto server = it->second; - s_rtpServerMap.erase(it); val["hit"] = 1; }); diff --git a/server/WebApi.h b/server/WebApi.h index eabd8f2a..019e3586 100755 --- a/server/WebApi.h +++ b/server/WebApi.h @@ -230,6 +230,9 @@ bool checkArgs(Args &args, const First &first, const KeyTypes &...keys) { void installWebApi(); void unInstallWebApi(); + +uint16_t openRtpServer(uint16_t local_port, const std::string &stream_id, bool enable_tcp, const std::string &local_ip, bool re_use_port, uint32_t ssrc); +bool closeRtpServer(const std::string &stream_id); Json::Value makeMediaSourceJson(mediakit::MediaSource &media); void getStatisticJson(const std::function &cb); void addStreamProxy(const std::string &vhost, const std::string &app, const std::string &stream, const std::string &url, int retry_count,