]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
Fix 有时会重复接收到flv起始段,导致无法回放
authorqydysky <32743305+qydysky@users.noreply.github.com>
Sun, 19 Feb 2023 14:09:52 +0000 (22:09 +0800)
committerqydysky <32743305+qydysky@users.noreply.github.com>
Sun, 19 Feb 2023 14:09:52 +0000 (22:09 +0800)
Reply/flvDecode.go
Reply/flvDecode_test.go [new file with mode: 0644]
Reply/stream.go

index d2435fa35170de0ec0a3206807a546abba9c3843..649687dee88b1f931909ef8eff7ea513c96f20d7 100644 (file)
@@ -63,7 +63,7 @@ func Search_stream_tag(buf []byte) (front_buf []byte, keyframe [][]byte, last_av
                        return //no found available video,audio,script tag
                }
                if tag_offset+tag_header_size > len(buf) {
-                       err = errors.New(`reach end when get tag header`)
+                       // err = errors.New(`reach end when get tag header`)
                        // fmt.Printf("last %x\n",buf[tag_offset:tag_offset+tag_header_size])
                        return //buf end
                }
@@ -78,7 +78,7 @@ func Search_stream_tag(buf []byte) (front_buf []byte, keyframe [][]byte, last_av
 
                tag_size := int(F.Btoi32([]byte{0x00, buf[tag_offset+1], buf[tag_offset+2], buf[tag_offset+3]}, 0))
                if tag_offset+tag_header_size+tag_size+previou_tag_size > len(buf) {
-                       err = errors.New(`reach end when get tag body`)
+                       // err = errors.New(`reach end when get tag body`)
                        // fmt.Printf("last %x\n",buf[tag_offset:tag_offset+tag_header_size])
                        return //buf end
                }
diff --git a/Reply/flvDecode_test.go b/Reply/flvDecode_test.go
new file mode 100644 (file)
index 0000000..5cf89fa
--- /dev/null
@@ -0,0 +1,48 @@
+package reply
+
+import (
+       "errors"
+       "fmt"
+       "io"
+       "testing"
+
+       "github.com/dustin/go-humanize"
+       file "github.com/qydysky/part/file"
+       slice "github.com/qydysky/part/slice"
+)
+
+func Test_FLVdeal(t *testing.T) {
+       flog := file.New("E:\\test\\0.flv.log", 0, false)
+       flog.Delete()
+       defer flog.Close()
+       f := file.New("E:\\test\\0.flv", 0, false)
+       defer f.Close()
+
+       if f.IsDir() || !f.IsExist() {
+               t.Fatal("file not support")
+       }
+
+       buf := make([]byte, humanize.MByte)
+       buff := slice.New[byte](10 * humanize.MByte)
+       max := 0
+
+       for c := 0; true; c++ {
+               n, e := f.Read(buf)
+               if n == 0 && errors.Is(e, io.EOF) {
+                       t.Log("reach end")
+                       break
+               }
+               buff.Append(buf[:n])
+               if s := buff.Size(); max < s {
+                       max = s
+               }
+               front_buf, keyframe, last_available_offset, e := Search_stream_tag(buff.GetPureBuf())
+               if e != nil {
+                       t.Fatal(e)
+               }
+               flog.Write([]byte(fmt.Sprintf("%d %d %d %d\n", c, len(front_buf), len(keyframe), last_available_offset)), true)
+               t.Log(c, len(front_buf), len(keyframe))
+               buff.RemoveFront(last_available_offset)
+       }
+       t.Log("max", humanize.Bytes(uint64(max)))
+}
index 4f71260e2029539db217bfaaeab3d22c6ec4a8ad..8b68abc7539a54c69829787662b8e5ff83b689ac 100644 (file)
@@ -712,6 +712,11 @@ func (t *M4SStream) saveStreamFlv() (e error) {
                                                }
                                                if len(front_buf)+len(keyframe) != 0 {
                                                        if len(front_buf) != 0 {
+                                                               if len(t.first_buf) != 0 {
+                                                                       t.log.L(`E: `, `flv重复接收到起始段,退出`)
+                                                                       r.Cancel()
+                                                                       break
+                                                               }
                                                                t.first_buf = front_buf
                                                                // fmt.Println("write front_buf")
                                                                out.Write(front_buf)