diff --git a/.gitignore b/.gitignore index 3496b697..f5ec7af1 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ /Android/.idea/ /Android/app/src/main/cpp/libs_export/ /3rdpart/media-server/.idea/ +/3rdpart/media-server/.idea/ +/build/ +/3rdpart/media-server/.idea/ diff --git a/3rdpart/ZLToolKit b/3rdpart/ZLToolKit index 8eaecbd6..ca6ab8b4 160000 --- a/3rdpart/ZLToolKit +++ b/3rdpart/ZLToolKit @@ -1 +1 @@ -Subproject commit 8eaecbd6dd8bed0bee6a61168255653127a20a43 +Subproject commit ca6ab8b4c406c3c2e91ca0979c843908d1edb4bd diff --git a/server/WebHook.cpp b/server/WebHook.cpp index 5a5d3720..65933573 100644 --- a/server/WebHook.cpp +++ b/server/WebHook.cpp @@ -278,6 +278,7 @@ void installWebHook(){ body["player"] = isPlayer; body["ip"] = peerIP; body["port"] = peerPort; + body["id"] = sessionIdentifier; //执行hook do_http_hook(hook_flowreport,body, nullptr); }); diff --git a/src/Common/config.h b/src/Common/config.h index 32fb7b84..9b9cab0c 100644 --- a/src/Common/config.h +++ b/src/Common/config.h @@ -127,7 +127,7 @@ extern const string kBroadcastShellLogin; //停止rtsp/rtmp/http-flv会话后流量汇报事件广播 extern const string kBroadcastFlowReport; -#define BroadcastFlowReportArgs const MediaInfo &args,const uint64_t &totalBytes,const uint64_t &totalDuration,const bool &isPlayer, const string &peerIP,const uint16_t &peerPort +#define BroadcastFlowReportArgs const MediaInfo &args,const uint64_t &totalBytes,const uint64_t &totalDuration,const bool &isPlayer, const string &sessionIdentifier, const string &peerIP,const uint16_t &peerPort //未找到流后会广播该事件,请在监听该事件后去拉流或其他方式产生流,这样就能按需拉流了 extern const string kBroadcastNotFoundStream; diff --git a/src/Http/HttpFileManager.cpp b/src/Http/HttpFileManager.cpp index ce0960ac..81cf9a8a 100644 --- a/src/Http/HttpFileManager.cpp +++ b/src/Http/HttpFileManager.cpp @@ -378,11 +378,12 @@ static void canAccessPath(TcpSession &sender, const Parser &parser, const MediaI } bool is_hls = mediaInfo._schema == HLS_SCHEMA; + string identifier = sender.getIdentifier(); string peer_ip = sender.get_peer_ip(); uint16_t peer_port = sender.get_peer_port(); //该用户从来未获取过cookie,这个时候我们广播是否允许该用户访问该http目录 - HttpSession::HttpAccessPathInvoker accessPathInvoker = [callback, uid, path, is_dir, is_hls, mediaInfo, peer_ip, peer_port] + HttpSession::HttpAccessPathInvoker accessPathInvoker = [callback, uid, path, is_dir, is_hls, mediaInfo, identifier, peer_ip, peer_port] (const string &errMsg, const string &cookie_path_in, int cookieLifeSecond) { HttpServerCookie::Ptr cookie; if (cookieLifeSecond) { @@ -405,7 +406,7 @@ static void canAccessPath(TcpSession &sender, const Parser &parser, const MediaI attachment._is_hls = is_hls; if(is_hls){ //hls相关信息 - attachment._hls_data = std::make_shared(mediaInfo, peer_ip, peer_port); + attachment._hls_data = std::make_shared(mediaInfo, identifier, peer_ip, peer_port); //hls未查找MediaSource attachment._have_find_media_source = false; } diff --git a/src/Http/HttpSession.cpp b/src/Http/HttpSession.cpp index 4280e28a..d9144d11 100644 --- a/src/Http/HttpSession.cpp +++ b/src/Http/HttpSession.cpp @@ -103,16 +103,18 @@ void HttpSession::onRecv(const Buffer::Ptr &pBuf) { void HttpSession::onError(const SockException& err) { if(_is_flv_stream){ + uint64_t duration = _ticker.createdTime()/1000; //flv播放器 WarnP(this) << "FLV播放器(" << _mediaInfo._vhost << "/" << _mediaInfo._app << "/" << _mediaInfo._streamid - << ")断开:" << err.what(); + << ")断开:" << err.what() + << ",耗时(s):" << duration; GET_CONFIG(uint32_t,iFlowThreshold,General::kFlowThreshold); if(_ui64TotalBytes > iFlowThreshold * 1024){ - NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastFlowReport, _mediaInfo, _ui64TotalBytes, _ticker.createdTime()/1000, true, get_peer_ip(), get_peer_port()); + NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastFlowReport, _mediaInfo, _ui64TotalBytes, duration , true, getIdentifier(), get_peer_ip(), get_peer_port()); } return; } diff --git a/src/Record/HlsMediaSource.cpp b/src/Record/HlsMediaSource.cpp index c10cf0ca..88bc0c71 100644 --- a/src/Record/HlsMediaSource.cpp +++ b/src/Record/HlsMediaSource.cpp @@ -28,8 +28,9 @@ namespace mediakit{ -HlsCookieData::HlsCookieData(const MediaInfo &info, const string &peer_ip, uint16_t peer_port) { +HlsCookieData::HlsCookieData(const MediaInfo &info, const string &sessionIdentifier, const string &peer_ip, uint16_t peer_port) { _info = info; + _sessionIdentifier = sessionIdentifier; _peer_ip = peer_ip; _peer_port = peer_port; _added = std::make_shared(false); @@ -59,11 +60,14 @@ HlsCookieData::~HlsCookieData() { if (src) { src->modifyReaderCount(false); } - auto duration = (_ticker.createdTime() - _ticker.elapsedTime()) / 1000; - WarnL << "HLS播放器(" << _info._vhost << "/" << _info._app << "/" << _info._streamid << ")断开,播放时间:" << duration; + uint64_t duration = (_ticker.createdTime() - _ticker.elapsedTime()) / 1000; + WarnL << _sessionIdentifier << "(" << _peer_ip << ":" << _peer_port << ") " + << "HLS播放器(" << _info._vhost << "/" << _info._app << "/" << _info._streamid + << ")断开,耗时(s):" << duration; + GET_CONFIG(uint32_t, iFlowThreshold, General::kFlowThreshold); if (_bytes > iFlowThreshold * 1024) { - NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastFlowReport, _info, _bytes, duration, true, _peer_ip, _peer_port); + NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastFlowReport, _info, _bytes, duration, true, _sessionIdentifier, _peer_ip, _peer_port); } } } diff --git a/src/Record/HlsMediaSource.h b/src/Record/HlsMediaSource.h index 82952e21..8da52e2c 100644 --- a/src/Record/HlsMediaSource.h +++ b/src/Record/HlsMediaSource.h @@ -92,7 +92,7 @@ private: class HlsCookieData{ public: typedef std::shared_ptr Ptr; - HlsCookieData(const MediaInfo &info, const string &peer_ip, uint16_t peer_port); + HlsCookieData(const MediaInfo &info, const string &sessionIdentifier, const string &peer_ip, uint16_t peer_port); ~HlsCookieData(); void addByteUsage(uint64_t bytes); private: @@ -100,6 +100,7 @@ private: private: uint64_t _bytes = 0; MediaInfo _info; + string _sessionIdentifier; string _peer_ip; uint16_t _peer_port; std::shared_ptr _added; diff --git a/src/Rtmp/RtmpSession.cpp b/src/Rtmp/RtmpSession.cpp index 7ef95ea1..15e4342f 100644 --- a/src/Rtmp/RtmpSession.cpp +++ b/src/Rtmp/RtmpSession.cpp @@ -45,17 +45,19 @@ RtmpSession::~RtmpSession() { void RtmpSession::onError(const SockException& err) { bool isPlayer = !_pPublisherSrc; + uint64_t duration = _ticker.createdTime()/1000; WarnP(this) << (isPlayer ? "RTMP播放器(" : "RTMP推流器(") << _mediaInfo._vhost << "/" << _mediaInfo._app << "/" << _mediaInfo._streamid - << ")断开:" << err.what(); + << ")断开:" << err.what() + << ",耗时(s):" << duration; //流量统计事件广播 GET_CONFIG(uint32_t,iFlowThreshold,General::kFlowThreshold); if(_ui64TotalBytes > iFlowThreshold * 1024){ - NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastFlowReport, _mediaInfo, _ui64TotalBytes, _ticker.createdTime()/1000, isPlayer, get_peer_ip(), get_peer_port()); + NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastFlowReport, _mediaInfo, _ui64TotalBytes, duration, isPlayer, getIdentifier(), get_peer_ip(), get_peer_port()); } } @@ -206,7 +208,7 @@ void RtmpSession::onCmd_deleteStream(AMFDecoder &dec) { status.set("code", "NetStream.Unpublish.Success"); status.set("description", "Stop publishing."); sendReply("onStatus", nullptr, status); - throw std::runtime_error(StrPrinter << "Stop publishing." << endl); + throw std::runtime_error(StrPrinter << "Stop publishing" << endl); } diff --git a/src/Rtsp/RtspSession.cpp b/src/Rtsp/RtspSession.cpp index 19eae91b..29a62779 100644 --- a/src/Rtsp/RtspSession.cpp +++ b/src/Rtsp/RtspSession.cpp @@ -86,11 +86,13 @@ RtspSession::~RtspSession() { void RtspSession::onError(const SockException& err) { bool isPlayer = !_pushSrc; + uint64_t duration = _ticker.createdTime()/1000; WarnP(this) << (isPlayer ? "RTSP播放器(" : "RTSP推流器(") << _mediaInfo._vhost << "/" << _mediaInfo._app << "/" << _mediaInfo._streamid - << ")断开:" << err.what(); + << ")断开:" << err.what() + << ",耗时(s):" << duration; if (_rtpType == Rtsp::RTP_MULTICAST) { //取消UDP端口监听 @@ -106,7 +108,7 @@ void RtspSession::onError(const SockException& err) { //流量统计事件广播 GET_CONFIG(uint32_t,iFlowThreshold,General::kFlowThreshold); if(_ui64TotalBytes > iFlowThreshold * 1024){ - NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastFlowReport, _mediaInfo, _ui64TotalBytes, _ticker.createdTime()/1000, isPlayer, get_peer_ip(), get_peer_port()); + NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastFlowReport, _mediaInfo, _ui64TotalBytes, duration, isPlayer, getIdentifier(), get_peer_ip(), get_peer_port()); } }