From: qydysky Date: Tue, 11 Feb 2025 19:49:53 +0000 (+0800) Subject: Fix fmp4未知box错误 (#165) X-Git-Tag: v0.15.7~1 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=3a34f0bf9fc72da68c8ae6ae71e1d3de3527aa8a;p=bili_danmu%2F.git Fix fmp4未知box错误 (#165) --- diff --git a/Reply/Msg.go b/Reply/Msg.go index 30d401a..e9587c9 100644 --- a/Reply/Msg.go +++ b/Reply/Msg.go @@ -17,6 +17,7 @@ var msglog = c.C.Log.Base(`Msg`) // Msg类型数据处理方法map var Msg_map = map[string]func(replyF, string){ + `COMMON_ANIMATION`: nil, `UNIVERSAL_EVENT_GIFT`: nil, `UNIVERSAL_EVENT_GIFT_V2`: nil, `PK_INFO`: nil, diff --git a/Reply/flvDecode.go b/Reply/flvDecode.go index 528f3ae..e2840f7 100644 --- a/Reply/flvDecode.go +++ b/Reply/flvDecode.go @@ -36,10 +36,11 @@ var ( ErrTagSize = errors.New("ErrTagSize") ErrSignLost = errors.New("ErrSignLost") - ActionInitFlv perrors.Action = `InitFlv` - ActionGetIndexFlv perrors.Action = `GetIndexFlv` - ActionSeekFlv perrors.Action = `SeekFlv` - ActionOneFFlv perrors.Action = `OneFFlv` + ActionInitFlv perrors.Action = `InitFlv` + ActionGetIndexFlv perrors.Action = `GetIndexFlv` + ActionGenFastSeedFlv perrors.Action = `GenFastSeedFlv` + ActionSeekFlv perrors.Action = `SeekFlv` + ActionOneFFlv perrors.Action = `OneFFlv` ) type FlvDecoder struct { @@ -397,9 +398,9 @@ func (t *FlvDecoder) GenFastSeed(reader io.Reader, save func(seedTo time.Duratio if firstFT == -1 { firstFT = t } - return save(time.Millisecond*time.Duration(t-firstFT), int64(totalRead-buff.Size()+index)) + return perrors.Join(ActionGenFastSeedFlv, save(time.Millisecond*time.Duration(t-firstFT), int64(totalRead-buff.Size()+index))) }); e != nil { - return perrors.New(e.Error(), ActionOneFFlv) + return perrors.Join(ActionGenFastSeedFlv, ActionOneFFlv, e) } else { if dropOffset != 0 { _ = buff.RemoveFront(dropOffset) diff --git a/Reply/fmp4Decode.go b/Reply/fmp4Decode.go index c0418ff..27923ab 100644 --- a/Reply/fmp4Decode.go +++ b/Reply/fmp4Decode.go @@ -15,10 +15,16 @@ import ( ) var ( - ActionInitFmp4 pe.Action = `InitFmp4` - ActionGetIndexFmp4 pe.Action = `GetIndexFmp4` - ActionSeekFmp4 pe.Action = `SeekFmp4` - ActionOneFFmp4 pe.Action = `OneFFmp4` + fmp4BoxLenSize = 4 + fmp4BoxNameSize = 4 +) + +var ( + ActionInitFmp4 pe.Action = `InitFmp4` + ActionGetIndexFmp4 pe.Action = `GetIndexFmp4` + ActionGenFastSeedFmp4 pe.Action = `GenFastSeedFmp4` + ActionSeekFmp4 pe.Action = `SeekFmp4` + ActionOneFFmp4 pe.Action = `OneFFmp4` ) var boxs map[string]bool @@ -277,7 +283,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte]) t.buf.Reset() haveKeyframe = false cu = m[0].i - return pe.Join(ErrDealIESkip.New(), e) + return pe.Join(ErrDealIESkip, e) } } if e := check_set_maxT(ts, func(_ timeStamp) error { @@ -288,7 +294,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte]) cu = m[0].i return errors.New("skip") }); e != nil { - return pe.Join(ErrDealIESkip.New(), e) + return pe.Join(ErrDealIESkip, e) } } @@ -298,7 +304,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte]) if keyframeMoof { if v, e := t.buf.HadModified(bufModified); e == nil && v && !t.buf.IsEmpty() { if e := t.buf.AppendTo(keyframe); e != nil { - return pe.Join(ErrDealIEBreak.New(), e) + return pe.Join(ErrDealIEBreak, e) } cu = m[0].i t.buf.Reset() @@ -309,7 +315,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte]) } if haveKeyframe { if e := t.buf.Append(buf[m[0].i:m[6].e]); e != nil { - return pe.Join(ErrDealIEBreak.New(), e) + return pe.Join(ErrDealIEBreak, e) } } return nil @@ -335,7 +341,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte]) t.buf.Reset() haveKeyframe = false cu = m[0].i - return pe.Join(ErrDealIESkip.New(), e) + return pe.Join(ErrDealIESkip, e) } } switch handlerType { @@ -352,7 +358,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte]) cu = m[0].i return errors.New("skip") }); e != nil { - return pe.Join(ErrDealIESkip.New(), e) + return pe.Join(ErrDealIESkip, e) } } { @@ -363,7 +369,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte]) t.buf.Reset() haveKeyframe = false cu = m[0].i - return pe.Join(ErrDealIESkip.New(), e) + return pe.Join(ErrDealIESkip, e) } } switch handlerType { @@ -380,7 +386,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte]) cu = m[0].i return errors.New("skip") }); e != nil { - return pe.Join(ErrDealIESkip.New(), e) + return pe.Join(ErrDealIESkip, e) } } @@ -389,7 +395,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte]) t.AVTDiff = 0.1 } if diff := math.Abs(video.getT() - audio.getT()); diff > t.AVTDiff { - return pe.Join(ErrDealIEBreak.New(), fmt.Errorf("时间戳不匹配 %v %v (或许应调整fmp4音视频时间戳容差s>%.2f)", video.timeStamp, audio.timeStamp, diff)) + return pe.Join(ErrDealIEBreak, fmt.Errorf("时间戳不匹配 %v %v (或许应调整fmp4音视频时间戳容差s>%.2f)", video.timeStamp, audio.timeStamp, diff)) // copy(video.data, F.Itob64(int64(audio.getT()*float64(video.timescale)))) } @@ -397,7 +403,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte]) if keyframeMoof { if v, e := t.buf.HadModified(bufModified); e == nil && v && !t.buf.IsEmpty() { if e := t.buf.AppendTo(keyframe); e != nil { - return pe.Join(ErrDealIEBreak.New(), e) + return pe.Join(ErrDealIEBreak, e) } cu = m[0].i t.buf.Reset() @@ -408,7 +414,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframe *slice.Buf[byte]) } if haveKeyframe { if e := t.buf.Append(buf[m[0].i:m[10].e]); e != nil { - return pe.Join(ErrDealIEBreak.New(), e) + return pe.Join(ErrDealIEBreak, e) } } return nil @@ -606,7 +612,7 @@ func (t *Fmp4Decoder) oneF(buf []byte, w ...dealFMp4) (cu int, err error) { t.buf.Reset() haveKeyframe = false cu = m[0].i - return pe.Join(ErrDealIESkip.New(), e) + return pe.Join(ErrDealIESkip, e) } } switch handlerType { @@ -623,7 +629,7 @@ func (t *Fmp4Decoder) oneF(buf []byte, w ...dealFMp4) (cu int, err error) { cu = m[0].i return errors.New("skip") }); e != nil { - return pe.Join(ErrDealIESkip.New(), e) + return pe.Join(ErrDealIESkip, e) } } { @@ -634,7 +640,7 @@ func (t *Fmp4Decoder) oneF(buf []byte, w ...dealFMp4) (cu int, err error) { t.buf.Reset() haveKeyframe = false cu = m[0].i - return pe.Join(ErrDealIESkip.New(), e) + return pe.Join(ErrDealIESkip, e) } } switch handlerType { @@ -651,7 +657,7 @@ func (t *Fmp4Decoder) oneF(buf []byte, w ...dealFMp4) (cu int, err error) { cu = m[0].i return errors.New("skip") }); e != nil { - return pe.Join(ErrDealIESkip.New(), e) + return pe.Join(ErrDealIESkip, e) } } @@ -660,7 +666,7 @@ func (t *Fmp4Decoder) oneF(buf []byte, w ...dealFMp4) (cu int, err error) { t.AVTDiff = 0.1 } if diff := math.Abs(video.getT() - audio.getT()); diff > t.AVTDiff { - return pe.Join(ErrDealIEBreak.New(), fmt.Errorf("时间戳不匹配 %v %v (或许应调整fmp4音视频时间戳容差s>%.2f)", video.timeStamp, audio.timeStamp, diff)) + return pe.Join(ErrDealIEBreak, fmt.Errorf("时间戳不匹配 %v %v (或许应调整fmp4音视频时间戳容差s>%.2f)", video.timeStamp, audio.timeStamp, diff)) // copy(video.data, F.Itob64(int64(audio.getT()*float64(video.timescale)))) } @@ -681,7 +687,7 @@ func (t *Fmp4Decoder) oneF(buf []byte, w ...dealFMp4) (cu int, err error) { } if haveKeyframe { if e := t.buf.Append(buf[m[0].i:m[10].e]); e != nil { - return pe.Join(ErrDealIEBreak.New(), e) + return pe.Join(ErrDealIEBreak, e) } } return nil @@ -816,9 +822,9 @@ func (t *Fmp4Decoder) GenFastSeed(reader io.Reader, save func(seedTo time.Durati if firstFT == -1 { firstFT = t } - return save(time.Second*time.Duration(t-firstFT), int64(totalRead-buff.Size()+index)) + return pe.Join(ActionGenFastSeedFmp4, save(time.Second*time.Duration(t-firstFT), int64(totalRead-buff.Size()+index))) }); e != nil { - return pe.New(e.Error(), ActionOneFFmp4) + return pe.Join(ActionGenFastSeedFmp4, ActionOneFFmp4, e) } else { if dropOffset != 0 { _ = buff.RemoveFront(dropOffset) @@ -878,7 +884,7 @@ var ( func decode(buf []byte, reSyncboxName string) (m []ie, err error) { var cu int - for cu < len(buf)-3 { + for cu < len(buf)-fmp4BoxLenSize-fmp4BoxNameSize { boxName, i, e, E := searchBox(buf, &cu) if E != nil { if errors.Is(E, io.EOF) { @@ -913,8 +919,8 @@ var ( func searchBox(buf []byte, cu *int) (boxName string, i int, e int, err error) { i = *cu - e = i + int(F.Btoi(buf, *cu, 4)) - boxName = string(buf[*cu+4 : *cu+8]) + e = i + int(F.Btoi(buf, *cu, fmp4BoxLenSize)) + boxName = string(buf[*cu+fmp4BoxLenSize : *cu+fmp4BoxLenSize+fmp4BoxNameSize]) isPureBoxOrNeedSkip, ok := boxs[boxName] if !ok { err = ErrUnkownBox.WithReason("未知包: " + boxName) diff --git a/go.mod b/go.mod index 29a7555..47c8b23 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23 require ( github.com/gotk3/gotk3 v0.6.4 github.com/mdp/qrterminal/v3 v3.2.0 - github.com/qydysky/part v0.28.20250204174904 + github.com/qydysky/part v0.28.20250211194255 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 golang.org/x/text v0.21.0 diff --git a/go.sum b/go.sum index afb2147..7a436cb 100644 --- a/go.sum +++ b/go.sum @@ -48,8 +48,8 @@ github.com/qydysky/biliApi v0.0.0-20240725184407-15076dddb6fb h1:dtSpNF9hLQa09TU github.com/qydysky/biliApi v0.0.0-20240725184407-15076dddb6fb/go.mod h1:om024vfxALQ5vxsbaGoMm8IS0esLYBnEOpJI8FsGoDg= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9 h1:k451T+bpsLr+Dq9Ujo+Qtx0iomRA1XXS5ttlEojvfuQ= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9/go.mod h1:cI8/gy/wjy2Eb+p2IUj2ZuDnC8R5Vrx3O0VMPvMvphA= -github.com/qydysky/part v0.28.20250204174904 h1:9b61I1Uy7WEWC4egJDFezJPFz/acnsR2Nrb1YGi5F30= -github.com/qydysky/part v0.28.20250204174904/go.mod h1:RAb3G05OaqCSRWFJz9FnONB6iqF/Dk4R+Z5c/H7mWSg= +github.com/qydysky/part v0.28.20250211194255 h1:rCJs36/oIsEs81abGA1LX0uBoqG0IYqZySDpsvFTOwI= +github.com/qydysky/part v0.28.20250211194255/go.mod h1:RAb3G05OaqCSRWFJz9FnONB6iqF/Dk4R+Z5c/H7mWSg= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=