fix: mp4 record moov move forward

This commit is contained in:
langhuihui
2025-02-23 17:48:15 +08:00
parent 12555c31eb
commit 6728be29af
2 changed files with 27 additions and 28 deletions
-26
View File
@@ -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++ {
+27 -2
View File
@@ -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