]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
Improve fmp4模式内存优化
authorqydysky <32743305+qydysky@users.noreply.github.com>
Tue, 28 Feb 2023 15:24:10 +0000 (23:24 +0800)
committerqydysky <32743305+qydysky@users.noreply.github.com>
Tue, 28 Feb 2023 15:24:10 +0000 (23:24 +0800)
Reply/fmp4Decode.go
Reply/stream.go
go.mod
go.sum

index fbe44e1f241d19ef680a709ef2bdf63f51596c8d..e4e82cb6056afe922db866abd912aed250c8f4e9 100644 (file)
@@ -113,7 +113,7 @@ func (t *Fmp4Decoder) Init_fmp4(buf []byte) (b []byte, err error) {
        return b, nil
 }
 
-func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframes *slice.Buf[byte]) (cu int, err error) {
+func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte) (cu int, keyframes [][]byte, err error) {
        if len(buf) > humanize.MByte*100 {
                err = errors.New("buf too large")
                return
@@ -243,7 +243,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframes *slice.Buf[byte])
                                //deal frame
                                if keyframeMoof {
                                        if v, e := t.buf.HadModified(bufModified); e == nil && v && !t.buf.IsEmpty() {
-                                               keyframes.Append(t.buf.GetPureBuf())
+                                               keyframes = append(keyframes, t.buf.GetCopyBuf())
                                                cu = m[0].i
                                                t.buf.Reset()
                                        }
@@ -332,7 +332,7 @@ func (t *Fmp4Decoder) Search_stream_fmp4(buf []byte, keyframes *slice.Buf[byte])
                                //deal frame
                                if keyframeMoof {
                                        if v, e := t.buf.HadModified(bufModified); e == nil && v && !t.buf.IsEmpty() {
-                                               keyframes.Append(t.buf.GetPureBuf())
+                                               keyframes = append(keyframes, t.buf.GetCopyBuf())
                                                cu = m[0].i
                                                t.buf.Reset()
                                        }
index 94e1ce331c6987bb7f91f07a8dcc0ce04e531a43..b0e3395c32e2fa554f584c5859c5765187c6f80a 100644 (file)
@@ -116,7 +116,7 @@ func (t *M4SStream) getM4s() (p *m4s_link_item) {
                                return &m4s_link_item{}
                        },
                        func(t *m4s_link_item) bool {
-                               return !t.pooledTime.IsZero() || t.createdTime.After(t.pooledTime) || time.Now().Before(t.pooledTime.Add(time.Second*10))
+                               return t.createdTime.After(t.pooledTime) || time.Now().Before(t.pooledTime.Add(time.Second*10))
                        },
                        func(t *m4s_link_item) *m4s_link_item {
                                return t.reset()
@@ -805,10 +805,8 @@ func (t *M4SStream) saveStreamM4s() (e error) {
 
        //
        var (
-               buf              = slice.New[byte]()
-               fmp4KeyFrames    = slice.New[byte]()
-               fmp4KeyFramesBuf []byte
-               fmp4Decoder      = &Fmp4Decoder{}
+               buf         = slice.New[byte]()
+               fmp4Decoder = &Fmp4Decoder{}
                // flashingSer      bool
        )
 
@@ -977,7 +975,7 @@ func (t *M4SStream) saveStreamM4s() (e error) {
                        download_seq = append(download_seq[:k], download_seq[k+1:]...)
                        k -= 1
 
-                       last_available_offset, err := fmp4Decoder.Search_stream_fmp4(buf.GetPureBuf(), fmp4KeyFrames)
+                       last_available_offset, keyframes, err := fmp4Decoder.Search_stream_fmp4(buf.GetPureBuf())
                        if err != nil {
                                if !errors.Is(err, io.EOF) {
                                        t.log.L(`E: `, err)
@@ -993,7 +991,6 @@ func (t *M4SStream) saveStreamM4s() (e error) {
                                        //丢弃所有数据
                                        buf.Reset()
                                } else {
-                                       fmp4KeyFrames.Reset()
                                        last_available_offset = 0
                                }
                        }
@@ -1001,13 +998,11 @@ func (t *M4SStream) saveStreamM4s() (e error) {
                        // no, _ := v.getNo()
                        // fmt.Println(no, "fmp4KeyFrames", fmp4KeyFrames.size(), last_available_offset, err)
 
-                       if !fmp4KeyFrames.IsEmpty() {
-                               fmp4KeyFramesBuf = fmp4KeyFrames.GetCopyBuf()
-                               fmp4KeyFrames.Reset()
-                               t.bootBufPush(fmp4KeyFramesBuf)
-                               t.Stream_msg.Push_tag(`data`, fmp4KeyFramesBuf)
+                       for _, keyframe := range keyframes {
+                               t.bootBufPush(keyframe)
+                               t.Stream_msg.Push_tag(`data`, keyframe)
                                if out != nil {
-                                       out.Write(fmp4KeyFramesBuf, true)
+                                       out.Write(keyframe, true)
                                        out.Sync()
                                }
                        }
diff --git a/go.mod b/go.mod
index 5ac278b30df0fa140f9e60fc4c1f47f5ff9f9ac9..c010f106df9e1de7504f98bd371c011244cca859 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -6,7 +6,7 @@ require (
        github.com/gofrs/uuid v4.3.0+incompatible
        github.com/gotk3/gotk3 v0.6.1
        github.com/mdp/qrterminal/v3 v3.0.0
-       github.com/qydysky/part v0.22.21
+       github.com/qydysky/part v0.23.0
        github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
        github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966
        golang.org/x/text v0.3.8
diff --git a/go.sum b/go.sum
index 413994a0e5971e4e0fa066f72410a43aba572808..38a5fb4e757e73c4ca6762cf4dea21b35bf8effb 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -45,6 +45,8 @@ github.com/qydysky/part v0.22.20 h1:zbYo4MzQWxcH7L7PSXF7C+8q07hHyh5HseaQHcnXaO8=
 github.com/qydysky/part v0.22.20/go.mod h1:T6tQU8VYOVT+rX5v40Y7OeDWByz4fwDnyehpa+QIP2c=
 github.com/qydysky/part v0.22.21 h1:qin7pM8pNJ4J+c7w1eHS+4//SvhWm9VPP2tGLAckwVk=
 github.com/qydysky/part v0.22.21/go.mod h1:T6tQU8VYOVT+rX5v40Y7OeDWByz4fwDnyehpa+QIP2c=
+github.com/qydysky/part v0.23.0 h1:f9RoQS+Moz1s4p7/ScP1aK7z3QQGWL2LRSOV0SWLzOk=
+github.com/qydysky/part v0.23.0/go.mod h1:T6tQU8VYOVT+rX5v40Y7OeDWByz4fwDnyehpa+QIP2c=
 github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
 github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=