mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-07-06 11:38:11 +08:00
rtp使用ntp时间戳作为时间戳,用于实现rtsp音视频同步
This commit is contained in:
@@ -13,6 +13,36 @@
|
||||
|
||||
namespace mediakit {
|
||||
|
||||
class RingDelegateHelper : public RingDelegate<RtpPacket::Ptr> {
|
||||
public:
|
||||
RingDelegateHelper(RtspMuxer *delegate) {
|
||||
_delegate = delegate;
|
||||
}
|
||||
|
||||
void onWrite(RtpPacket::Ptr in, bool is_key) override {
|
||||
_delegate->onRtp(std::move(in), is_key);
|
||||
}
|
||||
|
||||
private:
|
||||
RtspMuxer *_delegate;
|
||||
};
|
||||
|
||||
void RtspMuxer::onRtp(RtpPacket::Ptr in, bool is_key) {
|
||||
if (_rtp_stamp[in->type] != in->getHeader()->stamp) {
|
||||
//rtp时间戳变化才计算ntp,节省cpu资源
|
||||
int64_t stamp_ms = in->getStamp() * uint64_t(1000) / in->sample_rate;
|
||||
int64_t stamp_ms_inc;
|
||||
//求rtp时间戳增量
|
||||
_stamp[in->type].revise(stamp_ms, stamp_ms, stamp_ms_inc, stamp_ms_inc);
|
||||
_rtp_stamp[in->type] = in->getHeader()->stamp;
|
||||
_ntp_stamp[in->type] = stamp_ms_inc + _ntp_stamp_start;
|
||||
}
|
||||
|
||||
//rtp拦截入口,此处统一赋值ntp
|
||||
in->ntp_stamp = _ntp_stamp[in->type];
|
||||
_rtpRing->write(std::move(in), is_key);
|
||||
}
|
||||
|
||||
RtspMuxer::RtspMuxer(const TitleSdp::Ptr &title){
|
||||
if(!title){
|
||||
_sdp = std::make_shared<TitleSdp>()->getSdp();
|
||||
@@ -20,6 +50,9 @@ RtspMuxer::RtspMuxer(const TitleSdp::Ptr &title){
|
||||
_sdp = title->getSdp();
|
||||
}
|
||||
_rtpRing = std::make_shared<RtpRing::RingType>();
|
||||
_rtpInterceptor = std::make_shared<RtpRing::RingType>();
|
||||
_rtpInterceptor->setDelegate(std::make_shared<RingDelegateHelper>(this));
|
||||
_ntp_stamp_start = getCurrentMillisecond(true);
|
||||
}
|
||||
|
||||
void RtspMuxer::addTrack(const Track::Ptr &track) {
|
||||
@@ -36,15 +69,23 @@ void RtspMuxer::addTrack(const Track::Ptr &track) {
|
||||
}
|
||||
|
||||
//设置rtp输出环形缓存
|
||||
encoder->setRtpRing(_rtpRing);
|
||||
encoder->setRtpRing(_rtpInterceptor);
|
||||
|
||||
//添加其sdp
|
||||
_sdp.append(sdp->getSdp());
|
||||
trySyncTrack();
|
||||
}
|
||||
|
||||
void RtspMuxer::trySyncTrack() {
|
||||
if (_encoder[TrackAudio] && _encoder[TrackVideo]) {
|
||||
//音频时间戳同步于视频,因为音频时间戳被修改后不影响播放
|
||||
_stamp[TrackAudio].syncTo(_stamp[TrackVideo]);
|
||||
}
|
||||
}
|
||||
|
||||
void RtspMuxer::inputFrame(const Frame::Ptr &frame) {
|
||||
auto &encoder = _encoder[frame->getTrackType()];
|
||||
if(encoder){
|
||||
if (encoder) {
|
||||
encoder->inputFrame(frame);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user