diff --git a/plugin/mp4/pkg/muxer.go b/plugin/mp4/pkg/muxer.go index cbc6b1b..5c91d51 100644 --- a/plugin/mp4/pkg/muxer.go +++ b/plugin/mp4/pkg/muxer.go @@ -5,7 +5,6 @@ import ( "io" "os" - "m7s.live/v5/pkg" . "m7s.live/v5/plugin/mp4/pkg/box" ) @@ -160,31 +159,6 @@ func (m *Muxer) reWriteMdatSize(w io.WriteSeeker) (err error) { return } -func (m *Muxer) ReWriteWithMoov(f io.WriteSeeker, r io.Reader) (err error) { - if m.isFragment() { - return pkg.ErrSkip - } - _, err = f.Seek(0, io.SeekStart) - if err != nil { - return - } - _, err = io.CopyN(f, r, int64(m.mdatOffset)-16) - if err != nil { - return - } - for _, track := range m.Tracks { - for i := range len(track.Samplelist) { - track.Samplelist[i].Offset += int64(m.moov.Size()) - } - } - err = m.WriteMoov(f) - if err != nil { - return - } - _, err = io.CopyN(f, r, int64(m.mdatSize)+16) - return -} - func (m *Muxer) makeMvex() *MovieExtendsBox { trexs := make([]*TrackExtendsBox, 0, m.nextTrackId-1) for i := uint32(1); i < m.nextTrackId; i++ { diff --git a/plugin/mp4/pkg/record.go b/plugin/mp4/pkg/record.go index 0c12b61..bd55c5e 100644 --- a/plugin/mp4/pkg/record.go +++ b/plugin/mp4/pkg/record.go @@ -41,7 +41,9 @@ func (task *writeTrailerTask) Start() (err error) { } return } - +const BeforeMdatData = 16 // free box + mdat box header or big mdat box header +// 将 moov 从末尾移动到前方 +// 将 ftyp + free(optional) + moov + mdat 写入临时文件, 然后替换原文件 func (t *writeTrailerTask) Run() (err error) { t.Info("write trailer") var temp *os.File @@ -50,8 +52,31 @@ func (t *writeTrailerTask) Run() (err error) { t.Error("create temp file", "err", err) return } + defer os.Remove(temp.Name()) - err = t.muxer.ReWriteWithMoov(temp, t.file) + + _, err = t.file.Seek(0, io.SeekStart) + if err != nil { + t.Error("seek file", "err", err) + return + } + // 复制 mdat box之前的内容 + _, err = io.CopyN(temp, t.file, int64(t.muxer.mdatOffset)-BeforeMdatData) + if err != nil { + return + } + for _, track := range t.muxer.Tracks { + for i := range len(track.Samplelist) { + track.Samplelist[i].Offset += int64(t.muxer.moov.Size()) + } + } + err = t.muxer.WriteMoov(temp) + if err != nil { + return + } + // 复制 mdat box + _, err = io.CopyN(temp, t.file, int64(t.muxer.mdatSize)+BeforeMdatData) + if err != nil { if err == pkg.ErrSkip { return task.ErrTaskComplete