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
}
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
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
if dropOffset != 0 {
_ = buff.RemoveFront(dropOffset)
} else {
- bufSize += bufSize * 50
+ bufSize *= 2
}
if len(frontBuf) == 0 {
continue
_, 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
}
}
}
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()
ies, e := decode(buf, "moof")
if e != nil {
- return 0, 0, e
+ return 0, e
}
var ErrNormal = perrors.New("ErrNormal", "ErrNormal")
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()
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()
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
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
}
}
}