commit
b54c46705c
|
|
@ -191,7 +191,7 @@ if(UNIX)
|
||||||
set(COMPILE_OPTIONS_DEFAULT
|
set(COMPILE_OPTIONS_DEFAULT
|
||||||
"-fPIC"
|
"-fPIC"
|
||||||
"-Wall;-Wextra"
|
"-Wall;-Wextra"
|
||||||
"-Wno-unused-function;-Wno-unused-parameter;-Wno-unused-variable"
|
"-Wno-unused-function;-Wno-unused-parameter;-Wno-unused-variable;-Wno-deprecated-declarations"
|
||||||
"-Wno-error=extra;-Wno-error=missing-field-initializers;-Wno-error=type-limits")
|
"-Wno-error=extra;-Wno-error=missing-field-initializers;-Wno-error=type-limits")
|
||||||
|
|
||||||
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
|
||||||
|
|
|
||||||
|
|
@ -142,7 +142,7 @@ API_EXPORT void API_CALL mk_media_source_find(const char *schema,
|
||||||
void *user_data,
|
void *user_data,
|
||||||
on_mk_media_source_find_cb cb);
|
on_mk_media_source_find_cb cb);
|
||||||
|
|
||||||
API_EXPORT const mk_media_source API_CALL mk_media_source_find2(const char *schema,
|
API_EXPORT mk_media_source API_CALL mk_media_source_find2(const char *schema,
|
||||||
const char *vhost,
|
const char *vhost,
|
||||||
const char *app,
|
const char *app,
|
||||||
const char *stream,
|
const char *stream,
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,7 @@ API_EXPORT const char* API_CALL mk_parser_get_content(const mk_parser ctx, size_
|
||||||
API_EXPORT const char* API_CALL mk_media_info_get_params(const mk_media_info ctx){
|
API_EXPORT const char* API_CALL mk_media_info_get_params(const mk_media_info ctx){
|
||||||
assert(ctx);
|
assert(ctx);
|
||||||
MediaInfo *info = (MediaInfo *)ctx;
|
MediaInfo *info = (MediaInfo *)ctx;
|
||||||
return info->param_strs.c_str();
|
return info->params.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
API_EXPORT const char* API_CALL mk_media_info_get_schema(const mk_media_info ctx){
|
API_EXPORT const char* API_CALL mk_media_info_get_schema(const mk_media_info ctx){
|
||||||
|
|
@ -278,7 +278,7 @@ API_EXPORT void API_CALL mk_media_source_find(const char *schema,
|
||||||
cb(user_data, (mk_media_source)src.get());
|
cb(user_data, (mk_media_source)src.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
API_EXPORT const mk_media_source API_CALL mk_media_source_find2(const char *schema,
|
API_EXPORT mk_media_source API_CALL mk_media_source_find2(const char *schema,
|
||||||
const char *vhost,
|
const char *vhost,
|
||||||
const char *app,
|
const char *app,
|
||||||
const char *stream,
|
const char *stream,
|
||||||
|
|
|
||||||
|
|
@ -389,6 +389,7 @@ void dumpMediaTuple(const MediaTuple &tuple, Json::Value& item) {
|
||||||
item[VHOST_KEY] = tuple.vhost;
|
item[VHOST_KEY] = tuple.vhost;
|
||||||
item["app"] = tuple.app;
|
item["app"] = tuple.app;
|
||||||
item["stream"] = tuple.stream;
|
item["stream"] = tuple.stream;
|
||||||
|
item["params"] = tuple.params;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value makeMediaSourceJson(MediaSource &media){
|
Value makeMediaSourceJson(MediaSource &media){
|
||||||
|
|
@ -1563,7 +1564,7 @@ void installWebApi() {
|
||||||
api_regist("/index/api/deleteRecordDirectory", [](API_ARGS_MAP) {
|
api_regist("/index/api/deleteRecordDirectory", [](API_ARGS_MAP) {
|
||||||
CHECK_SECRET();
|
CHECK_SECRET();
|
||||||
CHECK_ARGS("vhost", "app", "stream", "period");
|
CHECK_ARGS("vhost", "app", "stream", "period");
|
||||||
auto tuple = MediaTuple{allArgs["vhost"], allArgs["app"], allArgs["stream"]};
|
auto tuple = MediaTuple{allArgs["vhost"], allArgs["app"], allArgs["stream"], ""};
|
||||||
auto record_path = Recorder::getRecordPath(Recorder::type_mp4, tuple, allArgs["customized_path"]);
|
auto record_path = Recorder::getRecordPath(Recorder::type_mp4, tuple, allArgs["customized_path"]);
|
||||||
auto period = allArgs["period"];
|
auto period = allArgs["period"];
|
||||||
record_path = record_path + period + "/";
|
record_path = record_path + period + "/";
|
||||||
|
|
@ -1602,7 +1603,7 @@ void installWebApi() {
|
||||||
api_regist("/index/api/getMP4RecordFile", [](API_ARGS_MAP){
|
api_regist("/index/api/getMP4RecordFile", [](API_ARGS_MAP){
|
||||||
CHECK_SECRET();
|
CHECK_SECRET();
|
||||||
CHECK_ARGS("vhost", "app", "stream");
|
CHECK_ARGS("vhost", "app", "stream");
|
||||||
auto tuple = MediaTuple{allArgs["vhost"], allArgs["app"], allArgs["stream"]};
|
auto tuple = MediaTuple{allArgs["vhost"], allArgs["app"], allArgs["stream"], ""};
|
||||||
auto record_path = Recorder::getRecordPath(Recorder::type_mp4, tuple, allArgs["customized_path"]);
|
auto record_path = Recorder::getRecordPath(Recorder::type_mp4, tuple, allArgs["customized_path"]);
|
||||||
auto period = allArgs["period"];
|
auto period = allArgs["period"];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -225,7 +225,7 @@ static ArgsType make_json(const MediaInfo &args) {
|
||||||
ArgsType body;
|
ArgsType body;
|
||||||
body["schema"] = args.schema;
|
body["schema"] = args.schema;
|
||||||
dumpMediaTuple(args, body);
|
dumpMediaTuple(args, body);
|
||||||
body["params"] = args.param_strs;
|
body["params"] = args.params;
|
||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -286,7 +286,7 @@ static string getPullUrl(const string &origin_fmt, const MediaInfo &info) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
// 告知源站这是来自边沿站的拉流请求,如果未找到流请立即返回拉流失败
|
// 告知源站这是来自边沿站的拉流请求,如果未找到流请立即返回拉流失败
|
||||||
return string(url) + '?' + kEdgeServerParam + '&' + VHOST_KEY + '=' + info.vhost + '&' + info.param_strs;
|
return string(url) + '?' + kEdgeServerParam + '&' + VHOST_KEY + '=' + info.vhost + '&' + info.params;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pullStreamFromOrigin(const vector<string> &urls, size_t index, size_t failed_cnt, const MediaInfo &args, const function<void()> &closePlayer) {
|
static void pullStreamFromOrigin(const vector<string> &urls, size_t index, size_t failed_cnt, const MediaInfo &args, const function<void()> &closePlayer) {
|
||||||
|
|
@ -498,7 +498,7 @@ void installWebHook() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (start_with(args.param_strs, kEdgeServerParam)) {
|
if (start_with(args.params, kEdgeServerParam)) {
|
||||||
// 源站收到来自边沿站的溯源请求,流不存在时立即返回拉流失败
|
// 源站收到来自边沿站的溯源请求,流不存在时立即返回拉流失败
|
||||||
closePlayer();
|
closePlayer();
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -258,6 +258,15 @@ int start_main(int argc,char *argv[]) {
|
||||||
//加载配置文件,如果配置文件不存在就创建一个
|
//加载配置文件,如果配置文件不存在就创建一个
|
||||||
loadIniConfig(g_ini_file.data());
|
loadIniConfig(g_ini_file.data());
|
||||||
|
|
||||||
|
auto &secret = mINI::Instance()[API::kSecret];
|
||||||
|
if (secret == "035c73f7-bb6b-4889-a715-d9eb2d1925cc" || secret.empty()) {
|
||||||
|
// 使用默认secret被禁止启动
|
||||||
|
secret = makeRandStr(32, true);
|
||||||
|
mINI::Instance().dumpFile(g_ini_file);
|
||||||
|
WarnL << "The " << API::kSecret << " is invalid, modified it to: " << secret
|
||||||
|
<< ", saved config file: " << g_ini_file;
|
||||||
|
}
|
||||||
|
|
||||||
if (!File::is_dir(ssl_file)) {
|
if (!File::is_dir(ssl_file)) {
|
||||||
// 不是文件夹,加载证书,证书包含公钥和私钥
|
// 不是文件夹,加载证书,证书包含公钥和私钥
|
||||||
SSL_Initor::Instance().loadCertificate(ssl_file.data());
|
SSL_Initor::Instance().loadCertificate(ssl_file.data());
|
||||||
|
|
@ -352,14 +361,6 @@ int start_main(int argc,char *argv[]) {
|
||||||
InfoL << "已启动http hook 接口";
|
InfoL << "已启动http hook 接口";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto &secret = mINI::Instance()[API::kSecret];
|
|
||||||
if (secret == "035c73f7-bb6b-4889-a715-d9eb2d1925cc" || secret.empty()) {
|
|
||||||
// 使用默认secret被禁止启动
|
|
||||||
secret = makeRandStr(32, true);
|
|
||||||
mINI::Instance().dumpFile(g_ini_file);
|
|
||||||
WarnL << "The " << API::kSecret << " is invalid, modified it to: " << secret
|
|
||||||
<< ", saved config file: " << g_ini_file;
|
|
||||||
}
|
|
||||||
//rtsp服务器,端口默认554
|
//rtsp服务器,端口默认554
|
||||||
if (rtspPort) { rtspSrv->start<RtspSession>(rtspPort); }
|
if (rtspPort) { rtspSrv->start<RtspSession>(rtspPort); }
|
||||||
//rtsps服务器,端口默认322
|
//rtsps服务器,端口默认322
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,7 @@ ProtocolOption::ProtocolOption() {
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
struct MediaSourceNull : public MediaSource {
|
struct MediaSourceNull : public MediaSource {
|
||||||
MediaSourceNull() : MediaSource("schema", MediaTuple{"vhost", "app", "stream"}) {};
|
MediaSourceNull() : MediaSource("schema", MediaTuple{"vhost", "app", "stream", ""}) {};
|
||||||
int readerCount() override { return 0; }
|
int readerCount() override { return 0; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -583,7 +583,7 @@ void MediaInfo::parse(const std::string &url_in){
|
||||||
auto url = url_in;
|
auto url = url_in;
|
||||||
auto pos = url.find("?");
|
auto pos = url.find("?");
|
||||||
if (pos != string::npos) {
|
if (pos != string::npos) {
|
||||||
param_strs = url.substr(pos + 1);
|
params = url.substr(pos + 1);
|
||||||
url.erase(pos);
|
url.erase(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -616,9 +616,10 @@ void MediaInfo::parse(const std::string &url_in){
|
||||||
stream = stream_id;
|
stream = stream_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto params = Parser::parseArgs(param_strs);
|
auto kv = Parser::parseArgs(params);
|
||||||
if (params.find(VHOST_KEY) != params.end()) {
|
auto it = kv.find(VHOST_KEY);
|
||||||
vhost = params[VHOST_KEY];
|
if (it != kv.end()) {
|
||||||
|
vhost = it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_CONFIG(bool, enableVhost, General::kEnableVhost);
|
GET_CONFIG(bool, enableVhost, General::kEnableVhost);
|
||||||
|
|
|
||||||
|
|
@ -299,7 +299,6 @@ public:
|
||||||
std::string full_url;
|
std::string full_url;
|
||||||
std::string schema;
|
std::string schema;
|
||||||
std::string host;
|
std::string host;
|
||||||
std::string param_strs;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
bool equalMediaTuple(const MediaTuple& a, const MediaTuple& b);
|
bool equalMediaTuple(const MediaTuple& a, const MediaTuple& b);
|
||||||
|
|
|
||||||
|
|
@ -195,10 +195,8 @@ std::shared_ptr<FILE> HlsMakerImp::makeFile(const string &file, bool setbuf) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HlsMakerImp::setMediaSource(const string &vhost, const string &app, const string &stream_id) {
|
void HlsMakerImp::setMediaSource(const MediaTuple& tuple) {
|
||||||
_info.app = app;
|
static_cast<MediaTuple &>(_info) = tuple;
|
||||||
_info.stream = stream_id;
|
|
||||||
_info.vhost = vhost;
|
|
||||||
_media_src = std::make_shared<HlsMediaSource>(isFmp4() ? HLS_FMP4_SCHEMA : HLS_SCHEMA, _info);
|
_media_src = std::make_shared<HlsMediaSource>(isFmp4() ? HLS_FMP4_SCHEMA : HLS_SCHEMA, _info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,11 +27,8 @@ public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置媒体信息
|
* 设置媒体信息
|
||||||
* @param vhost 虚拟主机
|
|
||||||
* @param app 应用名
|
|
||||||
* @param stream_id 流id
|
|
||||||
*/
|
*/
|
||||||
void setMediaSource(const std::string &vhost, const std::string &app, const std::string &stream_id);
|
void setMediaSource(const MediaTuple& tuple);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取MediaSource
|
* 获取MediaSource
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void setMediaSource(const MediaTuple& tuple) {
|
void setMediaSource(const MediaTuple& tuple) {
|
||||||
_hls->setMediaSource(tuple.vhost, tuple.app, tuple.stream);
|
_hls->setMediaSource(tuple);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setListener(const std::weak_ptr<MediaSourceEvent> &listener) {
|
void setListener(const std::weak_ptr<MediaSourceEvent> &listener) {
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ MP4Reader::MP4Reader(const std::string &vhost, const std::string &app, const std
|
||||||
|
|
||||||
void MP4Reader::setup(const std::string &vhost, const std::string &app, const std::string &stream_id, const std::string &file_path, const ProtocolOption &option, toolkit::EventPoller::Ptr poller) {
|
void MP4Reader::setup(const std::string &vhost, const std::string &app, const std::string &stream_id, const std::string &file_path, const ProtocolOption &option, toolkit::EventPoller::Ptr poller) {
|
||||||
//读写文件建议放在后台线程
|
//读写文件建议放在后台线程
|
||||||
auto tuple = MediaTuple{vhost, app, stream_id};
|
auto tuple = MediaTuple{vhost, app, stream_id, ""};
|
||||||
_poller = poller ? std::move(poller) : WorkThreadPool::Instance().getPoller();
|
_poller = poller ? std::move(poller) : WorkThreadPool::Instance().getPoller();
|
||||||
_file_path = file_path;
|
_file_path = file_path;
|
||||||
if (_file_path.empty()) {
|
if (_file_path.empty()) {
|
||||||
|
|
|
||||||
|
|
@ -22,12 +22,10 @@ using namespace toolkit;
|
||||||
|
|
||||||
namespace mediakit {
|
namespace mediakit {
|
||||||
|
|
||||||
MP4Recorder::MP4Recorder(const string &path, const string &vhost, const string &app, const string &stream_id, size_t max_second) {
|
MP4Recorder::MP4Recorder(const MediaTuple &tuple, const string &path, size_t max_second) {
|
||||||
_folder_path = path;
|
_folder_path = path;
|
||||||
/////record 业务逻辑//////
|
/////record 业务逻辑//////
|
||||||
_info.app = app;
|
static_cast<MediaTuple &>(_info) = tuple;
|
||||||
_info.stream = stream_id;
|
|
||||||
_info.vhost = vhost;
|
|
||||||
_info.folder = path;
|
_info.folder = path;
|
||||||
GET_CONFIG(uint32_t, s_max_second, Protocol::kMP4MaxSecond);
|
GET_CONFIG(uint32_t, s_max_second, Protocol::kMP4MaxSecond);
|
||||||
_max_second = max_second ? max_second : s_max_second;
|
_max_second = max_second ? max_second : s_max_second;
|
||||||
|
|
@ -120,7 +118,7 @@ bool MP4Recorder::inputFrame(const Frame::Ptr &frame) {
|
||||||
//b帧情况下dts时间戳可能回退
|
//b帧情况下dts时间戳可能回退
|
||||||
_last_dts = MAX(frame->dts(), _last_dts);
|
_last_dts = MAX(frame->dts(), _last_dts);
|
||||||
}
|
}
|
||||||
auto duration = 5; // 默认至少一帧5ms
|
auto duration = 5u; // 默认至少一帧5ms
|
||||||
if (frame->dts() > 0 && frame->dts() > _last_dts) {
|
if (frame->dts() > 0 && frame->dts() > _last_dts) {
|
||||||
duration = MAX(duration, frame->dts() - _last_dts);
|
duration = MAX(duration, frame->dts() - _last_dts);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ class MP4Recorder final : public MediaSinkInterface {
|
||||||
public:
|
public:
|
||||||
using Ptr = std::shared_ptr<MP4Recorder>;
|
using Ptr = std::shared_ptr<MP4Recorder>;
|
||||||
|
|
||||||
MP4Recorder(const std::string &path, const std::string &vhost, const std::string &app, const std::string &stream_id, size_t max_second);
|
MP4Recorder(const MediaTuple &tuple, const std::string &path, size_t max_second);
|
||||||
~MP4Recorder() override;
|
~MP4Recorder() override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -68,8 +68,7 @@ string Recorder::getRecordPath(Recorder::type type, const MediaTuple& tuple, con
|
||||||
}
|
}
|
||||||
return File::absolutePath(m3u8FilePath, hlsPath);
|
return File::absolutePath(m3u8FilePath, hlsPath);
|
||||||
}
|
}
|
||||||
default:
|
default: return "";
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -85,13 +84,12 @@ std::shared_ptr<MediaSinkInterface> Recorder::createRecorder(type type, const Me
|
||||||
#else
|
#else
|
||||||
throw std::invalid_argument("hls相关功能未打开,请开启ENABLE_HLS宏后编译再测试");
|
throw std::invalid_argument("hls相关功能未打开,请开启ENABLE_HLS宏后编译再测试");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case Recorder::type_mp4: {
|
case Recorder::type_mp4: {
|
||||||
#if defined(ENABLE_MP4)
|
#if defined(ENABLE_MP4)
|
||||||
auto path = Recorder::getRecordPath(type, tuple, option.mp4_save_path);
|
auto path = Recorder::getRecordPath(type, tuple, option.mp4_save_path);
|
||||||
return std::make_shared<MP4Recorder>(path, tuple.vhost, tuple.app, tuple.stream, option.mp4_max_second);
|
return std::make_shared<MP4Recorder>(tuple, path, option.mp4_max_second);
|
||||||
#else
|
#else
|
||||||
throw std::invalid_argument("mp4相关功能未打开,请开启ENABLE_MP4宏后编译再测试");
|
throw std::invalid_argument("mp4相关功能未打开,请开启ENABLE_MP4宏后编译再测试");
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ struct MediaTuple {
|
||||||
std::string vhost;
|
std::string vhost;
|
||||||
std::string app;
|
std::string app;
|
||||||
std::string stream;
|
std::string stream;
|
||||||
|
std::string params;
|
||||||
std::string shortUrl() const {
|
std::string shortUrl() const {
|
||||||
return vhost + '/' + app + '/' + stream;
|
return vhost + '/' + app + '/' + stream;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -63,8 +63,8 @@ void SrtTransportImp::onHandShakeFinished(std::string &streamid, struct sockaddr
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto params = Parser::parseArgs(_media_info.param_strs);
|
auto kv = Parser::parseArgs(_media_info.params);
|
||||||
if (params["m"] == "publish") {
|
if (kv["m"] == "publish") {
|
||||||
_is_pusher = true;
|
_is_pusher = true;
|
||||||
_decoder = DecoderImp::createDecoder(DecoderImp::decoder_ts, this);
|
_decoder = DecoderImp::createDecoder(DecoderImp::decoder_ts, this);
|
||||||
emitOnPublish();
|
emitOnPublish();
|
||||||
|
|
@ -98,10 +98,10 @@ bool SrtTransportImp::parseStreamid(std::string &streamid) {
|
||||||
app = tmps[0];
|
app = tmps[0];
|
||||||
stream_name = tmps[1];
|
stream_name = tmps[1];
|
||||||
} else {
|
} else {
|
||||||
if (_media_info.param_strs.empty()) {
|
if (_media_info.params.empty()) {
|
||||||
_media_info.param_strs = it.first + "=" + it.second;
|
_media_info.params = it.first + "=" + it.second;
|
||||||
} else {
|
} else {
|
||||||
_media_info.param_strs += "&" + it.first + "=" + it.second;
|
_media_info.params += "&" + it.first + "=" + it.second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -118,7 +118,7 @@ bool SrtTransportImp::parseStreamid(std::string &streamid) {
|
||||||
_media_info.app = app;
|
_media_info.app = app;
|
||||||
_media_info.stream = stream_name;
|
_media_info.stream = stream_name;
|
||||||
|
|
||||||
TraceL << " mediainfo=" << _media_info.shortUrl() << " params=" << _media_info.param_strs;
|
TraceL << " mediainfo=" << _media_info.shortUrl() << " params=" << _media_info.params;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ using namespace mediakit;
|
||||||
class FlvSplitterImp : public FlvSplitter {
|
class FlvSplitterImp : public FlvSplitter {
|
||||||
public:
|
public:
|
||||||
FlvSplitterImp() {
|
FlvSplitterImp() {
|
||||||
_src = std::make_shared<RtmpMediaSourceImp>(MediaTuple{DEFAULT_VHOST, "live", "test"});
|
_src = std::make_shared<RtmpMediaSourceImp>(MediaTuple{DEFAULT_VHOST, "live", "test", ""});
|
||||||
}
|
}
|
||||||
~FlvSplitterImp() override = default;
|
~FlvSplitterImp() override = default;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ void initEventListener() {
|
||||||
static onceToken s_token([]() {
|
static onceToken s_token([]() {
|
||||||
//监听kBroadcastOnGetRtspRealm事件决定rtsp链接是否需要鉴权(传统的rtsp鉴权方案)才能访问
|
//监听kBroadcastOnGetRtspRealm事件决定rtsp链接是否需要鉴权(传统的rtsp鉴权方案)才能访问
|
||||||
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastOnGetRtspRealm, [](BroadcastOnGetRtspRealmArgs) {
|
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastOnGetRtspRealm, [](BroadcastOnGetRtspRealmArgs) {
|
||||||
DebugL << "RTSP是否需要鉴权事件:" << args.getUrl() << " " << args.param_strs;
|
DebugL << "RTSP是否需要鉴权事件:" << args.getUrl() << " " << args.params;
|
||||||
if (string("1") == args.stream) {
|
if (string("1") == args.stream) {
|
||||||
// live/1需要认证
|
// live/1需要认证
|
||||||
//该流需要认证,并且设置realm
|
//该流需要认证,并且设置realm
|
||||||
|
|
@ -104,7 +104,7 @@ void initEventListener() {
|
||||||
|
|
||||||
//监听kBroadcastOnRtspAuth事件返回正确的rtsp鉴权用户密码
|
//监听kBroadcastOnRtspAuth事件返回正确的rtsp鉴权用户密码
|
||||||
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastOnRtspAuth, [](BroadcastOnRtspAuthArgs) {
|
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastOnRtspAuth, [](BroadcastOnRtspAuthArgs) {
|
||||||
DebugL << "RTSP播放鉴权:" << args.getUrl() << " " << args.param_strs;
|
DebugL << "RTSP播放鉴权:" << args.getUrl() << " " << args.params;
|
||||||
DebugL << "RTSP用户:" << user_name << (must_no_encrypt ? " Base64" : " MD5") << " 方式登录";
|
DebugL << "RTSP用户:" << user_name << (must_no_encrypt ? " Base64" : " MD5") << " 方式登录";
|
||||||
string user = user_name;
|
string user = user_name;
|
||||||
//假设我们异步读取数据库
|
//假设我们异步读取数据库
|
||||||
|
|
@ -134,14 +134,14 @@ void initEventListener() {
|
||||||
|
|
||||||
//监听rtsp/rtmp推流事件,返回结果告知是否有推流权限
|
//监听rtsp/rtmp推流事件,返回结果告知是否有推流权限
|
||||||
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastMediaPublish, [](BroadcastMediaPublishArgs) {
|
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastMediaPublish, [](BroadcastMediaPublishArgs) {
|
||||||
DebugL << "推流鉴权:" << args.getUrl() << " " << args.param_strs;
|
DebugL << "推流鉴权:" << args.getUrl() << " " << args.params;
|
||||||
invoker("", ProtocolOption());//鉴权成功
|
invoker("", ProtocolOption());//鉴权成功
|
||||||
//invoker("this is auth failed message");//鉴权失败
|
//invoker("this is auth failed message");//鉴权失败
|
||||||
});
|
});
|
||||||
|
|
||||||
//监听rtsp/rtsps/rtmp/http-flv播放事件,返回结果告知是否有播放权限(rtsp通过kBroadcastOnRtspAuth或此事件都可以实现鉴权)
|
//监听rtsp/rtsps/rtmp/http-flv播放事件,返回结果告知是否有播放权限(rtsp通过kBroadcastOnRtspAuth或此事件都可以实现鉴权)
|
||||||
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastMediaPlayed, [](BroadcastMediaPlayedArgs) {
|
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastMediaPlayed, [](BroadcastMediaPlayedArgs) {
|
||||||
DebugL << "播放鉴权:" << args.getUrl() << " " << args.param_strs;
|
DebugL << "播放鉴权:" << args.getUrl() << " " << args.params;
|
||||||
invoker("");//鉴权成功
|
invoker("");//鉴权成功
|
||||||
//invoker("this is auth failed message");//鉴权失败
|
//invoker("this is auth failed message");//鉴权失败
|
||||||
});
|
});
|
||||||
|
|
@ -183,13 +183,13 @@ void initEventListener() {
|
||||||
* 你可以在这个事件触发时再去拉流,这样就可以实现按需拉流
|
* 你可以在这个事件触发时再去拉流,这样就可以实现按需拉流
|
||||||
* 拉流成功后,ZLMediaKit会把其立即转发给播放器(最大等待时间约为5秒,如果5秒都未拉流成功,播放器会播放失败)
|
* 拉流成功后,ZLMediaKit会把其立即转发给播放器(最大等待时间约为5秒,如果5秒都未拉流成功,播放器会播放失败)
|
||||||
*/
|
*/
|
||||||
DebugL << "未找到流事件:" << args.getUrl() << " " << args.param_strs;
|
DebugL << "未找到流事件:" << args.getUrl() << " " << args.params;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
//监听播放或推流结束时消耗流量事件
|
//监听播放或推流结束时消耗流量事件
|
||||||
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastFlowReport, [](BroadcastFlowReportArgs) {
|
NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastFlowReport, [](BroadcastFlowReportArgs) {
|
||||||
DebugL << "播放器(推流器)断开连接事件:" << args.getUrl() << " " << args.param_strs << "\r\n使用流量:" << totalBytes << " bytes,连接时长:" << totalDuration << "秒";
|
DebugL << "播放器(推流器)断开连接事件:" << args.getUrl() << " " << args.params << "\r\n使用流量:" << totalBytes << " bytes,连接时长:" << totalDuration << "秒";
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue