From 25286c43775d2f47a9adf040174a4c046baa5f06 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 15 Jun 2019 17:07:10 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E6=A4=8DWindows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 6 +----- server/CMakeLists.txt | 15 ++++++++++++++- server/WebApi.cpp | 29 ++++++++++++++++++++++------- server/WebHook.cpp | 1 - server/main.cpp | 19 +++++++++++++++++-- 5 files changed, 54 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f956b4a5..eec4257c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,11 +125,7 @@ endif () add_subdirectory(tests) #主服务器 -if (CMAKE_SYSTEM_NAME MATCHES "Linux") - add_subdirectory(server) -elseif (CMAKE_SYSTEM_NAME MATCHES "Darwin") - add_subdirectory(server) -endif () +add_subdirectory(server) diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index 136422c8..c591a376 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -2,8 +2,21 @@ file(GLOB jsoncpp_src_list ../3rdpart/jsoncpp/*.cpp ../3rdpart/jsoncpp/*.h ) add_library(jsoncpp STATIC ${jsoncpp_src_list}) -file(GLOB MediaServer_src_list ./*.cpp ./*.h) + +if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(MediaServer_src_list ./WebApi.cpp ./WebHook.cpp main.cpp) +else() + file(GLOB MediaServer_src_list ./*.cpp ./*.h) +endif() + +message(STATUS ${MediaServer_src_list}) + add_executable(MediaServer ${MediaServer_src_list}) + +if(WIN32) + set_target_properties(MediaServer PROPERTIES COMPILE_FLAGS ${VS_FALGS} ) +endif() + target_link_libraries(MediaServer jsoncpp ${LINK_LIB_LIST}) diff --git a/server/WebApi.cpp b/server/WebApi.cpp index 8521a475..52d34877 100644 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -1,4 +1,4 @@ -/* +/* * MIT License * * Copyright (c) 2016-2019 xiongziliang <771730766@qq.com> @@ -42,10 +42,13 @@ #include "Http/HttpSession.h" #include "Network/TcpServer.h" #include "Player/PlayerProxy.h" -#include "FFmpegSource.h" #include "Util/MD5.h" #include "WebApi.h" +#if !defined(_WIN32) +#include "FFmpegSource.h" +#endif//!defined(_WIN32) + using namespace Json; using namespace toolkit; using namespace mediakit; @@ -245,8 +248,10 @@ static inline string getProxyKey(const string &vhost,const string &app,const str return vhost + "/" + app + "/" + stream; } +#if !defined(_WIN32) static unordered_map s_ffmpegMap; static recursive_mutex s_ffmpegMapMtx; +#endif//#if !defined(_WIN32) /** * 安装api接口 @@ -322,6 +327,7 @@ void installWebApi() { } }); +#if !defined(_WIN32) //重启服务器,只有Daemon方式才能重启,否则是直接关闭! //测试url http://127.0.0.1/index/api/restartServer API_REGIST(api,restartServer,{ @@ -340,6 +346,7 @@ void installWebApi() { }); val["msg"] = "服务器将在一秒后自动重启"; }); +#endif//#if !defined(_WIN32) //获取流列表,可选筛选参数 @@ -507,6 +514,7 @@ void installWebApi() { val["data"]["flag"] = s_proxyMap.erase(allArgs["key"]) == 1; }); +#if !defined(_WIN32) static auto addFFmepgSource = [](const string &src_url, const string &dst_url, int timeout_ms, @@ -563,6 +571,7 @@ void installWebApi() { lock_guard lck(s_ffmpegMapMtx); val["data"]["flag"] = s_ffmpegMap.erase(allArgs["key"]) == 1; }); +#endif ////////////以下是注册的Hook API//////////// API_REGIST(hook,on_publish,{ @@ -600,12 +609,12 @@ void installWebApi() { throw SuccessException(); }); + +#if !defined(_WIN32) API_REGIST_INVOKER(hook,on_stream_not_found,{ //媒体未找到事件,我们都及时拉流hks作为替代品,目的是为了测试按需拉流 CHECK_SECRET(); CHECK_ARGS("vhost","app","stream"); - -#if 1 //通过FFmpeg按需拉流 GET_CONFIG(int,rtmp_port,Rtmp::kPort); string dst_url = StrPrinter @@ -627,9 +636,14 @@ void installWebApi() { } invoker("200 OK", headerOut, val.toStyledString()); }); - + }); #else + + API_REGIST_INVOKER(hook,on_stream_not_found,{ + //媒体未找到事件,我们都及时拉流hks作为替代品,目的是为了测试按需拉流 + CHECK_SECRET(); + CHECK_ARGS("vhost","app","stream"); //通过内置支持的rtsp/rtmp按需拉流 addStreamProxy(allArgs["vhost"], allArgs["app"], @@ -648,9 +662,8 @@ void installWebApi() { } invoker("200 OK", headerOut, val.toStyledString()); }); -#endif }); - +#endif // !defined(_WIN32) API_REGIST(hook,on_record_mp4,{ //录制mp4分片完毕事件 @@ -701,8 +714,10 @@ void unInstallWebApi(){ s_proxyMap.clear(); } +#if !defined(_WIN32) { lock_guard lck(s_ffmpegMapMtx); s_ffmpegMap.clear(); } +#endif } \ No newline at end of file diff --git a/server/WebHook.cpp b/server/WebHook.cpp index 02136f10..038bc321 100644 --- a/server/WebHook.cpp +++ b/server/WebHook.cpp @@ -27,7 +27,6 @@ #include #include #include -#include "System.h" #include "jsoncpp/json.h" #include "Util/logger.h" #include "Util/util.h" diff --git a/server/main.cpp b/server/main.cpp index 11b7905a..31ed2837 100644 --- a/server/main.cpp +++ b/server/main.cpp @@ -43,9 +43,12 @@ #include "RtmpMuxer/FlvMuxer.h" #include "Player/PlayerProxy.h" #include "Http/WebSocketSession.h" -#include "System.h" #include "WebApi.h" +#if !defined(_WIN32) +#include "System.h" +#endif//!defined(_WIN32) + using namespace std; using namespace toolkit; using namespace mediakit; @@ -105,6 +108,7 @@ public: CMD_main() { _parser.reset(new OptionParser(nullptr)); +#if !defined(_WIN32) (*_parser) << Option('d',/*该选项简称,如果是\x00则说明无简称*/ "daemon",/*该选项全称,每个选项必须有全称;不得为null或空字符串*/ Option::ArgNone,/*该选项后面必须跟值*/ @@ -112,6 +116,7 @@ public: false,/*该选项是否必须赋值,如果没有默认值且为ArgRequired时用户必须提供该参数否则将抛异常*/ "是否以Daemon方式启动",/*该选项说明文字*/ nullptr); +#endif//!defined(_WIN32) (*_parser) << Option('l',/*该选项简称,如果是\x00则说明无简称*/ "level",/*该选项全称,每个选项必须有全称;不得为null或空字符串*/ @@ -158,12 +163,14 @@ extern void unInstallWebApi(); extern void installWebHook(); extern void unInstallWebHook(); +#if !defined(_WIN32) static void inline listen_shell_input(){ cout << "> 欢迎进入命令模式,你可以输入\"help\"命令获取帮助" << endl; cout << "> " << std::flush; signal(SIGTTOU,SIG_IGN); signal(SIGTTIN,SIG_IGN); + SockUtil::setNoBlocked(STDIN_FILENO); auto oninput = [](int event) { if (event & Event_Read) { @@ -193,6 +200,8 @@ static void inline listen_shell_input(){ }; EventPollerPool::Instance().getFirstPoller()->addEvent(STDIN_FILENO, Event_Read | Event_Error | Event_LT,oninput); } +#endif//!defined(_WIN32) + int main(int argc,char *argv[]) { { CMD_main cmd_main; @@ -218,13 +227,14 @@ int main(int argc,char *argv[]) { Logger::Instance().add(std::make_shared("FileChannel", exePath() + ".log", logLevel)); #endif +#if !defined(_WIN32) if (bDaemon) { //启动守护进程 System::startDaemon(); } - //开启崩溃捕获等 System::systemSetup(); +#endif//!defined(_WIN32) //启动异步日志线程 Logger::Instance().setWriter(std::make_shared()); @@ -275,10 +285,12 @@ int main(int argc,char *argv[]) { installWebHook(); InfoL << "已启动http hook 接口"; +#if !defined(_WIN32) if (!bDaemon) { //交互式shell输入 listen_shell_input(); } +#endif //设置退出信号处理函数 static semaphore sem; @@ -287,7 +299,10 @@ int main(int argc,char *argv[]) { signal(SIGINT, SIG_IGN);// 设置退出信号 sem.post(); });// 设置退出信号 + +#if !defined(_WIN32) signal(SIGHUP, [](int) { mediakit::loadIniConfig(ini_file.data()); }); +#endif sem.wait(); } unInstallWebApi();