diff --git a/format/mp4/muxer.go b/format/mp4/muxer.go index d0e3578..fdcf696 100644 --- a/format/mp4/muxer.go +++ b/format/mp4/muxer.go @@ -3,23 +3,22 @@ package mp4 import ( "bufio" "fmt" - "io" - "time" - - "github.com/deepch/vdk/codec/h265parser" - "github.com/deepch/vdk/av" "github.com/deepch/vdk/codec/aacparser" "github.com/deepch/vdk/codec/h264parser" + "github.com/deepch/vdk/codec/h265parser" "github.com/deepch/vdk/format/mp4/mp4io" "github.com/deepch/vdk/utils/bits/pio" + "io" + "time" ) type Muxer struct { - w io.WriteSeeker - bufw *bufio.Writer - wpos int64 - streams []*Stream + w io.WriteSeeker + bufw *bufio.Writer + wpos int64 + streams []*Stream + NegativeTsMakeZero bool } func NewMuxer(w io.WriteSeeker) *Muxer { @@ -206,8 +205,12 @@ func (self *Muxer) WritePacket(pkt av.Packet) (err error) { func (self *Stream) writePacket(pkt av.Packet, rawdur time.Duration) (err error) { if rawdur < 0 { - err = fmt.Errorf("mp4: stream#%d time=%v < lasttime=%v", pkt.Idx, pkt.Time, self.lastpkt.Time) - return + if self.muxer.NegativeTsMakeZero { + rawdur = 0 + } else { + err = fmt.Errorf("mp4: stream#%d time=%v < lasttime=%v", pkt.Idx, pkt.Time, self.lastpkt.Time) + return + } } if _, err = self.muxer.bufw.Write(pkt.Data); err != nil { diff --git a/format/mp4m/muxer.go b/format/mp4m/muxer.go index f7b2735..76b6522 100644 --- a/format/mp4m/muxer.go +++ b/format/mp4m/muxer.go @@ -14,10 +14,11 @@ import ( ) type Muxer struct { - w io.WriteSeeker - bufw *bufio.Writer - wpos int64 - streams []*Stream + w io.WriteSeeker + bufw *bufio.Writer + wpos int64 + streams []*Stream + NegativeTsMakeZero bool } func NewMuxer(w io.WriteSeeker) *Muxer { @@ -181,8 +182,12 @@ func (self *Muxer) WritePacket(pkt av.Packet) (err error) { func (self *Stream) writePacket(pkt av.Packet, rawdur time.Duration) (err error) { if rawdur < 0 { - err = fmt.Errorf("mp4: stream#%d time=%v < lasttime=%v", pkt.Idx, pkt.Time, self.lastpkt.Time) - return + if self.muxer.NegativeTsMakeZero { + rawdur = 0 + } else { + err = fmt.Errorf("mp4: stream#%d time=%v < lasttime=%v", pkt.Idx, pkt.Time, self.lastpkt.Time) + return + } } if _, err = self.muxer.bufw.Write(pkt.Data); err != nil { diff --git a/format/nvr/muxer.go b/format/nvr/muxer.go index 3d061c9..29a02ad 100644 --- a/format/nvr/muxer.go +++ b/format/nvr/muxer.go @@ -210,6 +210,7 @@ func (m *Muxer) OpenMP4() (err error) { return } m.muxer = mp4.NewMuxer(m.d) + m.muxer.NegativeTsMakeZero = true if err = m.muxer.WriteHeader(m.gof.Streams); err != nil { return }