From 8da9aee11a9ae2c64f6524b24ccbfbf59933c975 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 21 Sep 2019 19:27:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=97=A0metadata=E7=9A=84rtm?= =?UTF-8?q?p=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtmp/FlvMuxer.cpp | 13 +++++++++---- src/Rtmp/RtmpSession.cpp | 30 +++++++++++++++++++++++++----- src/Rtmp/RtmpSession.h | 1 + 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/Rtmp/FlvMuxer.cpp b/src/Rtmp/FlvMuxer.cpp index e47ba1d3..dc7c96e8 100644 --- a/src/Rtmp/FlvMuxer.cpp +++ b/src/Rtmp/FlvMuxer.cpp @@ -106,10 +106,15 @@ void FlvMuxer::onWriteFlvHeader(const RtmpMediaSource::Ptr &mediaSrc) { //PreviousTagSize0 Always 0 onWrite(std::make_shared((char *)&size,4)); - //metadata - AMFEncoder invoke; - invoke << "onMetaData" << mediaSrc->getMetaData(); - onWriteFlvTag(MSG_DATA, std::make_shared(invoke.data()), 0); + + auto &metadata = mediaSrc->getMetaData(); + if(metadata){ + //在有metadata的情况下才发送metadata + //其实metadata没什么用,有些推流器不产生metadata + AMFEncoder invoke; + invoke << "onMetaData" << metadata; + onWriteFlvTag(MSG_DATA, std::make_shared(invoke.data()), 0); + } //config frame mediaSrc->getConfigFrame([&](const RtmpPacket::Ptr &pkt){ diff --git a/src/Rtmp/RtmpSession.cpp b/src/Rtmp/RtmpSession.cpp index d9c6e1d4..c670a6e6 100644 --- a/src/Rtmp/RtmpSession.cpp +++ b/src/Rtmp/RtmpSession.cpp @@ -262,10 +262,16 @@ void RtmpSession::sendPlayResponse(const string &err,const RtmpMediaSource::Ptr status.set("clientid", "0"); sendReply("onStatus", nullptr, status); - // onMetaData - invoke.clear(); - invoke << "onMetaData" << src->getMetaData(); - sendResponse(MSG_DATA, invoke.data()); + auto &metadata = src->getMetaData(); + if(metadata){ + //在有metadata的情况下才发送metadata + //其实metadata没什么用,有些推流器不产生metadata + // onMetaData + invoke.clear(); + invoke << "onMetaData" << metadata; + sendResponse(MSG_DATA, invoke.data()); + } + src->getConfigFrame([&](const RtmpPacket::Ptr &pkt) { //DebugP(this)<<"send initial frame"; @@ -423,7 +429,9 @@ void RtmpSession::setMetaData(AMFDecoder &dec) { if (type != "onMetaData") { throw std::runtime_error("can only set metadata"); } - _pPublisherSrc->onGetMetaData(dec.load()); + auto metadata = dec.load(); + //dumpMetadata(metadata); + _pPublisherSrc->onGetMetaData(metadata); } void RtmpSession::onProcessCmd(AMFDecoder &dec) { @@ -542,4 +550,16 @@ void RtmpSession::setSocketFlags(){ (*this) << SocketFlags(SOCKET_DEFAULE_FLAGS | FLAG_MORE); } } + +void RtmpSession::dumpMetadata(const AMFValue &metadata) { + if(metadata.type() != AMF_OBJECT && metadata.type() != AMF_ECMA_ARRAY){ + WarnL << "invalid metedata type:" << metadata.type(); + return ; + } + _StrPrinter printer; + metadata.object_for_each([&](const string &key, const AMFValue &val){ + printer << "\r\n" << key << "\t:" << val.to_string() ; + }); + InfoL << _mediaInfo._vhost << " " << _mediaInfo._app << " " << _mediaInfo._streamid << (string)printer; +} } /* namespace mediakit */ diff --git a/src/Rtmp/RtmpSession.h b/src/Rtmp/RtmpSession.h index 6e6d97fc..e28ffb80 100644 --- a/src/Rtmp/RtmpSession.h +++ b/src/Rtmp/RtmpSession.h @@ -87,6 +87,7 @@ private: void onNoneReader(MediaSource &sender) override; void setSocketFlags(); string getStreamId(const string &str); + void dumpMetadata(const AMFValue &metedata); private: std::string _strTcUrl; MediaInfo _mediaInfo;