diff --git a/pkg/logic/gop_cache.go b/pkg/logic/gop_cache.go index 647f68d..db3b922 100644 --- a/pkg/logic/gop_cache.go +++ b/pkg/logic/gop_cache.go @@ -92,9 +92,16 @@ func (gc *GOPCache) Feed(msg rtmp.AVMsg, lg LazyGet) { } if gc.gopCircularQue.Cap() != 0 { if msg.IsVideoKeyNalu() { - var gop GOP + var gop *GOP + if gc.gopCircularQue.Full() { + //如果已经满了,获取队首即将被淘汰的GOP + gop = gc.gopCircularQue.Front() + gop.Clear() + } else { + gop = &GOP{} + } gop.Feed(msg, lg()) - gc.gopCircularQue.Enqueue(&gop) + gc.gopCircularQue.Enqueue(gop) } else { gop := gc.gopCircularQue.Back() if gop != nil { @@ -131,6 +138,10 @@ func (g *GOP) Feed(msg rtmp.AVMsg, b []byte) { g.data = append(g.data, b) } +func (g *GOP) Clear() { + g.data = g.data[:0] +} + type gopCircularQueue struct { buf []*GOP size int @@ -220,7 +231,6 @@ func (gcq *gopCircularQueue) At(pos int) *GOP { func (gcq *gopCircularQueue) Clear() { gcq.first = 0 gcq.last = 0 - } func (gcq *gopCircularQueue) lastInc() {