]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
Improve 优化切片返回
authorqydysky <qydysky@foxmail.com>
Sat, 16 Nov 2024 17:37:56 +0000 (01:37 +0800)
committerqydysky <qydysky@foxmail.com>
Sat, 16 Nov 2024 17:37:56 +0000 (01:37 +0800)
Reply/flvDecode.go
Reply/fmp4Decode.go

index 1475d6c0f27189d6f1ecff11290d3d44fbc3cebc..8fbea699e386f5b04f7d32108efacf886dd0db77 100644 (file)
@@ -201,7 +201,7 @@ func (t *FlvDecoder) SearchStreamTag(buf []byte, keyframe *slice.Buf[byte]) (dro
        return
 }
 
-func (t *FlvDecoder) oneF(buf []byte, w ...io.Writer) (dropT int, dropOffset int, err error) {
+func (t *FlvDecoder) oneF(buf []byte, ifWrite func(t int) bool, w ...io.Writer) (dropOffset int, err error) {
 
        if !t.init {
                err = ErrNoInit
@@ -261,14 +261,13 @@ func (t *FlvDecoder) oneF(buf []byte, w ...io.Writer) (dropT int, dropOffset int
                }
 
                if buf[bufOffset] == videoTag && buf[bufOffset+11]&0xf0 == 0x10 { //key frame
-                       if keyframeOp >= 0 {
+                       if keyframeOp >= 0 && len(w) > 0 {
                                dropOffset = bufOffset
-                               if len(w) > 0 {
+                               if ifWrite(timeStamp) {
                                        _, err = w[0].Write(buf[keyframeOp:bufOffset])
                                }
                                return
                        }
-                       dropT = timeStamp
                        keyframeOp = bufOffset
                }
                bufOffset += tagSizeCheck + previouTagSize
@@ -281,12 +280,24 @@ func (t *FlvDecoder) Cut(reader io.Reader, startT, duration time.Duration, w io.
        bufSize := humanize.KByte * 1100
        buf := make([]byte, humanize.KByte*500)
        buff := slice.New[byte]()
-       skiped := false
+       over := false
        startTM := startT.Milliseconds()
        durationM := duration.Milliseconds()
-       blockD := time.Millisecond
        firstFT := -1
-       for c := 0; err == nil; c++ {
+
+       ifWriteF := func(t int) bool {
+               if firstFT == -1 {
+                       firstFT = t
+               }
+               cu := int64(t - firstFT)
+               over = cu <= durationM+startTM
+               if startTM <= cu && over {
+                       return true
+               }
+               return false
+       }
+
+       for c := 0; err == nil && !over; c++ {
                n, e := reader.Read(buf)
                if n == 0 && errors.Is(e, io.EOF) {
                        return io.EOF
@@ -303,7 +314,7 @@ func (t *FlvDecoder) Cut(reader io.Reader, startT, duration time.Duration, w io.
                                if dropOffset != 0 {
                                        _ = buff.RemoveFront(dropOffset)
                                } else {
-                                       bufSize += bufSize * 50
+                                       bufSize *= 2
                                }
                                if len(frontBuf) == 0 {
                                        continue
@@ -311,37 +322,14 @@ func (t *FlvDecoder) Cut(reader io.Reader, startT, duration time.Duration, w io.
                                        _, err = w.Write(frontBuf)
                                }
                        }
-               } else if !skiped {
-                       if dropT, dropOffset, e := t.oneF(buff.GetPureBuf()); e != nil {
-                               return perrors.New("skip", e.Error())
-                       } else {
-                               if dropOffset != 0 {
-                                       _ = buff.RemoveFront(dropOffset)
-                               } else {
-                                       bufSize += bufSize * 50
-                               }
-                               if firstFT == -1 {
-                                       firstFT = dropT
-                               } else if startTM < int64(dropT-firstFT) {
-                                       blockD = time.Millisecond * time.Duration(int64(dropT-firstFT)-startTM)
-                                       skiped = true
-                               }
-                       }
                } else {
-                       if dropT, dropOffset, e := t.oneF(buff.GetPureBuf(), w); e != nil {
-                               return perrors.New("w", e.Error())
+                       if dropOffset, e := t.oneF(buff.GetPureBuf(), ifWriteF, w); e != nil {
+                               return perrors.New("skip", e.Error())
                        } else {
                                if dropOffset != 0 {
                                        _ = buff.RemoveFront(dropOffset)
                                } else {
-                                       bufSize += bufSize * 50
-                               }
-                               if blockD != time.Millisecond {
-                                       time.Sleep(blockD)
-                                       blockD = time.Millisecond
-                               }
-                               if durationM+startTM < int64(dropT-firstFT) {
-                                       return
+                                       bufSize *= 2
                                }
                        }
                }
index 1e3a1e8485c8f2cdb8796dad03ea35e71eec674c..f4847f0222aad1924ffa9c351272f360889f2ca3 100644 (file)
@@ -404,12 +404,12 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte])
        return
 }
 
-func (t *Fmp4Decoder) oneF(buf []byte, w ...io.Writer) (cuT float64, cu int, err error) {
+func (t *Fmp4Decoder) oneF(buf []byte, ifWrite func(t float64) bool, w ...io.Writer) (cu int, err error) {
        if len(buf) > humanize.MByte*100 {
-               return 0, 0, ErrBufTooLarge
+               return 0, ErrBufTooLarge
        }
        if len(t.traks) == 0 {
-               return 0, 0, ErrMisTraks
+               return 0, ErrMisTraks
        }
        t.buf.Reset()
 
@@ -505,7 +505,7 @@ func (t *Fmp4Decoder) oneF(buf []byte, w ...io.Writer) (cuT float64, cu int, err
 
        ies, e := decode(buf, "moof")
        if e != nil {
-               return 0, 0, e
+               return 0, e
        }
 
        var ErrNormal = perrors.New("ErrNormal", "ErrNormal")
@@ -554,9 +554,11 @@ func (t *Fmp4Decoder) oneF(buf []byte, w ...io.Writer) (cuT float64, cu int, err
                                if keyframeMoof {
                                        if v, e := t.buf.HadModified(bufModified); e == nil && v && !t.buf.IsEmpty() {
                                                cu = m[0].i
-                                               cuT = video.getT()
                                                if haveKeyframe && len(w) > 0 {
-                                                       _, err = w[0].Write(t.buf.GetPureBuf())
+                                                       if ifWrite(video.getT()) {
+                                                               _, err = w[0].Write(t.buf.GetPureBuf())
+                                                       }
+                                                       t.buf.Reset()
                                                        return true, ErrNormal
                                                }
                                                t.buf.Reset()
@@ -652,9 +654,10 @@ func (t *Fmp4Decoder) oneF(buf []byte, w ...io.Writer) (cuT float64, cu int, err
                                if keyframeMoof {
                                        if v, e := t.buf.HadModified(bufModified); e == nil && v && !t.buf.IsEmpty() {
                                                cu = m[0].i
-                                               cuT = video.getT()
                                                if haveKeyframe && len(w) > 0 {
-                                                       _, err = w[0].Write(t.buf.GetPureBuf())
+                                                       if ifWrite(video.getT()) {
+                                                               _, err = w[0].Write(t.buf.GetPureBuf())
+                                                       }
                                                        return true, ErrNormal
                                                }
                                                t.buf.Reset()
@@ -685,11 +688,24 @@ func (t *Fmp4Decoder) Cut(reader io.Reader, startT, duration time.Duration, w io
        buf := make([]byte, humanize.MByte)
        buff := slice.New[byte]()
        init := false
-       skiped := false
+       over := false
        startTM := startT.Seconds()
        durationM := duration.Seconds()
        firstFT := -1.0
-       for c := 0; err == nil; c++ {
+
+       ifWriteF := func(t float64) bool {
+               if firstFT == -1 {
+                       firstFT = t
+               }
+               cu := t - firstFT
+               over = cu <= durationM+startTM
+               if startTM <= cu && over {
+                       return true
+               }
+               return false
+       }
+
+       for c := 0; err == nil && !over; c++ {
                n, e := reader.Read(buf)
                if n == 0 && errors.Is(e, io.EOF) {
                        return io.EOF
@@ -704,39 +720,21 @@ func (t *Fmp4Decoder) Cut(reader io.Reader, startT, duration time.Duration, w io
                                return perrors.New("Init_fmp4", e.Error())
                        } else {
                                if len(frontBuf) == 0 {
-                                       bufSize += bufSize * 50
+                                       bufSize *= 2
                                        continue
                                } else {
                                        init = true
                                        _, err = w.Write(frontBuf)
                                }
                        }
-               } else if !skiped {
-                       if dropT, dropOffset, e := t.oneF(buff.GetPureBuf()); e != nil {
-                               return perrors.New("skip", e.Error())
-                       } else {
-                               if dropOffset != 0 {
-                                       _ = buff.RemoveFront(dropOffset)
-                               } else {
-                                       bufSize += bufSize * 50
-                               }
-                               if firstFT == -1 {
-                                       firstFT = dropT
-                               } else if startTM < dropT-firstFT {
-                                       skiped = true
-                               }
-                       }
                } else {
-                       if dropT, dropOffset, e := t.oneF(buff.GetPureBuf(), w); e != nil {
+                       if dropOffset, e := t.oneF(buff.GetPureBuf(), ifWriteF, w); e != nil {
                                return perrors.New("w", e.Error())
                        } else {
                                if dropOffset != 0 {
                                        _ = buff.RemoveFront(dropOffset)
                                } else {
-                                       bufSize += bufSize * 50
-                               }
-                               if durationM+startTM < dropT-firstFT {
-                                       return
+                                       bufSize *= 2
                                }
                        }
                }