diff --git a/main.go b/main.go index e86cc98..26ebb17 100644 --- a/main.go +++ b/main.go @@ -17,7 +17,7 @@ import ( . "github.com/logrusorgru/aurora" ) -const Version = "3.1.2" +const Version = "3.1.4" var ( config = &struct { diff --git a/rtp.go b/rtp.go index 8c00533..6034895 100644 --- a/rtp.go +++ b/rtp.go @@ -49,52 +49,60 @@ func (v *RTPVideo) push(payload []byte) { if err := v.Unmarshal(payload); err != nil { return } - t := v.Timestamp / 90 - if t < vt.Prev().Value.(*RingItem).Value.(*VideoPack).Timestamp { - if vt.WaitIDR.Err() == nil { + t0 := v.Timestamp + v.Push = func(payload []byte) { + if err := v.Unmarshal(payload); err != nil { return } - var ts TSSlice - //有B帧 - tmpVT := v.Stream.NewVideoTrack(0) - tmpVT.ExtraData = v.ExtraData - tmpVT.CodecID = v.CodecID - tmpVT.revIDR = func() { - l := ts.Len() - sort.Sort(ts) - start := tmpVT.Move(-l) - for i := 0; i < l; i++ { - vp := start.Value.(*RingItem).Value.(*VideoPack) - pack := vt.current() - pack.IDR = vp.IDR - pack.Timestamp = ts[i] - pack.CompositionTime = vp.Timestamp - ts[i] - pack.NALUs = vp.NALUs - vt.push(pack) - start = start.Next() - } - ts = nil - } - v.Push = func(payload []byte) { - if err := v.Unmarshal(payload); err != nil { + t1 := (v.Timestamp - t0)/90 + if t1 < vt.Prev().Value.(*RingItem).Value.(*VideoPack).Timestamp { + if vt.WaitIDR.Err() == nil { return } - r := tmpVT.Ring - t := v.Timestamp / 90 - if tmpVT.PushNalu(t, 0, v.Payload); r != tmpVT.Ring { - ts = append(ts, t) + var ts TSSlice + //有B帧 + tmpVT := v.Stream.NewVideoTrack(0) + tmpVT.ExtraData = v.ExtraData + tmpVT.CodecID = v.CodecID + tmpVT.revIDR = func() { + l := ts.Len() + sort.Sort(ts) + start := tmpVT.Move(-l) + for i := 0; i < l; i++ { + vp := start.Value.(*RingItem).Value.(*VideoPack) + pack := vt.current() + pack.IDR = vp.IDR + pack.Timestamp = ts[i] + pack.CompositionTime = vp.Timestamp - ts[i] + pack.NALUs = vp.NALUs + vt.push(pack) + start = start.Next() + } + ts = nil } + v.Push = func(payload []byte) { + if err := v.Unmarshal(payload); err != nil { + return + } + r := tmpVT.Ring + t := (v.Timestamp - t0) / 90 + if tmpVT.PushNalu(t, 0, v.Payload); r != tmpVT.Ring { + ts = append(ts, t) + } + } + v.Push(payload) + return } - v.Push(payload) - return + vt.PushNalu(t1, 0, v.Payload) } - vt.PushNalu(t, 0, v.Payload) + v.Push(payload) } func (v *RTPAudio) push(payload []byte) { at := v.AudioTrack if err := v.Unmarshal(payload); err != nil { return } + startTime := v.Timestamp switch at.CodecID { case 10: v.Push = func(payload []byte) { @@ -102,7 +110,7 @@ func (v *RTPAudio) push(payload []byte) { return } for _, payload = range codec.ParseRTPAAC(v.Payload) { - at.PushRaw(v.Timestamp/90, payload) + at.PushRaw((v.Timestamp-startTime)/90, payload) } } case 7, 8: @@ -110,7 +118,8 @@ func (v *RTPAudio) push(payload []byte) { if err := v.Unmarshal(payload); err != nil { return } - at.PushRaw(v.Timestamp/8, v.Payload) + at.PushRaw((v.Timestamp-startTime)/8, v.Payload) } } + v.Push(payload) }