mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
解决GB28181推流无ntp时间戳导致的问题
This commit is contained in:
parent
ce41fa268e
commit
41c09757a7
@ -27,10 +27,13 @@ static inline bool checkTS(const uint8_t *packet, size_t bytes){
|
|||||||
class RtpReceiverImp : public RtpTrackImp {
|
class RtpReceiverImp : public RtpTrackImp {
|
||||||
public:
|
public:
|
||||||
using Ptr = std::shared_ptr<RtpReceiverImp>;
|
using Ptr = std::shared_ptr<RtpReceiverImp>;
|
||||||
|
|
||||||
RtpReceiverImp(int sample_rate, RtpTrackImp::OnSorted cb, RtpTrackImp::BeforeSorted cb_before = nullptr) {
|
RtpReceiverImp(int sample_rate, RtpTrackImp::OnSorted cb, RtpTrackImp::BeforeSorted cb_before = nullptr) {
|
||||||
_sample_rate = sample_rate;
|
_sample_rate = sample_rate;
|
||||||
setOnSorted(std::move(cb));
|
setOnSorted(std::move(cb));
|
||||||
setBeforeSorted(std::move(cb_before));
|
setBeforeSorted(std::move(cb_before));
|
||||||
|
//GB28181推流不支持ntp时间戳
|
||||||
|
setNtpStamp(0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
~RtpReceiverImp() override = default;
|
~RtpReceiverImp() override = default;
|
||||||
|
@ -89,14 +89,20 @@ RtpPacket::Ptr RtpTrack::inputRtp(TrackType type, int sample_rate, uint8_t *ptr,
|
|||||||
data[3] = len & 0xFF;
|
data[3] = len & 0xFF;
|
||||||
//拷贝rtp
|
//拷贝rtp
|
||||||
memcpy(&data[4], ptr, len);
|
memcpy(&data[4], ptr, len);
|
||||||
|
if (_disable_ntp) {
|
||||||
|
//不支持ntp时间戳,例如国标推流,那么直接使用rtp时间戳
|
||||||
|
rtp->ntp_stamp = rtp->getStamp() * uint64_t(1000) / sample_rate;
|
||||||
|
} else {
|
||||||
//设置ntp时间戳
|
//设置ntp时间戳
|
||||||
rtp->ntp_stamp = _ntp_stamp.getNtpStamp(ntohl(rtp->getHeader()->stamp), sample_rate);
|
rtp->ntp_stamp = _ntp_stamp.getNtpStamp(ntohl(rtp->getHeader()->stamp), sample_rate);
|
||||||
|
}
|
||||||
onBeforeRtpSorted(rtp);
|
onBeforeRtpSorted(rtp);
|
||||||
sortPacket(rtp->getSeq(), rtp);
|
sortPacket(rtp->getSeq(), rtp);
|
||||||
return rtp;
|
return rtp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RtpTrack::setNtpStamp(uint32_t rtp_stamp, uint32_t sample_rate, uint64_t ntp_stamp_ms) {
|
void RtpTrack::setNtpStamp(uint32_t rtp_stamp, uint32_t sample_rate, uint64_t ntp_stamp_ms) {
|
||||||
|
_disable_ntp = rtp_stamp == 0 && sample_rate == 0 && ntp_stamp_ms == 0;
|
||||||
_ntp_stamp.setNtpStamp(rtp_stamp, sample_rate, ntp_stamp_ms);
|
_ntp_stamp.setNtpStamp(rtp_stamp, sample_rate, ntp_stamp_ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,6 +183,7 @@ protected:
|
|||||||
virtual void onBeforeRtpSorted(const RtpPacket::Ptr &rtp) {}
|
virtual void onBeforeRtpSorted(const RtpPacket::Ptr &rtp) {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool _disable_ntp = false;
|
||||||
uint32_t _ssrc = 0;
|
uint32_t _ssrc = 0;
|
||||||
Ticker _ssrc_alive;
|
Ticker _ssrc_alive;
|
||||||
NtpStamp _ntp_stamp;
|
NtpStamp _ntp_stamp;
|
||||||
@ -241,6 +242,7 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置ntp时间戳,在收到rtcp sender report时设置
|
* 设置ntp时间戳,在收到rtcp sender report时设置
|
||||||
|
* 如果rtp_stamp/sample_rate/ntp_stamp_ms都为0,那么采用rtp时间戳为ntp时间戳
|
||||||
* @param index track下标索引
|
* @param index track下标索引
|
||||||
* @param rtp_stamp rtp时间戳
|
* @param rtp_stamp rtp时间戳
|
||||||
* @param sample_rate 时间戳采样率
|
* @param sample_rate 时间戳采样率
|
||||||
|
Loading…
Reference in New Issue
Block a user