diff --git a/format/ts/demuxer.go b/format/ts/demuxer.go index 5d90e4f..78564f8 100644 --- a/format/ts/demuxer.go +++ b/format/ts/demuxer.go @@ -3,14 +3,13 @@ package ts import ( "bufio" "fmt" - "io" - "time" - "github.com/deepch/vdk/av" "github.com/deepch/vdk/codec/aacparser" "github.com/deepch/vdk/codec/h264parser" "github.com/deepch/vdk/format/ts/tsio" "github.com/deepch/vdk/utils/bits/pio" + "io" + "time" ) type Demuxer struct { @@ -187,7 +186,7 @@ func (self *Demuxer) readTSPacket() (err error) { return } -func (self *Stream) addPacket(payload []byte, timedelta time.Duration) { +func (self *Stream) addPacket(payload []byte, timedelta time.Duration, fixed time.Duration) { dts := self.dts pts := self.pts @@ -199,6 +198,8 @@ func (self *Stream) addPacket(payload []byte, timedelta time.Duration) { if self.pt > 0 { dur = dts + timedelta - self.pt + } else { + dur = fixed } self.pt = dts + timedelta @@ -243,7 +244,7 @@ func (self *Stream) payloadEnd() (n int, err error) { return } } - self.addPacket(payload[hdrlen:framelen], delta) + self.addPacket(payload[hdrlen:framelen], delta, time.Duration(samples)*time.Second/time.Duration(config.SampleRate)) n++ delta += time.Duration(samples) * time.Second / time.Duration(config.SampleRate) payload = payload[framelen:] @@ -259,6 +260,10 @@ func (self *Stream) payloadEnd() (n int, err error) { switch { case naltype == 7: sps = nalu + info, err := h264parser.ParseSPS(sps) + if err == nil { + self.fps = info.FPS + } case naltype == 8: pps = nalu case h264parser.IsDataNALU(nalu): @@ -267,7 +272,7 @@ func (self *Stream) payloadEnd() (n int, err error) { b := make([]byte, 4+len(nalu)) pio.PutU32BE(b[0:4], uint32(len(nalu))) copy(b[4:], nalu) - self.addPacket(b, time.Duration(0)) + self.addPacket(b, time.Duration(0), (1000*time.Millisecond)/time.Duration(self.fps)) n++ } } @@ -278,7 +283,7 @@ func (self *Stream) payloadEnd() (n int, err error) { b := make([]byte, 4+len(payload)) pio.PutU32BE(b[0:4], uint32(len(payload))) copy(b[4:], payload) - self.addPacket(b, time.Duration(0)) + self.addPacket(b, time.Duration(0), 0) n++ } diff --git a/format/ts/stream.go b/format/ts/stream.go index d4d3020..aba2465 100644 --- a/format/ts/stream.go +++ b/format/ts/stream.go @@ -17,9 +17,9 @@ type Stream struct { streamId uint8 streamType uint8 - tsw *tsio.TSWriter - idx int - + tsw *tsio.TSWriter + idx int + fps uint iskeyframe bool pts, dts, pt time.Duration data []byte