From 4858dc74eff6c5e9c48c28833d00acbc65cd7261 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Wed, 24 Oct 2018 10:03:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Player/Track.h | 2 +- src/Rtsp/RtpParser.cpp | 27 ++++++++++----------------- src/Rtsp/RtpParser.h | 18 ++++++++++++++---- src/Rtsp/RtspSdp.h | 10 ++++------ 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/Player/Track.h b/src/Player/Track.h index daf48b14..6a16be1f 100644 --- a/src/Player/Track.h +++ b/src/Player/Track.h @@ -156,7 +156,7 @@ public: if(_sps.empty() || _pps.empty()){ return TrackInvalid; } - return TrackAudio; + return TrackVideo; } diff --git a/src/Rtsp/RtpParser.cpp b/src/Rtsp/RtpParser.cpp index 6d0b4b0b..88664873 100644 --- a/src/Rtsp/RtpParser.cpp +++ b/src/Rtsp/RtpParser.cpp @@ -73,28 +73,21 @@ RtpParser::RtpParser(const string& sdp) { bool RtpParser::inputRtp(const RtpPacket::Ptr & rtp) { switch (rtp->getTrackType()) { - case TrackVideo: - return inputVideo(rtp); - case TrackAudio: - return inputAudio(rtp); + case TrackVideo:{ + if(_videoRtpDecoder){ + return _videoRtpDecoder->inputRtp(rtp, true); + } + return false; + } + case TrackAudio:{ + _audioRtpDecoder->inputRtp(rtp, false); + return false; + } default: return false; } } -inline bool RtpParser::inputVideo(const RtpPacket::Ptr &rtp) { - if(_videoRtpDecoder){ - return _videoRtpDecoder->inputRtp(rtp, true); - } - return false; -} - -inline bool RtpParser::inputAudio(const RtpPacket::Ptr &rtp) { - if(_audioRtpDecoder){ - return _audioRtpDecoder->inputRtp(rtp, false); - } - return false; -} inline void RtpParser::onGetAudioTrack(const RtspTrack& audio) { //生成Track对象 diff --git a/src/Rtsp/RtpParser.h b/src/Rtsp/RtpParser.h index 9bbbcb28..2028ed12 100644 --- a/src/Rtsp/RtpParser.h +++ b/src/Rtsp/RtpParser.h @@ -54,17 +54,27 @@ public: return m_fDuration; } + /** + * 返回是否完成初始化完毕 + * 由于有些rtsp的sdp不包含sps pps信息 + * 所以要等待接收到到sps的rtp包后才能完成 + * @return + */ bool isInited() const override{ - return true; + bool ret = true; + if(ret && _audioTrack){ + ret = _audioTrack->getTrackType() != TrackInvalid; + } + if(ret && _videoTrack){ + ret = _videoTrack->getTrackType() != TrackInvalid; + } + return ret; } vector getTracks() const override; private: inline void onGetAudioTrack(const RtspTrack &audio); inline void onGetVideoTrack(const RtspTrack &video); - //返回值:true 代表是i帧第一个rtp包 - inline bool inputVideo(const RtpPacket::Ptr &rtp); - inline bool inputAudio(const RtpPacket::Ptr &rtp); private: float m_fDuration = 0; AudioTrack::Ptr _audioTrack; diff --git a/src/Rtsp/RtspSdp.h b/src/Rtsp/RtspSdp.h index 6032d69b..c536e2ba 100644 --- a/src/Rtsp/RtspSdp.h +++ b/src/Rtsp/RtspSdp.h @@ -166,13 +166,13 @@ public: /** * - * @param sps 264 sps,带0x00000001头 - * @param pps 264 pps,带0x00000001头 + * @param sps 264 sps,不带0x00000001头 + * @param pps 264 pps,不带0x00000001头 * @param playload_type rtp playload type 默认96 * @param bitrate 比特率 */ - H264Sdp(const string &sps, - const string &pps, + H264Sdp(const string &strSPS, + const string &strPPS, int playload_type = 96, int bitrate = 4000) : Sdp(90000,playload_type) { //视频通道 @@ -183,8 +183,6 @@ public: char strTemp[100]; int profile_level_id = 0; - string strSPS = sps.substr(4); - string strPPS = pps.substr(4); if (strSPS.length() >= 4) { // sanity check profile_level_id = (strSPS[1] << 16) | (strSPS[2] << 8) | strSPS[3]; // profile_idc|constraint_setN_flag|level_idc }