diff --git a/api/include/mk_common.h b/api/include/mk_common.h index 7105f0d3..74a2d82a 100755 --- a/api/include/mk_common.h +++ b/api/include/mk_common.h @@ -162,11 +162,18 @@ API_EXPORT uint16_t API_CALL mk_rtp_server_start(uint16_t port); /** * 创建rtc服务器 - * @param port rtp监听端口 + * @param port rtc监听端口 * @return 0:失败,非0:端口号 */ API_EXPORT uint16_t API_CALL mk_rtc_server_start(uint16_t port); +/** + * 创建srt服务器 + * @param port srt监听端口 + * @return 0:失败,非0:端口号 + */ +API_EXPORT uint16_t API_CALL mk_srt_server_start(uint16_t port); + /** * 创建shell服务器 diff --git a/api/source/mk_common.cpp b/api/source/mk_common.cpp index 09a0d4fa..9e98db1d 100644 --- a/api/source/mk_common.cpp +++ b/api/source/mk_common.cpp @@ -40,6 +40,11 @@ static std::shared_ptr rtpServer; static std::shared_ptr rtcServer; #endif +#if defined(ENABLE_SRT) +#include "../srt/SrtSession.hpp" +static std::shared_ptr srtServer; +#endif + //////////////////////////environment init/////////////////////////// API_EXPORT void API_CALL mk_env_init(const mk_config *cfg) { @@ -62,8 +67,15 @@ API_EXPORT void API_CALL mk_stop_all_server(){ CLEAR_ARR(rtsp_server); CLEAR_ARR(rtmp_server); CLEAR_ARR(http_server); + shell_server = nullptr; #ifdef ENABLE_RTPPROXY rtpServer = nullptr; +#endif +#ifdef ENABLE_WEBRTC + rtcServer = nullptr; +#endif +#ifdef ENABLE_SRT + srtServer = nullptr; #endif stopAllTcpServer(); } @@ -254,6 +266,36 @@ API_EXPORT uint16_t API_CALL mk_rtc_server_start(uint16_t port) { #endif } +API_EXPORT uint16_t API_CALL mk_srt_server_start(uint16_t port) { +#ifdef ENABLE_SRT + try { + srtServer = std::make_shared(); + srtServer->setOnCreateSocket([](const EventPoller::Ptr &poller, const Buffer::Ptr &buf, struct sockaddr *, int) { + if (!buf) { + return Socket::createSocket(poller, false); + } + auto new_poller = SRT::SrtSession::queryPoller(buf); + if (!new_poller) { + //握手第一阶段 + return Socket::createSocket(poller, false); + } + return Socket::createSocket(new_poller, false); + }); + srtServer->start(port); + return srtServer->getPort(); + + } catch (std::exception &ex) { + srtServer.reset(); + WarnL << ex.what(); + return 0; + } +#else + WarnL << "未启用该功能!"; + return 0; +#endif +} + + API_EXPORT uint16_t API_CALL mk_shell_server_start(uint16_t port){ try { shell_server = std::make_shared(); diff --git a/api/tests/server.c b/api/tests/server.c index 9b1d713c..eb3efc83 100644 --- a/api/tests/server.c +++ b/api/tests/server.c @@ -416,6 +416,7 @@ int main(int argc, char *argv[]) { mk_shell_server_start(9000); mk_rtp_server_start(10000); mk_rtc_server_start(8000); + mk_srt_server_start(9000); mk_events events = { .on_mk_media_changed = on_mk_media_changed, diff --git a/server/main.cpp b/server/main.cpp index e1b0e8f6..a83e4f13 100644 --- a/server/main.cpp +++ b/server/main.cpp @@ -336,12 +336,9 @@ int start_main(int argc,char *argv[]) { if (rtcPort) { rtcSrv->start(rtcPort); } #endif//defined(ENABLE_WEBRTC) - #if defined(ENABLE_SRT) // srt udp服务器 - if(srtPort){ - srtSrv->start(srtPort); - } + if(srtPort) { srtSrv->start(srtPort); } #endif//defined(ENABLE_SRT) } catch (std::exception &ex) { diff --git a/srt/SrtTransport.cpp b/srt/SrtTransport.cpp index 89a83cb2..c88b2ca4 100644 --- a/srt/SrtTransport.cpp +++ b/srt/SrtTransport.cpp @@ -1,4 +1,6 @@ #include "Util/onceToken.h" +#include "Util/mini.h" + #include #include @@ -15,6 +17,13 @@ const std::string kPort = SRT_FIELD "port"; const std::string kLatencyMul = SRT_FIELD "latencyMul"; const std::string kPktBufSize = SRT_FIELD "pktBufSize"; +static onceToken token([]() { + mINI::Instance()[kTimeOutSec] = 5; + mINI::Instance()[kPort] = 9000; + mINI::Instance()[kLatencyMul] = 4; + mINI::Instance()[kPktBufSize] = 8192; +}); + static std::atomic s_srt_socket_id_generate { 125 }; //////////// SrtTransport ////////////////////////// SrtTransport::SrtTransport(const EventPoller::Ptr &poller)