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
}
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
}
--- /dev/null
+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)))
+}
}
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)