]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
Fix 断流导致的文件无法播放
authorqydysky <32743305+qydysky@users.noreply.github.com>
Thu, 16 Feb 2023 16:41:30 +0000 (00:41 +0800)
committerqydysky <32743305+qydysky@users.noreply.github.com>
Thu, 16 Feb 2023 16:41:30 +0000 (00:41 +0800)
Reply/fmp4Decode.go

index 416e9db155a92a7778e764594c12dc6a5d2384c3..c53a5dd772913d12820051fe5242a08defc3c262 100644 (file)
@@ -157,6 +157,18 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframes *slice.Buf[byte])
                        return
                }
 
+               //is SampleEntries error?
+               checkSampleEntries = func(trun, mdat int) error {
+                       if buf[trun+11] == 'b' {
+                               for i := trun + 24; i < mdat; i += 12 {
+                                       if F.Btoi(buf, i+4, 4) < 1000 {
+                                               return errors.New("find sample size less then 1000")
+                                       }
+                               }
+                       }
+                       return nil
+               }
+
                //is t error?
                check_set_maxT = func(ts timeStamp, equal func(ts timeStamp) error, larger func(ts timeStamp) error) (err error) {
                        switch ts.handlerType {
@@ -205,6 +217,14 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframes *slice.Buf[byte])
                                        // moofSN       = int(F.Btoi(buf, m[1].i+12, 4))
                                )
 
+                               if e := checkSampleEntries(m[5].i, m[6].i); e != nil {
+                                       //skip
+                                       t.buf.Reset()
+                                       haveKeyframe = false
+                                       cu = m[0].i
+                                       return false
+                               }
+
                                {
                                        ts, _ := get_track_type(m[3].i, m[4].i)
                                        if nil != check_set_maxT(ts, func(_ timeStamp) error {
@@ -247,6 +267,14 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframes *slice.Buf[byte])
 
                                // fmt.Println(moofSN, "frame1", keyframeMoof, t.buf.size(), m[0].i, m[10].n, m[10].e)
 
+                               if e := checkSampleEntries(m[5].i, m[6].i); e != nil {
+                                       //skip
+                                       t.buf.Reset()
+                                       haveKeyframe = false
+                                       cu = m[0].i
+                                       return false
+                               }
+
                                {
                                        ts, handlerType := get_track_type(m[3].i, m[4].i)
                                        switch handlerType {