移植Windows

This commit is contained in:
xiongziliang 2019-06-15 17:07:10 +08:00
parent bede5500c8
commit 25286c4377
5 changed files with 54 additions and 16 deletions

View File

@ -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 ()

View File

@ -2,8 +2,21 @@
file(GLOB jsoncpp_src_list ../3rdpart/jsoncpp/*.cpp ../3rdpart/jsoncpp/*.h )
add_library(jsoncpp STATIC ${jsoncpp_src_list})
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})

View File

@ -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<string ,FFmpegSource::Ptr> 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<decltype(s_ffmpegMapMtx)> 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<recursive_mutex> lck(s_ffmpegMapMtx);
s_ffmpegMap.clear();
}
#endif
}

View File

@ -27,7 +27,6 @@
#include <sstream>
#include <unordered_map>
#include <mutex>
#include "System.h"
#include "jsoncpp/json.h"
#include "Util/logger.h"
#include "Util/util.h"

View File

@ -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>("FileChannel", exePath() + ".log", logLevel));
#endif
#if !defined(_WIN32)
if (bDaemon) {
//启动守护进程
System::startDaemon();
}
//开启崩溃捕获等
System::systemSetup();
#endif//!defined(_WIN32)
//启动异步日志线程
Logger::Instance().setWriter(std::make_shared<AsyncLogWriter>());
@ -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();