This commit is contained in:
deepch 2024-01-29 12:46:06 +03:00
parent a743575ac9
commit 7a563b07e3
3 changed files with 26 additions and 17 deletions

View File

@ -3,23 +3,22 @@ package mp4
import ( import (
"bufio" "bufio"
"fmt" "fmt"
"io"
"time"
"github.com/deepch/vdk/codec/h265parser"
"github.com/deepch/vdk/av" "github.com/deepch/vdk/av"
"github.com/deepch/vdk/codec/aacparser" "github.com/deepch/vdk/codec/aacparser"
"github.com/deepch/vdk/codec/h264parser" "github.com/deepch/vdk/codec/h264parser"
"github.com/deepch/vdk/codec/h265parser"
"github.com/deepch/vdk/format/mp4/mp4io" "github.com/deepch/vdk/format/mp4/mp4io"
"github.com/deepch/vdk/utils/bits/pio" "github.com/deepch/vdk/utils/bits/pio"
"io"
"time"
) )
type Muxer struct { type Muxer struct {
w io.WriteSeeker w io.WriteSeeker
bufw *bufio.Writer bufw *bufio.Writer
wpos int64 wpos int64
streams []*Stream streams []*Stream
NegativeTsMakeZero bool
} }
func NewMuxer(w io.WriteSeeker) *Muxer { 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) { func (self *Stream) writePacket(pkt av.Packet, rawdur time.Duration) (err error) {
if rawdur < 0 { if rawdur < 0 {
err = fmt.Errorf("mp4: stream#%d time=%v < lasttime=%v", pkt.Idx, pkt.Time, self.lastpkt.Time) if self.muxer.NegativeTsMakeZero {
return 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 { if _, err = self.muxer.bufw.Write(pkt.Data); err != nil {

View File

@ -14,10 +14,11 @@ import (
) )
type Muxer struct { type Muxer struct {
w io.WriteSeeker w io.WriteSeeker
bufw *bufio.Writer bufw *bufio.Writer
wpos int64 wpos int64
streams []*Stream streams []*Stream
NegativeTsMakeZero bool
} }
func NewMuxer(w io.WriteSeeker) *Muxer { 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) { func (self *Stream) writePacket(pkt av.Packet, rawdur time.Duration) (err error) {
if rawdur < 0 { if rawdur < 0 {
err = fmt.Errorf("mp4: stream#%d time=%v < lasttime=%v", pkt.Idx, pkt.Time, self.lastpkt.Time) if self.muxer.NegativeTsMakeZero {
return 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 { if _, err = self.muxer.bufw.Write(pkt.Data); err != nil {

View File

@ -210,6 +210,7 @@ func (m *Muxer) OpenMP4() (err error) {
return return
} }
m.muxer = mp4.NewMuxer(m.d) m.muxer = mp4.NewMuxer(m.d)
m.muxer.NegativeTsMakeZero = true
if err = m.muxer.WriteHeader(m.gof.Streams); err != nil { if err = m.muxer.WriteHeader(m.gof.Streams); err != nil {
return return
} }