ZLMediaKit/tests/test_player.cpp

361 lines
14 KiB
C++
Raw Normal View History

2024-06-13 10:36:53 +08:00
#include "Codec/Transcode.h"
#include "Common/Device.h"
#include "Common/config.h"
#include "Common/macros.h"
#include "Player/MediaPlayer.h"
#include "Record/Recorder.h"
#include "Rtsp/UDPServer.h"
#include "Util/logger.h"
#include "Util/onceToken.h"
#include "Util/util.h"
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <memory>
#include <signal.h>
#include <unistd.h>
#include "Network/TcpServer.h"
#include "Poller/EventPoller.h"
#include "Util/MD5.h"
#include "Util/SSLBox.h"
#include "Util/logger.h"
#include "Util/onceToken.h"
#include "Common/config.h"
#include "Http/WebSocketSession.h"
#include "Player/PlayerProxy.h"
#include "Rtmp/FlvMuxer.h"
#include "Rtmp/RtmpSession.h"
#include "Rtsp/RtspSession.h"
#include "Rtsp/UDPServer.h"
#include "Shell/ShellSession.h"
using namespace std;
using namespace toolkit;
using namespace mediakit;
static std::shared_ptr<DevChannel> g_dev;
void test_player(const std::string &url) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
Logger::Instance().add(std::make_shared<ConsoleChannel>());
g_dev = std::make_shared<mediakit::DevChannel>(mediakit::MediaTuple { DEFAULT_VHOST, "live", "test" });
auto player = std::make_shared<MediaPlayer>();
// sdlҪ<6C><D2AA><EFBFBD><EFBFBD>main<69>̳߳<DFB3>ʼ<EFBFBD><CABC>
weak_ptr<MediaPlayer> weakPlayer = player;
player->setOnPlayResult([weakPlayer](const SockException &ex) {
InfoL << "OnPlayResult:" << ex.what();
auto strongPlayer = weakPlayer.lock();
if (ex || !strongPlayer) {
return;
}
auto videoTrack = dynamic_pointer_cast<VideoTrack>(strongPlayer->getTrack(TrackVideo, false));
auto audioTrack = dynamic_pointer_cast<AudioTrack>(strongPlayer->getTrack(TrackAudio, false));
if (videoTrack) {
VideoInfo info;
info.codecId = videoTrack->getCodecId();
info.iWidth = videoTrack->getVideoWidth();
info.iHeight = videoTrack->getVideoHeight();
info.iFrameRate = videoTrack->getVideoFps();
g_dev->initVideo(info);
videoTrack->addDelegate([](const Frame::Ptr &frame) { return g_dev->inputFrame(frame); });
}
if (audioTrack) {
AudioInfo info;
info.codecId = audioTrack->getCodecId();
info.iChannel = audioTrack->getAudioChannel();
info.iSampleBit = audioTrack->getAudioSampleBit();
info.iSampleRate = audioTrack->getAudioSampleRate();
g_dev->initAudio(info);
audioTrack->addDelegate([](const Frame::Ptr &frame) { return g_dev->inputFrame(frame); });
}
});
player->setOnShutdown([](const SockException &ex) { WarnL << "play shutdown: " << ex.what(); });
(*player)[Client::kRtpType] = mediakit::Rtsp::RTP_TCP;
// <20><><EFBFBD>ȴ<EFBFBD>track ready<64>ٻص<D9BB><D8B5><EFBFBD><EFBFBD>ųɹ<C5B3><C9B9>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լӿ<D4BC><D3BF><EFBFBD>ٶ<EFBFBD>
(*player)[Client::kWaitTrackReady] = true;
player->play(url);
getchar();
}
namespace mediakit {
////////////HTTP<54><50><EFBFBD><EFBFBD>///////////
namespace Http {
#define HTTP_FIELD "http."
#define HTTP_PORT 80
const string kPort = HTTP_FIELD "port";
#define HTTPS_PORT 443
const string kSSLPort = HTTP_FIELD "sslport";
onceToken token1(
[]() {
mINI::Instance()[kPort] = HTTP_PORT;
mINI::Instance()[kSSLPort] = HTTPS_PORT;
},
nullptr);
} // namespace Http
////////////SHELL<4C><4C><EFBFBD><EFBFBD>///////////
namespace Shell {
#define SHELL_FIELD "shell."
#define SHELL_PORT 9000
const string kPort = SHELL_FIELD "port";
onceToken token1([]() { mINI::Instance()[kPort] = SHELL_PORT; }, nullptr);
} // namespace Shell
////////////RTSP<53><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>///////////
namespace Rtsp {
#define RTSP_FIELD "rtsp."
#define RTSP_PORT 554
#define RTSPS_PORT 322
const string kPort = RTSP_FIELD "port";
const string kSSLPort = RTSP_FIELD "sslport";
onceToken token1(
[]() {
mINI::Instance()[kPort] = RTSP_PORT;
mINI::Instance()[kSSLPort] = RTSPS_PORT;
},
nullptr);
} // namespace Rtsp
////////////RTMP<4D><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>///////////
namespace Rtmp {
#define RTMP_FIELD "rtmp."
#define RTMP_PORT 3935
const string kPort = RTMP_FIELD "port";
onceToken token1([]() { mINI::Instance()[kPort] = RTMP_PORT; }, nullptr);
} // namespace Rtmp
} // namespace mediakit
#define REALM "realm_zlmediakit"
static map<string, FlvRecorder::Ptr> s_mapFlvRecorder;
static mutex s_mtxFlvRecorder;
void initEventListener() {
static onceToken s_token(
[]() {
// <20><><EFBFBD><EFBFBD>kBroadcastOnGetRtspRealm<6C>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>rtsp<73><70><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA>Ȩ(<28><>ͳ<EFBFBD><CDB3>rtsp<73><70>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD>)<29><><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD>
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastOnGetRtspRealm, [](BroadcastOnGetRtspRealmArgs) {
DebugL << "RTSP<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>Ȩ<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>" << args.getUrl() << " " << args.params;
if (string("1") == args.stream) {
// live/1<><31>Ҫ<EFBFBD><D2AA>֤
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>realm
invoker(REALM);
} else {
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ѯredis<69><73><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD>жϸ<D0B6><CFB8><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA>֤<EFBFBD><D6A4>ͨ<EFBFBD><CDA8>invoker<65>ķ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD>Ҫ<EFBFBD><D2AA>֤
invoker("");
}
});
// <20><><EFBFBD><EFBFBD>kBroadcastOnRtspAuth<74>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>rtsp<73><70>Ȩ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastOnRtspAuth, [](BroadcastOnRtspAuthArgs) {
DebugL << "RTSP<EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD>Ȩ:" << args.getUrl() << " " << args.params;
DebugL << "RTSP<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>" << user_name << (must_no_encrypt ? " Base64" : " MD5") << " <20><>ʽ<EFBFBD><CABD>¼";
string user = user_name;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB2BD>ȡ<EFBFBD><C8A1><EFBFBD>ݿ<EFBFBD>
if (user == "test0") {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿⱣ<DDBF><E2B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
invoker(false, "pwd0");
return;
}
if (user == "test1") {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿⱣ<DDBF><E2B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
auto encrypted_pwd = MD5(user + ":" + REALM + ":" + "pwd1").hexdigest();
invoker(true, encrypted_pwd);
return;
}
if (user == "test2" && must_no_encrypt) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>test2,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>base64<36><34>ʽ<EFBFBD><CABD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA3AC>ô<EFBFBD><EFBFBD><E1B5BC><EFBFBD><EFBFBD>֤ʧ<D6A4><CAA7>
// <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>base64<36><34><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>ȫ<EFBFBD>ļ<EFBFBD><C4BC>ܷ<EFBFBD>ʽ
invoker(true, "pwd2");
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>һ<EFBFBD><D2BB>
invoker(false, user);
});
// <20><><EFBFBD><EFBFBD>rtsp/rtmp<6D><70><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8>
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastMediaPublish, [](BroadcastMediaPublishArgs) {
DebugL << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD>" << args.getUrl() << " " << args.params;
invoker("", ProtocolOption()); // <20><>Ȩ<EFBFBD>ɹ<EFBFBD>
// invoker("this is auth failed message");//<2F><>Ȩʧ<C8A8><CAA7>
});
// <20><><EFBFBD><EFBFBD>rtsp/rtsps/rtmp/http-flv<6C><76><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD>Ƿ<EFBFBD><C7B7>в<EFBFBD><D0B2><EFBFBD>Ȩ<EFBFBD><C8A8>(rtspͨ<70><CDA8>kBroadcastOnRtspAuth<74><68><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ּ<EFBFBD>Ȩ)
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastMediaPlayed, [](BroadcastMediaPlayedArgs) {
DebugL << "<EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD>Ȩ:" << args.getUrl() << " " << args.params;
invoker(""); // <20><>Ȩ<EFBFBD>ɹ<EFBFBD>
// invoker("this is auth failed message");//<2F><>Ȩʧ<C8A8><CAA7>
});
// shell<6C><6C>¼<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ͨ<EFBFBD><CDA8>shell<6C><6C><EFBFBD>Ե<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>һЩ<D2BB><D0A9><EFBFBD><EFBFBD>
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastShellLogin, [](BroadcastShellLoginArgs) {
DebugL << "shell login:" << user_name << " " << passwd;
invoker(""); // <20><>Ȩ<EFBFBD>ɹ<EFBFBD>
// invoker("this is auth failed message");//<2F><>Ȩʧ<C8A8><CAA7>
});
// <20><><EFBFBD><EFBFBD>rtsp<73><70>rtmpԴע<D4B4><D7A2><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>rtmp<6D><70><EFBFBD><EFBFBD>Ϊflv¼<76>񣬱<EFBFBD><F1A3ACB1><EFBFBD><EFBFBD><EFBFBD>http<74><70>Ŀ¼<C4BF><C2BC>
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastMediaChanged, [](BroadcastMediaChangedArgs) {
auto tuple = sender.getMediaTuple();
if (sender.getSchema() == RTMP_SCHEMA && tuple.app == "live") {
lock_guard<mutex> lck(s_mtxFlvRecorder);
auto key = tuple.shortUrl();
if (bRegist) {
DebugL << "<EFBFBD><EFBFBD>ʼ¼<EFBFBD><EFBFBD>RTMP<EFBFBD><EFBFBD>" << sender.getUrl();
GET_CONFIG(string, http_root, Http::kRootPath);
auto path = http_root + "/" + key + "_" + to_string(time(NULL)) + ".flv";
FlvRecorder::Ptr recorder(new FlvRecorder);
try {
recorder->startRecord(
EventPollerPool::Instance().getPoller(), dynamic_pointer_cast<RtmpMediaSource>(sender.shared_from_this()), path);
s_mapFlvRecorder[key] = recorder;
} catch (std::exception &ex) {
WarnL << ex.what();
}
} else {
s_mapFlvRecorder.erase(key);
}
}
});
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7><>ҵ<EFBFBD><D2B5>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD>)<29>¼<EFBFBD>
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastNotFoundStream, [](BroadcastNotFoundStreamArgs) {
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ְ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ZLMediaKit<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>ʱ<EFBFBD><EFBFBD>ԼΪ5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>)
*/
DebugL << "δ<EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>:" << args.getUrl() << " " << args.params;
});
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastFlowReport, [](BroadcastFlowReportArgs) {
DebugL << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>:" << args.getUrl() << " " << args.params << "\r\nʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:" << totalBytes
<< " bytes,<2C><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>:" << totalDuration << "<EFBFBD><EFBFBD>";
});
},
nullptr);
}
#if !defined(SIGHUP)
#define SIGHUP 1
#endif
int main(int argc, char *argv[]) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
Logger::Instance().add(std::make_shared<ConsoleChannel>());
Logger::Instance().add(std::make_shared<FileChannel>());
Logger::Instance().setWriter(std::make_shared<AsyncLogWriter>());
if (argc < 2) {
ErrorL << "\r\n<EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>./test_player rtxp_url\r\n";
return 0;
}
std::string url = argv[1];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ھʹ<DABE><CDB4><EFBFBD>һ<EFBFBD><D2BB>
loadIniConfig();
initEventListener();
// <20><><EFBFBD><EFBFBD>֤<EFBFBD>飬֤<E9A3AC><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>˽Կ
SSL_Initor::Instance().loadCertificate((exeDir() + "ssl.p12").data());
// <20><><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD>ǩ<EFBFBD><C7A9>֤<EFBFBD><D6A4>
SSL_Initor::Instance().trustCertificate((exeDir() + "ssl.p12").data());
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч֤<D0A7><D6A4>֤<EFBFBD><D6A4>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǩ<EFBFBD><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4>)
SSL_Initor::Instance().ignoreInvalidCertificate(false);
uint16_t shellPort = mINI::Instance()[Shell::kPort];
uint16_t rtspPort = mINI::Instance()[Rtsp::kPort];
uint16_t rtspsPort = mINI::Instance()[Rtsp::kSSLPort];
uint16_t rtmpPort = 2935;
uint16_t httpPort = 8088;
uint16_t httpsPort = mINI::Instance()[Http::kSSLPort];
// <20>򵥵<EFBFBD>telnet<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD>ʹ<EFBFBD><CAB9>23<32>˿ڣ<CBBF><DAA3><EFBFBD><EFBFBD><EFBFBD>telnet<65><74><EFBFBD><EFBFBD>Ī<EFBFBD><C4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>:telnet 127.0.0.1 9000
TcpServer::Ptr shellSrv(new TcpServer());
TcpServer::Ptr rtspSrv(new TcpServer());
TcpServer::Ptr rtmpSrv(new TcpServer());
TcpServer::Ptr httpSrv(new TcpServer());
shellSrv->start<ShellSession>(shellPort);
rtspSrv->start<RtspSession>(rtspPort); // Ĭ<><C4AC>554
rtmpSrv->start<RtmpSession>(rtmpPort); // Ĭ<><C4AC>1935
// http<74><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
httpSrv->start<HttpSession>(httpPort); // Ĭ<><C4AC>80
// <20><><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>ssl<73><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF><EFBFBD>https<70><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TcpServer::Ptr httpsSrv(new TcpServer());
// https<70><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
httpsSrv->start<HttpsSession>(httpsPort); // Ĭ<><C4AC>443
// ֧<><D6A7>ssl<73><6C><EFBFBD>ܵ<EFBFBD>rtsp<73><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѷecho show<6F><77><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
TcpServer::Ptr rtspSSLSrv(new TcpServer());
rtspSSLSrv->start<RtspSessionWithSSL>(rtspsPort); // Ĭ<><C4AC>322
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ֶ<EFBFBD>̬<EFBFBD>л<EFBFBD><D0BB>˿<EFBFBD>(<28><>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
NoticeCenter::Instance().addListener(ReloadConfigTag, Broadcast::kBroadcastReloadConfig, [&](BroadcastReloadConfigArgs) {
// <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (shellPort != mINI::Instance()[Shell::kPort].as<uint16_t>()) {
shellPort = mINI::Instance()[Shell::kPort];
shellSrv->start<ShellSession>(shellPort);
InfoL << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>shell<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:" << shellPort;
}
if (rtspPort != mINI::Instance()[Rtsp::kPort].as<uint16_t>()) {
rtspPort = mINI::Instance()[Rtsp::kPort];
rtspSrv->start<RtspSession>(rtspPort);
InfoL << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>rtsp<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << rtspPort;
}
if (rtmpPort != mINI::Instance()[Rtmp::kPort].as<uint16_t>()) {
rtmpPort = mINI::Instance()[Rtmp::kPort];
rtmpSrv->start<RtmpSession>(rtmpPort);
InfoL << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>rtmp<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << rtmpPort;
}
if (httpPort != mINI::Instance()[Http::kPort].as<uint16_t>()) {
httpPort = mINI::Instance()[Http::kPort];
httpSrv->start<HttpSession>(httpPort);
InfoL << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>http<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << httpPort;
}
if (httpsPort != mINI::Instance()[Http::kSSLPort].as<uint16_t>()) {
httpsPort = mINI::Instance()[Http::kSSLPort];
httpsSrv->start<HttpsSession>(httpsPort);
InfoL << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>https<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << httpsPort;
}
if (rtspsPort != mINI::Instance()[Rtsp::kSSLPort].as<uint16_t>()) {
rtspsPort = mINI::Instance()[Rtsp::kSSLPort];
rtspSSLSrv->start<RtspSessionWithSSL>(rtspsPort);
InfoL << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>rtsps<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << rtspsPort;
}
});
test_player(url);
// <20><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>źŴ<C5BA><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static semaphore sem;
signal(SIGINT, [](int) { sem.post(); }); // <20><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>ź<EFBFBD>
signal(SIGHUP, [](int) { loadIniConfig(); });
sem.wait();
lock_guard<mutex> lck(s_mtxFlvRecorder);
s_mapFlvRecorder.clear();
return 0;
}