361 lines
14 KiB
C++
361 lines
14 KiB
C++
|
|
|
|||
|
|
#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;
|
|||
|
|
}
|