From: qydysky <32743305+qydysky@users.noreply.github.com> Date: Sun, 19 Feb 2023 14:09:52 +0000 (+0800) Subject: Fix 有时会重复接收到flv起始段,导致无法回放 X-Git-Tag: v0.6.2~6 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=9aba1c0f60fc849f2de58766fdc5c69215e507c7;p=bili_danmu%2F.git Fix 有时会重复接收到flv起始段,导致无法回放 --- diff --git a/Reply/flvDecode.go b/Reply/flvDecode.go index d2435fa..649687d 100644 --- a/Reply/flvDecode.go +++ b/Reply/flvDecode.go @@ -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 index 0000000..5cf89fa --- /dev/null +++ b/Reply/flvDecode_test.go @@ -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))) +} diff --git a/Reply/stream.go b/Reply/stream.go index 4f71260..8b68abc 100644 --- a/Reply/stream.go +++ b/Reply/stream.go @@ -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)