From 9aba1c0f60fc849f2de58766fdc5c69215e507c7 Mon Sep 17 00:00:00 2001 From: qydysky <32743305+qydysky@users.noreply.github.com> Date: Sun, 19 Feb 2023 22:09:52 +0800 Subject: [PATCH] =?utf8?q?Fix=20=E6=9C=89=E6=97=B6=E4=BC=9A=E9=87=8D?= =?utf8?q?=E5=A4=8D=E6=8E=A5=E6=94=B6=E5=88=B0flv=E8=B5=B7=E5=A7=8B?= =?utf8?q?=E6=AE=B5=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=97=A0=E6=B3=95=E5=9B=9E?= =?utf8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Reply/flvDecode.go | 4 ++-- Reply/flvDecode_test.go | 48 +++++++++++++++++++++++++++++++++++++++++ Reply/stream.go | 5 +++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 Reply/flvDecode_test.go 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) -- 2.39.2