From 8c91ea47a1ad39d49e38231cc4594ae9dbf538b1 Mon Sep 17 00:00:00 2001 From: qydysky Date: Sun, 17 Nov 2024 01:37:56 +0800 Subject: [PATCH] =?utf8?q?Improve=20=E4=BC=98=E5=8C=96=E5=88=87=E7=89=87?= =?utf8?q?=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Reply/flvDecode.go | 56 +++++++++++++++++------------------------- Reply/fmp4Decode.go | 60 ++++++++++++++++++++++----------------------- 2 files changed, 51 insertions(+), 65 deletions(-) diff --git a/Reply/flvDecode.go b/Reply/flvDecode.go index 1475d6c..8fbea69 100644 --- a/Reply/flvDecode.go +++ b/Reply/flvDecode.go @@ -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 } } } diff --git a/Reply/fmp4Decode.go b/Reply/fmp4Decode.go index 1e3a1e8..f4847f0 100644 --- a/Reply/fmp4Decode.go +++ b/Reply/fmp4Decode.go @@ -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 } } } -- 2.39.2