mirror of
https://github.com/langhuihui/monibuca.git
synced 2026-05-09 06:11:02 +08:00
fix: mp4 record moov move forward
This commit is contained in:
@@ -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++ {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user