diff --git a/rtp.go b/rtp.go index 54ba1c3..bd66fa0 100644 --- a/rtp.go +++ b/rtp.go @@ -1,7 +1,6 @@ package engine import ( - "github.com/Monibuca/utils/v3" "github.com/Monibuca/utils/v3/codec" "github.com/pion/rtp" ) @@ -50,17 +49,23 @@ func (v *RTPVideo) push(payload []byte) { } var p *VideoPack t0 := v.Timestamp + absTs := uint32(0) tmpVT := v.Stream.NewVideoTrack(0) tmpVT.ExtraData = v.ExtraData tmpVT.CodecID = v.CodecID start := tmpVT.Ring - tmpVT.PushNalu(0, 0, v.Payload) + tmpVT.PushNalu(absTs, 0, v.Payload) v.Push = func(payload []byte) { if err := v.Unmarshal(payload); err != nil { return } - t1 := (v.Timestamp - t0) / 90 - utils.Println("video:", t1) + if t0 > v.Timestamp && t0-v.Timestamp > 100000 { + absTs += (v.Timestamp) + } else { + absTs += (v.Timestamp - t0) + } + t0 = v.Timestamp + t1 := absTs / 90 tmpVT.PushNalu(t1, 0, v.Payload) end := tmpVT.Prev() if start != end { @@ -156,14 +161,21 @@ func (v *RTPAudio) push(payload []byte) { return } t0 := v.Timestamp + absTs := uint32(0) switch at.CodecID { case 10: + tb := at.SoundRate v.Push = func(payload []byte) { if err := v.Unmarshal(payload); err != nil { return } - t1 := (v.Timestamp - t0) / 90 - utils.Println("audio:", t1) + if v.Timestamp >= t0 { + absTs += (v.Timestamp - t0) + } else { + absTs += (v.Timestamp) + } + t0 = v.Timestamp + t1 := absTs * 10 / uint32(tb/100) for _, payload = range codec.ParseRTPAAC(v.Payload) { at.PushRaw(t1, payload) } diff --git a/subscriber.go b/subscriber.go index 6c7b41f..8a30418 100644 --- a/subscriber.go +++ b/subscriber.go @@ -95,7 +95,6 @@ func (s *Subscriber) Play(at *AudioTrack, vt *VideoTrack) { case <-streamExit: return default: - utils.Println(vp.Timestamp, ap.Timestamp, ap.Timestamp > vp.Timestamp) if ap.Timestamp > vp.Timestamp || ap.Timestamp == 0 { s.OnVideo(vp.Copy(vst)) vr.MoveNext() diff --git a/video_track.go b/video_track.go index 0de32b0..9b6bb2a 100644 --- a/video_track.go +++ b/video_track.go @@ -562,7 +562,6 @@ func (vt *VideoTrack) Play(onVideo func(VideoPack), exit1, exit2 <-chan struct{} vr := vt.SubRing(vt.IDRing) //从关键帧开始读取,首屏秒开 vp := vr.Read().(*VideoPack) for startTimestamp := vp.Timestamp; vt.Goon(); vp = vr.Read().(*VideoPack) { - utils.Println(vp.Timestamp) select { case <-exit1: return