diff --git a/server/Process.cpp b/server/Process.cpp index fab4c515..9a75ee58 100644 --- a/server/Process.cpp +++ b/server/Process.cpp @@ -108,10 +108,17 @@ void Process::run(const string &cmd, const string &log_file_tmp) { } fprintf(stderr, "\r\n\r\n#### pid=%d,cmd=%s #####\r\n\r\n", getpid(), cmd.data()); +#ifndef ANDROID //关闭父进程继承的fd for (int i = 3; i < getdtablesize(); i++) { ::close(i); } +#else + //关闭父进程继承的fd + for (int i = 3; i < 1024; i++) { + ::close(i); + } +#endif auto params = split(cmd, " "); // memory leak in child process, it's ok. diff --git a/src/Extension/G711.h b/src/Extension/G711.h index bcf5f677..550acbc4 100644 --- a/src/Extension/G711.h +++ b/src/Extension/G711.h @@ -22,7 +22,7 @@ namespace mediakit{ class G711Track : public AudioTrackImp{ public: using Ptr = std::shared_ptr; - G711Track(CodecId codecId,int sample_rate, int channels, int sample_bit) : AudioTrackImp(codecId,sample_rate,channels,sample_bit){} + G711Track(CodecId codecId, int sample_rate, int channels, int sample_bit) : AudioTrackImp(codecId, 8000, 1, 16) {} private: Sdp::Ptr getSdp() override; diff --git a/src/Rtmp/RtmpSession.cpp b/src/Rtmp/RtmpSession.cpp index 61c844a1..7187226d 100644 --- a/src/Rtmp/RtmpSession.cpp +++ b/src/Rtmp/RtmpSession.cpp @@ -415,17 +415,11 @@ void RtmpSession::onCmd_pause(AMFDecoder &dec) { } void RtmpSession::setMetaData(AMFDecoder &dec) { - if (!_publisher_src) { - throw std::runtime_error("not a publisher"); - } std::string type = dec.load(); if (type != "onMetaData") { throw std::runtime_error("can only set metadata"); } - auto metadata = dec.load(); -// dumpMetadata(metadata); - _publisher_src->setMetaData(metadata); - _set_meta_data = true; + _publisher_metadata = dec.load(); } void RtmpSession::onProcessCmd(AMFDecoder &dec) { @@ -478,7 +472,8 @@ void RtmpSession::onRtmpChunk(RtmpPacket::Ptr packet) { case MSG_AUDIO: case MSG_VIDEO: { if (!_publisher_src) { - throw std::runtime_error("Not a rtmp publisher!"); + WarnL << "Not a rtmp publisher!"; + return; } GET_CONFIG(bool, rtmp_modify_stamp, Rtmp::kModifyStamp); if (rtmp_modify_stamp) { @@ -487,9 +482,9 @@ void RtmpSession::onRtmpChunk(RtmpPacket::Ptr packet) { chunk_data.time_stamp = (uint32_t)dts_out; } - if (!_set_meta_data && !chunk_data.isCfgFrame()) { + if (!_set_meta_data) { _set_meta_data = true; - _publisher_src->setMetaData(TitleMeta().getMetadata()); + _publisher_src->setMetaData(_publisher_metadata ? _publisher_metadata : TitleMeta().getMetadata()); } _publisher_src->onWrite(std::move(packet)); break; diff --git a/src/Rtmp/RtmpSession.h b/src/Rtmp/RtmpSession.h index 0939ee80..02f2d623 100644 --- a/src/Rtmp/RtmpSession.h +++ b/src/Rtmp/RtmpSession.h @@ -98,8 +98,8 @@ private: //数据接收超时计时器 Ticker _ticker; MediaInfo _media_info; - std::weak_ptr _player_src; + AMFValue _publisher_metadata; std::shared_ptr _publisher_src; RtmpMediaSource::RingType::RingReader::Ptr _ring_reader; }; diff --git a/src/Rtp/RtpProcess.cpp b/src/Rtp/RtpProcess.cpp index 5c888a19..a50a8ecb 100644 --- a/src/Rtp/RtpProcess.cpp +++ b/src/Rtp/RtpProcess.cpp @@ -145,6 +145,9 @@ bool RtpProcess::alive() { void RtpProcess::setStopCheckRtp(bool is_check){ _stop_rtp_check = is_check; + if (!is_check) { + _last_frame_time.resetTime(); + } } void RtpProcess::onDetach() { diff --git a/webrtc/Sdp.cpp b/webrtc/Sdp.cpp index 1fe3f987..010aa5af 100644 --- a/webrtc/Sdp.cpp +++ b/webrtc/Sdp.cpp @@ -1150,11 +1150,9 @@ void RtcConfigure::RtcTrackConfigure::setDefaultSetting(TrackType type){ rtcp_mux = true; rtcp_rsize = false; group_bundle = true; - unified_plan = false; support_rtx = true; support_red = false; support_ulpfec = false; - support_simulcast = false; ice_lite = true; ice_trickle = true; ice_renomination = false; @@ -1226,26 +1224,19 @@ void RtcConfigure::addCandidate(const SdpAttrCandidate &candidate, TrackType typ } } -shared_ptr RtcConfigure::createOffer(){ - shared_ptr ret = std::make_shared(); - ret->version = 0; - ret->origin.parse("- 0 0 IN IP4 0.0.0.0"); - ret->session_name = "zlmediakit_webrtc_session"; - ret->session_info = "zlmediakit_webrtc_session"; - ret->connection.parse("IN IP4 0.0.0.0"); - ret->msid_semantic.parse("WMS *"); - return nullptr; -} - shared_ptr RtcConfigure::createAnswer(const RtcSession &offer){ shared_ptr ret = std::make_shared(); ret->version = offer.version; + //todo 此处设置会话id与会话地址,貌似没什么作用 ret->origin = offer.origin; ret->session_name = offer.session_name; ret->msid_semantic = offer.msid_semantic; matchMedia(ret, TrackAudio, offer.media, audio); matchMedia(ret, TrackVideo, offer.media, video); matchMedia(ret, TrackApplication, offer.media, application); + if (ret->media.empty()) { + throw std::invalid_argument("生成的answer sdp中媒体个数为0"); + } return ret; } @@ -1259,7 +1250,7 @@ void RtcConfigure::matchMedia(shared_ptr &ret, TrackType type, const continue; } if (offer_media.ice_lite && configure.ice_lite) { - WarnL << "offer sdp开启了ice_lite模式,但是answer sdp配置为不支持"; + WarnL << "answer sdp配置为ice_lite模式,与offer sdp中的ice_lite模式冲突"; continue; } const RtcCodecPlan *offer_plan_ptr = nullptr; @@ -1283,16 +1274,21 @@ void RtcConfigure::matchMedia(shared_ptr &ret, TrackType type, const answer_media.type = offer_media.type; answer_media.mid = offer_media.mid; answer_media.proto = offer_media.proto; + //todo(此处设置rtp端口,貌似没什么作用) answer_media.port = offer_media.port; + //todo(此处设置rtp的ip地址,貌似没什么作用) + answer_media.addr = offer_media.addr; + //todo(此处设置rtcp地址,貌似没什么作用) + answer_media.rtcp_addr = offer_media.rtcp_addr; answer_media.rtcp_mux = offer_media.rtcp_mux && configure.rtcp_mux; answer_media.rtcp_rsize = offer_media.rtcp_rsize && configure.rtcp_rsize; - answer_media.rtcp_addr = offer_media.rtcp_addr; answer_media.ice_trickle = offer_media.ice_trickle && configure.ice_trickle; answer_media.ice_renomination = offer_media.ice_renomination && configure.ice_renomination; answer_media.ice_ufrag = configure.ice_ufrag; answer_media.ice_pwd = configure.ice_pwd; answer_media.fingerprint = configure.fingerprint; answer_media.ice_lite = configure.ice_lite; + answer_media.candidate = configure.candidate; switch (offer_media.role) { case DtlsRole::actpass : case DtlsRole::active : { @@ -1332,7 +1328,11 @@ void RtcConfigure::matchMedia(shared_ptr &ret, TrackType type, const } default: continue; } + + //添加媒体plan answer_media.plan.emplace_back(*offer_plan_ptr); + + //添加rtx,red,ulpfec plan if (configure.support_red || configure.support_rtx || configure.support_ulpfec) { for (auto &plan : offer_media.plan) { if (!strcasecmp(plan.codec.data(), "rtx")) { @@ -1382,6 +1382,8 @@ void RtcConfigure::matchMedia(shared_ptr &ret, TrackType type, const offer_rtcp_fb.emplace_back(fp); } } + + //修改为我们支持的rtcp-fb类型 answer_media.plan[0].rtcp_fb.swap(offer_rtcp_fb); ret->media.emplace_back(answer_media); return; diff --git a/webrtc/Sdp.h b/webrtc/Sdp.h index 895610ff..4d81c8fb 100644 --- a/webrtc/Sdp.h +++ b/webrtc/Sdp.h @@ -599,7 +599,6 @@ public: RtcSSRC rtx_ssrc; //////// simulcast //////// - bool simulcast{false}; RtcSSRC rtp_ssrc_low; RtcSSRC rtp_ssrc_mid; RtcSSRC rtp_ssrc_high; @@ -663,12 +662,9 @@ public: bool rtcp_mux; bool rtcp_rsize; bool group_bundle; - bool unified_plan; bool support_rtx; bool support_red; bool support_ulpfec; - - bool support_simulcast; bool ice_lite; bool ice_trickle; bool ice_renomination; @@ -696,7 +692,6 @@ public: const SdpAttrFingerprint &fingerprint); void addCandidate(const SdpAttrCandidate &candidate, TrackType type = TrackInvalid); - shared_ptr createOffer(); shared_ptr createAnswer(const RtcSession &offer); private: diff --git a/webrtc/WebRtcTransport.cpp b/webrtc/WebRtcTransport.cpp index e82029f9..9468e3d1 100644 --- a/webrtc/WebRtcTransport.cpp +++ b/webrtc/WebRtcTransport.cpp @@ -88,6 +88,17 @@ std::string WebRtcTransport::getAnswerSdp(const string &offer){ RtcConfigure configure; configure.setDefaultSetting(ice_server_->GetUsernameFragment(), ice_server_->GetPassword(), RtpDirection::recvonly, fingerprint); + + SdpAttrCandidate candidate; + candidate.foundation = "udpcandidate"; + candidate.component = 1; + candidate.transport = "udp"; + candidate.priority = getSSRC(); + candidate.address = getIP(); + candidate.port = getPort(); + candidate.type = "host"; + configure.addCandidate(candidate); + _answer_sdp = configure.createAnswer(*_offer_sdp); //设置远端dtls签名 @@ -104,23 +115,6 @@ std::string WebRtcTransport::getAnswerSdp(const string &offer){ throw std::invalid_argument("支持group BUNDLE模式"); } - SdpAttrCandidate candidate; - candidate.foundation = "udpcandidate"; - candidate.component = 1; - candidate.transport = "udp"; - candidate.priority = getSSRC(); - candidate.address = getIP(); - candidate.port = getPort(); - candidate.type = "host"; - for (auto &m :_answer_sdp->media) { - m.candidate.emplace_back(candidate); - m.port = getPort(); - m.rtcp_addr.address = getIP(); - m.rtcp_addr.port = getPort(); - m.addr.address = getIP(); - } - _answer_sdp->connection.address = getIP(); - auto str = _answer_sdp->toString(); InfoL << "\r\n" << str; return str; @@ -156,12 +150,10 @@ void WebRtcTransport::OnInputDataPacket(char *buf, size_t len, RTC::TransportTup } if (is_rtp(buf)) { RtpHeader *header = (RtpHeader *) buf; - InfoL << "rtp:" << header->dumpString(len); return; } if (is_rtcp(buf)) { RtcpHeader *header = (RtcpHeader *) buf; -// InfoL << "rtcp:" << header->dumpString(); return; } }