From f1ed0194379f2d21b3c442502b1ed71a879c2e86 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 11 Oct 2019 17:51:46 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=90=88=E5=B9=B6#106?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/MediaSink.cpp | 3 ++- src/MediaFile/HlsMaker.cpp | 17 ++++------------- src/MediaFile/HlsMaker.h | 1 - src/MediaFile/MediaRecorder.h | 24 ++++++++++++------------ 4 files changed, 18 insertions(+), 27 deletions(-) diff --git a/src/Common/MediaSink.cpp b/src/Common/MediaSink.cpp index 960ea7e9..e8dae600 100644 --- a/src/Common/MediaSink.cpp +++ b/src/Common/MediaSink.cpp @@ -61,7 +61,8 @@ void MediaSink::addTrack(const Track::Ptr &track_in) { } void MediaSink::resetTracks() { - _anyTrackUnReady = true; + lock_guard lck(_mtx); + _anyTrackUnReady = false; _allTrackReady = false; _track_map.clear(); _trackReadyCallback.clear(); diff --git a/src/MediaFile/HlsMaker.cpp b/src/MediaFile/HlsMaker.cpp index 1a80fba0..2c1e91ca 100644 --- a/src/MediaFile/HlsMaker.cpp +++ b/src/MediaFile/HlsMaker.cpp @@ -85,13 +85,10 @@ void HlsMaker::inputData(void *data, uint32_t len, uint32_t timestamp) { if (data && len) { addNewFile(timestamp); onWriteFile((char *) data, len); - } - else { - _noData = true; - _stampInc = _ticker.elapsedTime(); - _seg_dur_list.push_back(std::make_tuple(_stampInc, _last_file_name)); - delOldFile(); - makeIndexFile(); + } else { + //调用resetTracks触发,这个时候生成直播hls被中断, + //我们记录为点播,等待下次拉流再恢复为直播。 + makeIndexFile(true); } } @@ -112,12 +109,6 @@ void HlsMaker::delOldFile() { } void HlsMaker::addNewFile(uint32_t) { - //上次分片数据中断结束,重置时间避免中途的等待 - if (_noData) { - _ticker.resetTime(); - _last_file_name = onOpenFile(_file_index++); - _noData = false; - } _stampInc = _ticker.elapsedTime(); if (_file_index == 0 || _stampInc >= _seg_duration * 1000) { _ticker.resetTime(); diff --git a/src/MediaFile/HlsMaker.h b/src/MediaFile/HlsMaker.h index 46731759..3e288b73 100644 --- a/src/MediaFile/HlsMaker.h +++ b/src/MediaFile/HlsMaker.h @@ -92,7 +92,6 @@ protected: protected: uint32_t _seg_number = 0; private: - bool _noData = false; int _stampInc = 0; float _seg_duration = 0; uint64_t _file_index = 0; diff --git a/src/MediaFile/MediaRecorder.h b/src/MediaFile/MediaRecorder.h index 9619e338..c36f8613 100644 --- a/src/MediaFile/MediaRecorder.h +++ b/src/MediaFile/MediaRecorder.h @@ -48,22 +48,22 @@ public: virtual ~MediaRecorder(); /** - * 输入frame - * @param frame - */ + * 输入frame + * @param frame + */ void inputFrame(const Frame::Ptr &frame) override; /** - * 添加track,内部会调用Track的clone方法 - * 只会克隆sps pps这些信息 ,而不会克隆Delegate相关关系 - * @param track - */ - void addTrack(const Track::Ptr & track) override; + * 添加track,内部会调用Track的clone方法 + * 只会克隆sps pps这些信息 ,而不会克隆Delegate相关关系 + * @param track + */ + void addTrack(const Track::Ptr &track) override; - /** - * 重置track - */ - void resetTracks() override; + /** + * 重置track + */ + void resetTracks() override; private: #if defined(ENABLE_HLS) std::shared_ptr _hlsRecorder; From 7f203ce9b7d8249c60c2700b98a79d260708be3e Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 11 Oct 2019 19:01:34 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9B=9E=E5=A4=8Dhls?= =?UTF-8?q?=E7=94=9F=E6=88=90=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MediaFile/HlsMaker.cpp | 14 +++++++++++--- src/MediaFile/HlsMaker.h | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/MediaFile/HlsMaker.cpp b/src/MediaFile/HlsMaker.cpp index 2c1e91ca..a438ad0b 100644 --- a/src/MediaFile/HlsMaker.cpp +++ b/src/MediaFile/HlsMaker.cpp @@ -86,9 +86,11 @@ void HlsMaker::inputData(void *data, uint32_t len, uint32_t timestamp) { addNewFile(timestamp); onWriteFile((char *) data, len); } else { - //调用resetTracks触发,这个时候生成直播hls被中断, - //我们记录为点播,等待下次拉流再恢复为直播。 - makeIndexFile(true); + _noData = true; + _stampInc = _ticker.elapsedTime(); + _seg_dur_list.push_back(std::make_tuple(_stampInc, _last_file_name)); + delOldFile(); + makeIndexFile(); } } @@ -109,6 +111,12 @@ void HlsMaker::delOldFile() { } void HlsMaker::addNewFile(uint32_t) { + //上次分片数据中断结束,重置时间避免中途的等待 + if (_noData) { + _ticker.resetTime(); + _last_file_name = onOpenFile(_file_index++); + _noData = false; + } _stampInc = _ticker.elapsedTime(); if (_file_index == 0 || _stampInc >= _seg_duration * 1000) { _ticker.resetTime(); diff --git a/src/MediaFile/HlsMaker.h b/src/MediaFile/HlsMaker.h index 3e288b73..46731759 100644 --- a/src/MediaFile/HlsMaker.h +++ b/src/MediaFile/HlsMaker.h @@ -92,6 +92,7 @@ protected: protected: uint32_t _seg_number = 0; private: + bool _noData = false; int _stampInc = 0; float _seg_duration = 0; uint64_t _file_index = 0; From c4aaaa11c78c91da62aa3491d7aa5536c616ea24 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 12 Oct 2019 10:29:40 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E4=BC=98=E5=8C=96hls=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/MediaSink.cpp | 21 ++++++------ src/MediaFile/HlsMaker.cpp | 63 ++++++++++++++++++----------------- src/MediaFile/HlsMaker.h | 31 ++++++++++++----- src/MediaFile/HlsMakerImp.cpp | 11 +++--- src/MediaFile/HlsMakerImp.h | 8 +++-- 5 files changed, 77 insertions(+), 57 deletions(-) diff --git a/src/Common/MediaSink.cpp b/src/Common/MediaSink.cpp index e8dae600..4d74e2c9 100644 --- a/src/Common/MediaSink.cpp +++ b/src/Common/MediaSink.cpp @@ -35,16 +35,6 @@ void MediaSink::addTrack(const Track::Ptr &track_in) { //克隆Track,只拷贝其数据,不拷贝其数据转发关系 auto track = track_in->clone(); - weak_ptr weakSelf = shared_from_this(); - track->addDelegate(std::make_shared([weakSelf](const Frame::Ptr &frame){ - auto strongSelf = weakSelf.lock(); - if(!strongSelf){ - return; - } - if(!strongSelf->_anyTrackUnReady){ - strongSelf->onTrackFrame(frame); - } - })); auto codec_id = track->getCodecId(); _track_map[codec_id] = track; auto lam = [this,track](){ @@ -58,6 +48,17 @@ void MediaSink::addTrack(const Track::Ptr &track_in) { _trackReadyCallback[codec_id] = lam; _ticker.resetTime(); } + + weak_ptr weakSelf = shared_from_this(); + track->addDelegate(std::make_shared([weakSelf](const Frame::Ptr &frame){ + auto strongSelf = weakSelf.lock(); + if(!strongSelf){ + return; + } + if(!strongSelf->_anyTrackUnReady){ + strongSelf->onTrackFrame(frame); + } + })); } void MediaSink::resetTracks() { diff --git a/src/MediaFile/HlsMaker.cpp b/src/MediaFile/HlsMaker.cpp index a438ad0b..959fcc36 100644 --- a/src/MediaFile/HlsMaker.cpp +++ b/src/MediaFile/HlsMaker.cpp @@ -43,11 +43,6 @@ void HlsMaker::makeIndexFile(bool eof) { char file_content[1024]; int maxSegmentDuration = 0; - //停止写之后将最后的片段也写进m3u8文件中 - if (eof && _stampInc > 0) { - _seg_dur_list.push_back(std::make_tuple(_stampInc, _last_file_name)); - } - for (auto &tp : _seg_dur_list) { int dur = std::get<0>(tp); if (dur > maxSegmentDuration) { @@ -83,18 +78,16 @@ void HlsMaker::makeIndexFile(bool eof) { void HlsMaker::inputData(void *data, uint32_t len, uint32_t timestamp) { //分片数据中断结束 if (data && len) { - addNewFile(timestamp); - onWriteFile((char *) data, len); + addNewSegment(timestamp); + onWriteSegment((char *) data, len); + //记录上次写入数据时间 + _ticker_last_data.resetTime(); } else { - _noData = true; - _stampInc = _ticker.elapsedTime(); - _seg_dur_list.push_back(std::make_tuple(_stampInc, _last_file_name)); - delOldFile(); - makeIndexFile(); + flushLastSegment(true); } } -void HlsMaker::delOldFile() { +void HlsMaker::delOldSegment() { if(_seg_number == 0){ //如果设置为保留0个切片,则认为是保存为点播 return; @@ -106,28 +99,38 @@ void HlsMaker::delOldFile() { //但是实际保存的切片个数比m3u8所述多两个,这样做的目的是防止播放器在切片删除前能下载完毕 if (_file_index >= _seg_number + 4) { - onDelFile(_file_index - _seg_number - 4); + onDelSegment(_file_index - _seg_number - 4); } } -void HlsMaker::addNewFile(uint32_t) { - //上次分片数据中断结束,重置时间避免中途的等待 - if (_noData) { - _ticker.resetTime(); - _last_file_name = onOpenFile(_file_index++); - _noData = false; +void HlsMaker::addNewSegment(uint32_t) { + if(!_last_file_name.empty() && _ticker.elapsedTime() < _seg_duration * 1000){ + //存在上个切片,并且未到分片时间 + return; } - _stampInc = _ticker.elapsedTime(); - if (_file_index == 0 || _stampInc >= _seg_duration * 1000) { - _ticker.resetTime(); - auto file_name = onOpenFile(_file_index); - if (_file_index++ > 0) { - _seg_dur_list.push_back(std::make_tuple(_stampInc, _last_file_name)); - delOldFile(); - makeIndexFile(); - } - _last_file_name = file_name; + + //关闭并保存上一个切片 + flushLastSegment(); + //新增切片 + _last_file_name = onOpenSegment(_file_index++); + //重置切片计时器 + _ticker.resetTime(); +} + +void HlsMaker::flushLastSegment(bool eof){ + if(_last_file_name.empty()){ + //不存在上个切片 + return; } + //文件创建到最后一次数据写入的时间即为切片长度 + auto seg_dur = _ticker.elapsedTime() - _ticker_last_data.elapsedTime(); + if(seg_dur <= 0){ + seg_dur = 100; + } + _seg_dur_list.push_back(std::make_tuple(seg_dur, _last_file_name)); + delOldSegment(); + makeIndexFile(eof); + _last_file_name.clear(); } }//namespace mediakit \ No newline at end of file diff --git a/src/MediaFile/HlsMaker.h b/src/MediaFile/HlsMaker.h index 46731759..49635a60 100644 --- a/src/MediaFile/HlsMaker.h +++ b/src/MediaFile/HlsMaker.h @@ -60,20 +60,20 @@ protected: * @param index * @return */ - virtual string onOpenFile(int index) = 0; + virtual string onOpenSegment(int index) = 0; /** * 删除ts切片文件回调 * @param index */ - virtual void onDelFile(int index) = 0; + virtual void onDelSegment(int index) = 0; /** * 写ts切片文件回调 * @param data * @param len */ - virtual void onWriteFile(const char *data, int len) = 0; + virtual void onWriteSegment(const char *data, int len) = 0; /** * 写m3u8文件回调 @@ -82,21 +82,34 @@ protected: */ virtual void onWriteHls(const char *data, int len) = 0; + /** + * 关闭上个ts切片并且写入m3u8索引 + * @param eof + */ + void flushLastSegment(bool eof = false); +private: /** * 生成m3u8文件 * @param eof true代表点播 */ void makeIndexFile(bool eof = false); - void delOldFile(); - void addNewFile(uint32_t timestamp); -protected: - uint32_t _seg_number = 0; + + /** + * 删除旧的ts切片 + */ + void delOldSegment(); + + /** + * 添加新的ts切片 + * @param timestamp + */ + void addNewSegment(uint32_t timestamp); private: - bool _noData = false; - int _stampInc = 0; + uint32_t _seg_number = 0; float _seg_duration = 0; uint64_t _file_index = 0; Ticker _ticker; + Ticker _ticker_last_data; string _last_file_name; std::deque > _seg_dur_list; }; diff --git a/src/MediaFile/HlsMakerImp.cpp b/src/MediaFile/HlsMakerImp.cpp index 77763e30..8fa9d4fd 100644 --- a/src/MediaFile/HlsMakerImp.cpp +++ b/src/MediaFile/HlsMakerImp.cpp @@ -40,6 +40,7 @@ HlsMakerImp::HlsMakerImp(const string &m3u8_file, _path_hls = m3u8_file; _params = params; _buf_size = bufSize; + _is_vod = seg_number == 0; _file_buf.reset(new char[bufSize],[](char *ptr){ delete[] ptr; }); @@ -47,14 +48,14 @@ HlsMakerImp::HlsMakerImp(const string &m3u8_file, HlsMakerImp::~HlsMakerImp() { //录制完了 - makeIndexFile(true); - if(_seg_number){ + flushLastSegment(true); + if(!_is_vod){ //hls直播才删除文件 File::delete_file(_path_prefix.data()); } } -string HlsMakerImp::onOpenFile(int index) { +string HlsMakerImp::onOpenSegment(int index) { auto full_path = fullPath(index); _file = makeFile(full_path, true); if(!_file){ @@ -67,12 +68,12 @@ string HlsMakerImp::onOpenFile(int index) { return StrPrinter << index << ".ts" << "?" << _params; } -void HlsMakerImp::onDelFile(int index) { +void HlsMakerImp::onDelSegment(int index) { //WarnL << index; File::delete_file(fullPath(index).data()); } -void HlsMakerImp::onWriteFile(const char *data, int len) { +void HlsMakerImp::onWriteSegment(const char *data, int len) { if (_file) { fwrite(data, len, 1, _file.get()); } diff --git a/src/MediaFile/HlsMakerImp.h b/src/MediaFile/HlsMakerImp.h index d04de216..55637fd8 100644 --- a/src/MediaFile/HlsMakerImp.h +++ b/src/MediaFile/HlsMakerImp.h @@ -44,9 +44,9 @@ public: uint32_t seg_number = 3); virtual ~HlsMakerImp(); protected: - string onOpenFile(int index) override ; - void onDelFile(int index) override; - void onWriteFile(const char *data, int len) override; + string onOpenSegment(int index) override ; + void onDelSegment(int index) override; + void onWriteSegment(const char *data, int len) override; void onWriteHls(const char *data, int len) override; private: string fullPath(int index); @@ -58,6 +58,8 @@ private: string _path_hls; string _params; int _buf_size; + //是否为点播 + bool _is_vod; }; }//namespace mediakit From d2406d239dc17181b05033d0b889488081995831 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 12 Oct 2019 11:22:17 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E5=85=BC=E5=AE=B9=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=A5=87=E6=80=AA=E7=9A=84rtsp=20url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtsp/RtspPlayer.cpp | 37 ++++++++++++++++++++++++------------- src/Rtsp/RtspPlayer.h | 2 +- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/Rtsp/RtspPlayer.cpp b/src/Rtsp/RtspPlayer.cpp index 04d7b184..97003f3b 100644 --- a/src/Rtsp/RtspPlayer.cpp +++ b/src/Rtsp/RtspPlayer.cpp @@ -76,24 +76,35 @@ void RtspPlayer::teardown(){ } void RtspPlayer::play(const string &strUrl){ - auto userAndPwd = FindField(strUrl.data(),"://","@"); Rtsp::eRtpType eType = (Rtsp::eRtpType)(int)(*this)[kRtpType]; - if(userAndPwd.empty()){ - play(strUrl,"","",eType); - return; + auto schema = FindField(strUrl.data(), nullptr,"://"); + bool isSSL = strcasecmp(schema.data(),"rtsps") == 0; + //查找"://"与"/"之间的字符串,用于提取用户名密码 + auto middle_url = FindField(strUrl.data(),"://","/"); + if(middle_url.empty()){ + middle_url = FindField(strUrl.data(),"://", nullptr); } - auto suffix = FindField(strUrl.data(),"@",nullptr); + auto pos = middle_url.rfind('@'); + if(pos == string::npos){ + //并没有用户名密码 + play(isSSL,strUrl,"","",eType); + return; + } + + //包含用户名密码 + auto user_pwd = middle_url.substr(0,pos); + auto suffix = strUrl.substr(schema.size() + 3 + pos + 1); auto url = StrPrinter << "rtsp://" << suffix << endl; - if(userAndPwd.find(":") == string::npos){ - play(url,userAndPwd,"",eType); + if(user_pwd.find(":") == string::npos){ + play(isSSL,url,user_pwd,"",eType); return; } - auto user = FindField(userAndPwd.data(),nullptr,":"); - auto pwd = FindField(userAndPwd.data(),":",nullptr); - play(url,user,pwd,eType); + auto user = FindField(user_pwd.data(),nullptr,":"); + auto pwd = FindField(user_pwd.data(),":",nullptr); + play(isSSL,url,user,pwd,eType); } -//播放,指定是否走rtp over tcp -void RtspPlayer::play(const string &strUrl, const string &strUser, const string &strPwd, Rtsp::eRtpType eType ) { + +void RtspPlayer::play(bool isSSL,const string &strUrl, const string &strUser, const string &strPwd, Rtsp::eRtpType eType ) { DebugL << strUrl << " " << (strUser.size() ? strUser : "null") << " " << (strPwd.size() ? strPwd:"null") << " " @@ -117,7 +128,7 @@ void RtspPlayer::play(const string &strUrl, const string &strUser, const string auto port = atoi(FindField(ip.data(), ":", NULL).data()); if (port <= 0) { //rtsp 默认端口554 - port = 554; + port = isSSL ? 322 : 554; } else { //服务器域名 ip = FindField(ip.data(), NULL, ":"); diff --git a/src/Rtsp/RtspPlayer.h b/src/Rtsp/RtspPlayer.h index 4de652d8..be170953 100644 --- a/src/Rtsp/RtspPlayer.h +++ b/src/Rtsp/RtspPlayer.h @@ -107,7 +107,7 @@ private: int getTrackIndexByInterleaved(int interleaved) const; int getTrackIndexByTrackType(TrackType trackType) const; - void play(const string &strUrl, const string &strUser, const string &strPwd, Rtsp::eRtpType eType); + void play(bool isSSL,const string &strUrl, const string &strUser, const string &strPwd, Rtsp::eRtpType eType); void handleResSETUP(const Parser &parser, unsigned int uiTrackIndex); void handleResDESCRIBE(const Parser &parser); bool handleAuthenticationFailure(const string &wwwAuthenticateParamsStr); From adb808bbb45636488f54e74e66baf8de778f4eb2 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 12 Oct 2019 18:35:26 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/config.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/config.ini b/conf/config.ini index 15d8c7ff..28112f69 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -167,6 +167,8 @@ keepAliveSecond=15 port=554 #rtsps服务器监听地址 sslport=322 +#在接收rtsp推流时,是否重新生成时间戳(很多推流器的时间戳着实很烂) +modifyStamp=1 [shell] #调试telnet服务器接受最大bufffer大小 From 4642bbeb4cca35fa5f75183ca66e08144d7c39c9 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 12 Oct 2019 22:02:50 +0800 Subject: [PATCH 6/8] =?UTF-8?q?rtsp=E6=8E=A8=E6=B5=81=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E4=B8=8D=E8=A6=86=E7=9B=96=E6=97=B6=E9=97=B4=E6=88=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3rdpart/ZLToolKit | 2 +- src/Common/config.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/3rdpart/ZLToolKit b/3rdpart/ZLToolKit index 2970df35..665f53b6 160000 --- a/3rdpart/ZLToolKit +++ b/3rdpart/ZLToolKit @@ -1 +1 @@ -Subproject commit 2970df35c5c8c48013f91c818845c5c90914ea57 +Subproject commit 665f53b6a4385e2312d3bf09aa305d7e3bf079e6 diff --git a/src/Common/config.cpp b/src/Common/config.cpp index a2a6ed28..1f6763ac 100644 --- a/src/Common/config.cpp +++ b/src/Common/config.cpp @@ -177,7 +177,7 @@ onceToken token([](){ mINI::Instance()[kHandshakeSecond] = 15; mINI::Instance()[kKeepAliveSecond] = 15; mINI::Instance()[kDirectProxy] = 1; - mINI::Instance()[kModifyStamp] = true; + mINI::Instance()[kModifyStamp] = false; },nullptr); } //namespace Rtsp From 08386b958cd40c2aee2cdd13aea7bf63b3fdb41b Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sat, 12 Oct 2019 22:44:16 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E8=A6=86=E7=9B=96=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=88=B3=E9=9C=80=E8=A6=81=E6=98=8E=E7=A1=AE=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=EF=BC=8C=E9=98=B2=E6=AD=A2=E8=AF=AF=E5=88=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MediaFile/Stamp.cpp | 11 ++++------- src/MediaFile/Stamp.h | 3 ++- src/Rtmp/RtmpSession.cpp | 2 +- src/Rtsp/RtspSession.cpp | 2 +- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/MediaFile/Stamp.cpp b/src/MediaFile/Stamp.cpp index e053c122..ab77a1bf 100644 --- a/src/MediaFile/Stamp.cpp +++ b/src/MediaFile/Stamp.cpp @@ -51,12 +51,9 @@ void DeltaStamp::setPlayBack(bool playback) { _playback = playback; } -void Stamp::revise(int64_t dts, int64_t pts, int64_t &dts_out, int64_t &pts_out) { - if(!dts && !pts){ - //没有时间戳,我们生成时间戳 - pts = dts = _ticker.elapsedTime(); - }else if(!pts){ - //只是没有播放时间戳,使其赋值为解码时间戳 +void Stamp::revise(int64_t dts, int64_t pts, int64_t &dts_out, int64_t &pts_out,bool modifyStamp) { + if(!pts){ + //没有播放时间戳,使其赋值为解码时间戳 pts = dts; } @@ -64,7 +61,7 @@ void Stamp::revise(int64_t dts, int64_t pts, int64_t &dts_out, int64_t &pts_out) int pts_dts_diff = pts - dts; //相对时间戳 - _relativeStamp += deltaStamp(dts); + _relativeStamp += deltaStamp(modifyStamp ? _ticker.elapsedTime() : dts); dts_out = _relativeStamp; //////////////以下是播放时间戳的计算////////////////// diff --git a/src/MediaFile/Stamp.h b/src/MediaFile/Stamp.h index 23a427f3..82458fda 100644 --- a/src/MediaFile/Stamp.h +++ b/src/MediaFile/Stamp.h @@ -67,8 +67,9 @@ public: * @param pts 输入pts,如果为0则等于dts * @param dts_out 输出dts * @param pts_out 输出pts + * @param modifyStamp 是否用系统时间戳覆盖 */ - void revise(int64_t dts, int64_t pts, int64_t &dts_out, int64_t &pts_out); + void revise(int64_t dts, int64_t pts, int64_t &dts_out, int64_t &pts_out,bool modifyStamp = false); /** * 再设置相对时间戳,用于seek用 diff --git a/src/Rtmp/RtmpSession.cpp b/src/Rtmp/RtmpSession.cpp index 3b4a1663..2cd38528 100644 --- a/src/Rtmp/RtmpSession.cpp +++ b/src/Rtmp/RtmpSession.cpp @@ -486,7 +486,7 @@ void RtmpSession::onRtmpChunk(RtmpPacket &chunkData) { GET_CONFIG(bool,rtmp_modify_stamp,Rtmp::kModifyStamp); if(rtmp_modify_stamp){ int64_t dts_out; - _stamp[chunkData.typeId % 2].revise(0, 0, dts_out, dts_out); + _stamp[chunkData.typeId % 2].revise(0, 0, dts_out, dts_out, true); chunkData.timeStamp = dts_out; } if(!_metadata_got && !chunkData.isCfgFrame()){ diff --git a/src/Rtsp/RtspSession.cpp b/src/Rtsp/RtspSession.cpp index aa10aa84..efd0dc7e 100644 --- a/src/Rtsp/RtspSession.cpp +++ b/src/Rtsp/RtspSession.cpp @@ -932,7 +932,7 @@ void RtspSession::onRtpSorted(const RtpPacket::Ptr &rtppt, int trackidx) { GET_CONFIG(bool,modify_stamp,Rtsp::kModifyStamp); if(modify_stamp){ int64_t dts_out; - _stamp[trackidx].revise(0, 0, dts_out, dts_out); + _stamp[trackidx].revise(0, 0, dts_out, dts_out, true); rtppt->timeStamp = dts_out; } _pushSrc->onWrite(rtppt, false); From a68368a7f3380dd35547ba6df8a018baeeab973a Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Mon, 14 Oct 2019 10:15:46 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D#109?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtsp/RtspPlayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Rtsp/RtspPlayer.cpp b/src/Rtsp/RtspPlayer.cpp index 97003f3b..bd3b83b9 100644 --- a/src/Rtsp/RtspPlayer.cpp +++ b/src/Rtsp/RtspPlayer.cpp @@ -123,7 +123,7 @@ void RtspPlayer::play(bool isSSL,const string &strUrl, const string &strUser, co auto ip = FindField(strUrl.data(), "://", "/"); if (!ip.size()) { - ip = FindField(strUrl.data(), "://", NULL); + ip = split(FindField(strUrl.data(), "://", NULL),"?")[0]; } auto port = atoi(FindField(ip.data(), ":", NULL).data()); if (port <= 0) {