From bad419e41f034a38f3401b23bfc7eb220626e037 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 7 Nov 2020 17:44:30 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dcts=E5=B0=8F=E4=BA=8E0?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Extension/H264Rtmp.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Extension/H264Rtmp.cpp b/src/Extension/H264Rtmp.cpp index c1a94b96..20e58da1 100644 --- a/src/Extension/H264Rtmp.cpp +++ b/src/Extension/H264Rtmp.cpp @@ -200,7 +200,10 @@ void H264RtmpEncoder::inputFrame(const Frame::Ptr &frame) { _lastPacket->buffer.clear(); _lastPacket->buffer.push_back(flags); _lastPacket->buffer.push_back(!is_config); - auto cts = frame->pts() - frame->dts(); + int32_t cts = frame->pts() - frame->dts(); + if (cts < 0) { + cts = 0; + } cts = htonl(cts); _lastPacket->buffer.append((char *)&cts + 1, 3); From ba7251f345ef482118d0e84f3d98633e07422cdf Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 7 Nov 2020 17:45:16 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=81=B6=E5=B0=94?= =?UTF-8?q?=E8=8E=B7=E5=8F=96H265=E5=AE=BD=E9=AB=98=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Extension/H265.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Extension/H265.h b/src/Extension/H265.h index eee14de2..4fc3d82e 100644 --- a/src/Extension/H265.h +++ b/src/Extension/H265.h @@ -247,6 +247,9 @@ private: } break; } + if (_width == 0 && ready()) { + onReady(); + } } /** From 57a11f19dda5f835f270526444bb91b688b9130e Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 7 Nov 2020 17:45:58 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=8F=90=E9=AB=98rtsp=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7:=20#551?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtsp/RtspPlayer.cpp | 3 +++ src/Rtsp/RtspPusher.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/Rtsp/RtspPlayer.cpp b/src/Rtsp/RtspPlayer.cpp index 747de9e5..de3aa0d8 100644 --- a/src/Rtsp/RtspPlayer.cpp +++ b/src/Rtsp/RtspPlayer.cpp @@ -223,6 +223,9 @@ void RtspPlayer::sendSetup(unsigned int track_idx) { _on_response = std::bind(&RtspPlayer::handleResSETUP, this, placeholders::_1, track_idx); auto &track = _sdp_track[track_idx]; auto baseUrl = _content_base + "/" + track->_control_surffix; + if (track->_control.find("://") != string::npos) { + baseUrl = track->_control; + } switch (_rtp_type) { case Rtsp::RTP_TCP: { sendRtspRequest("SETUP",baseUrl,{"Transport",StrPrinter << "RTP/AVP/TCP;unicast;interleaved=" << track->_type * 2 << "-" << track->_type * 2 + 1}); diff --git a/src/Rtsp/RtspPusher.cpp b/src/Rtsp/RtspPusher.cpp index 0172ca5b..dd7ef315 100644 --- a/src/Rtsp/RtspPusher.cpp +++ b/src/Rtsp/RtspPusher.cpp @@ -239,6 +239,9 @@ void RtspPusher::sendSetup(unsigned int track_idx) { _on_res_func = std::bind(&RtspPusher::handleResSetup, this, placeholders::_1, track_idx); auto &track = _track_vec[track_idx]; auto base_url = _content_base + "/" + track->_control_surffix; + if (track->_control.find("://") != string::npos) { + base_url = track->_control; + } switch (_rtp_type) { case Rtsp::RTP_TCP: { sendRtspRequest("SETUP", base_url, {"Transport", From a93c57eb59c9e1960fa306951ac77201e75b4238 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 7 Nov 2020 17:46:37 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dehome=E6=8E=A8=E6=B5=81?= =?UTF-8?q?=E7=9B=B8=E5=85=B3bug:=20#549?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtp/RtpSplitter.cpp | 3 ++- src/Rtp/RtpSplitter.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Rtp/RtpSplitter.cpp b/src/Rtp/RtpSplitter.cpp index 0bb76d59..6cc8900b 100644 --- a/src/Rtp/RtpSplitter.cpp +++ b/src/Rtp/RtpSplitter.cpp @@ -24,7 +24,7 @@ int64_t RtpSplitter::onRecvHeader(const char *data,uint64_t len){ data += _offset; len -= _offset; - if (_offset == kEHOME_OFFSET + 4 && len > 12 && data[12] == '\r') { + if (_is_ehome && len > 12 && data[12] == '\r') { //这是ehome,移除第12个字节 memmove((char *) data + 1, data, 12); data += 1; @@ -55,6 +55,7 @@ const char *RtpSplitter::onSearchPacketTail(const char *data, uint64_t len) { } //忽略ehome私有头后是rtsp样式的rtp,多4个字节, _offset = kEHOME_OFFSET + 4; + _is_ehome = true; //忽略ehome私有头 return onSearchPacketTail_l(data + kEHOME_OFFSET + 2, len - kEHOME_OFFSET - 2); } diff --git a/src/Rtp/RtpSplitter.h b/src/Rtp/RtpSplitter.h index 9f895c21..68e10cbc 100644 --- a/src/Rtp/RtpSplitter.h +++ b/src/Rtp/RtpSplitter.h @@ -36,6 +36,7 @@ protected: private: int _offset = 0; + bool _is_ehome = false; }; }//namespace mediakit From 9618748c65f0c96cc8ed39ba028080fd17ac58ac Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sun, 8 Nov 2020 09:28:46 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E9=BB=98=E8=AE=A4hook=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E7=BD=AE=E7=A9=BA=EF=BC=8C=E6=96=B9=E4=BE=BF=E5=85=B3=E9=97=AD?= =?UTF-8?q?hook=20=E5=90=8C=E6=97=B6=E6=95=B4=E7=90=86=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/WebHook.cpp | 57 +++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/server/WebHook.cpp b/server/WebHook.cpp index 96d06d06..eda1648d 100644 --- a/server/WebHook.cpp +++ b/server/WebHook.cpp @@ -9,8 +9,6 @@ */ #include -#include -#include #include "jsoncpp/json.h" #include "Util/logger.h" #include "Util/util.h" @@ -23,7 +21,6 @@ #include "Rtsp/RtspSession.h" #include "Http/HttpSession.h" #include "WebHook.h" -#include "Record/MP4Recorder.h" using namespace Json; using namespace toolkit; @@ -63,19 +60,20 @@ const string kAdminParams = HOOK_FIELD"admin_params"; onceToken token([](){ mINI::Instance()[kEnable] = false; mINI::Instance()[kTimeoutSec] = 10; - mINI::Instance()[kOnPublish] = "https://127.0.0.1/index/hook/on_publish"; - mINI::Instance()[kOnPlay] = "https://127.0.0.1/index/hook/on_play"; - mINI::Instance()[kOnFlowReport] = "https://127.0.0.1/index/hook/on_flow_report"; - mINI::Instance()[kOnRtspRealm] = "https://127.0.0.1/index/hook/on_rtsp_realm"; - mINI::Instance()[kOnRtspAuth] = "https://127.0.0.1/index/hook/on_rtsp_auth"; - mINI::Instance()[kOnStreamChanged] = "https://127.0.0.1/index/hook/on_stream_changed"; - mINI::Instance()[kOnStreamNotFound] = "https://127.0.0.1/index/hook/on_stream_not_found"; - mINI::Instance()[kOnRecordMp4] = "https://127.0.0.1/index/hook/on_record_mp4"; - mINI::Instance()[kOnRecordTs] = "https://127.0.0.1/index/hook/on_record_ts"; - mINI::Instance()[kOnShellLogin] = "https://127.0.0.1/index/hook/on_shell_login"; - mINI::Instance()[kOnStreamNoneReader] = "https://127.0.0.1/index/hook/on_stream_none_reader"; - mINI::Instance()[kOnHttpAccess] = "https://127.0.0.1/index/hook/on_http_access"; - mINI::Instance()[kOnServerStarted] = "https://127.0.0.1/index/hook/on_server_started"; + //默认hook地址设置为空,采用默认行为(例如不鉴权) + mINI::Instance()[kOnPublish] = ""; + mINI::Instance()[kOnPlay] = ""; + mINI::Instance()[kOnFlowReport] = ""; + mINI::Instance()[kOnRtspRealm] = ""; + mINI::Instance()[kOnRtspAuth] = ""; + mINI::Instance()[kOnStreamChanged] = ""; + mINI::Instance()[kOnStreamNotFound] = ""; + mINI::Instance()[kOnRecordMp4] = ""; + mINI::Instance()[kOnRecordTs] = ""; + mINI::Instance()[kOnShellLogin] = ""; + mINI::Instance()[kOnStreamNoneReader] = ""; + mINI::Instance()[kOnHttpAccess] = ""; + mINI::Instance()[kOnServerStarted] = ""; mINI::Instance()[kAdminParams] = "secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc"; },nullptr); }//namespace Hook @@ -186,21 +184,10 @@ static void reportServerStarted(){ void installWebHook(){ GET_CONFIG(bool,hook_enable,Hook::kEnable); - GET_CONFIG(string,hook_publish,Hook::kOnPublish); - GET_CONFIG(string,hook_play,Hook::kOnPlay); - GET_CONFIG(string,hook_flowreport,Hook::kOnFlowReport); GET_CONFIG(string,hook_adminparams,Hook::kAdminParams); - GET_CONFIG(string,hook_rtsp_realm,Hook::kOnRtspRealm); - GET_CONFIG(string,hook_rtsp_auth,Hook::kOnRtspAuth); - GET_CONFIG(string,hook_stream_chaned,Hook::kOnStreamChanged); - GET_CONFIG(string,hook_stream_not_found,Hook::kOnStreamNotFound); - GET_CONFIG(string,hook_record_mp4,Hook::kOnRecordMp4); - GET_CONFIG(string,hook_record_ts,Hook::kOnRecordTs); - GET_CONFIG(string,hook_shell_login,Hook::kOnShellLogin); - GET_CONFIG(string,hook_stream_none_reader,Hook::kOnStreamNoneReader); - GET_CONFIG(string,hook_http_access,Hook::kOnHttpAccess); NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastMediaPublish,[](BroadcastMediaPublishArgs){ + GET_CONFIG(string,hook_publish,Hook::kOnPublish); GET_CONFIG(bool,toHls,General::kPublishToHls); GET_CONFIG(bool,toMP4,General::kPublishToMP4); if(!hook_enable || args._param_strs == hook_adminparams || hook_publish.empty() || sender.get_peer_ip() == "127.0.0.1"){ @@ -236,6 +223,7 @@ void installWebHook(){ }); NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastMediaPlayed,[](BroadcastMediaPlayedArgs){ + GET_CONFIG(string,hook_play,Hook::kOnPlay); if(!hook_enable || args._param_strs == hook_adminparams || hook_play.empty() || sender.get_peer_ip() == "127.0.0.1"){ invoker(""); return; @@ -251,6 +239,7 @@ void installWebHook(){ }); NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastFlowReport,[](BroadcastFlowReportArgs){ + GET_CONFIG(string,hook_flowreport,Hook::kOnFlowReport); if(!hook_enable || args._param_strs == hook_adminparams || hook_flowreport.empty() || sender.get_peer_ip() == "127.0.0.1"){ return; } @@ -270,6 +259,7 @@ void installWebHook(){ //监听kBroadcastOnGetRtspRealm事件决定rtsp链接是否需要鉴权(传统的rtsp鉴权方案)才能访问 NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastOnGetRtspRealm,[](BroadcastOnGetRtspRealmArgs){ + GET_CONFIG(string,hook_rtsp_realm,Hook::kOnRtspRealm); if(!hook_enable || args._param_strs == hook_adminparams || hook_rtsp_realm.empty() || sender.get_peer_ip() == "127.0.0.1"){ //无需认证 invoker(""); @@ -292,6 +282,7 @@ void installWebHook(){ //监听kBroadcastOnRtspAuth事件返回正确的rtsp鉴权用户密码 NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastOnRtspAuth,[](BroadcastOnRtspAuthArgs){ + GET_CONFIG(string,hook_rtsp_auth,Hook::kOnRtspAuth); if(unAuthedRealm == realm || !hook_enable || hook_rtsp_auth.empty()){ //认证失败 invoker(false,makeRandStr(12)); @@ -318,6 +309,7 @@ void installWebHook(){ //监听rtsp、rtmp源注册或注销事件 NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastMediaChanged,[](BroadcastMediaChangedArgs){ + GET_CONFIG(string,hook_stream_chaned,Hook::kOnStreamChanged); if(!hook_enable || hook_stream_chaned.empty()){ return; } @@ -333,8 +325,10 @@ void installWebHook(){ //监听播放失败(未找到特定的流)事件 NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastNotFoundStream,[](BroadcastNotFoundStreamArgs){ + GET_CONFIG(string,hook_stream_not_found,Hook::kOnStreamNotFound); if(!hook_enable || hook_stream_not_found.empty()){ -// closePlayer(); + //如果确定这个流不存在,可以closePlayer()返回播放器流不存在 + //closePlayer(); return; } auto body = make_json(args); @@ -363,6 +357,7 @@ void installWebHook(){ #ifdef ENABLE_MP4 //录制mp4文件成功后广播 NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastRecordMP4,[](BroadcastRecordMP4Args){ + GET_CONFIG(string,hook_record_mp4,Hook::kOnRecordMp4); if (!hook_enable || hook_record_mp4.empty()) { return; } @@ -372,6 +367,7 @@ void installWebHook(){ #endif //ENABLE_MP4 NoticeCenter::Instance().addListener(nullptr, Broadcast::kBroadcastRecordTs, [](BroadcastRecordTsArgs) { + GET_CONFIG(string,hook_record_ts,Hook::kOnRecordTs); if (!hook_enable || hook_record_ts.empty()) { return; } @@ -380,6 +376,7 @@ void installWebHook(){ }); NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastShellLogin,[](BroadcastShellLoginArgs){ + GET_CONFIG(string,hook_shell_login,Hook::kOnShellLogin); if(!hook_enable || hook_shell_login.empty() || sender.get_peer_ip() == "127.0.0.1"){ invoker(""); return; @@ -398,6 +395,7 @@ void installWebHook(){ }); NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastStreamNoneReader,[](BroadcastStreamNoneReaderArgs){ + GET_CONFIG(string,hook_stream_none_reader,Hook::kOnStreamNoneReader); if(!hook_enable || hook_stream_none_reader.empty()){ return; } @@ -435,6 +433,7 @@ void installWebHook(){ //如果没有url参数,客户端又不支持cookie,那么会根据ip和端口追踪用户 //追踪用户的目的是为了缓存上次鉴权结果,减少鉴权次数,提高性能 NoticeCenter::Instance().addListener(nullptr,Broadcast::kBroadcastHttpAccess,[](BroadcastHttpAccessArgs){ + GET_CONFIG(string,hook_http_access,Hook::kOnHttpAccess); if(sender.get_peer_ip() == "127.0.0.1" || parser.Params() == hook_adminparams){ //如果是本机或超级管理员访问,那么不做访问鉴权;权限有效期1个小时 invoker("","",60 * 60);