mp4: bugfix write lastpkt

This commit is contained in:
nareix 2016-07-13 15:59:11 +08:00
parent 51ad6aeb7a
commit 975080658c
2 changed files with 17 additions and 10 deletions

View File

@ -169,22 +169,20 @@ func (self *Muxer) WriteHeader(streams []av.CodecData) (err error) {
func (self *Muxer) WritePacket(pkt av.Packet) (err error) { func (self *Muxer) WritePacket(pkt av.Packet) (err error) {
stream := self.streams[pkt.Idx] stream := self.streams[pkt.Idx]
if err = stream.writePacket(pkt); err != nil { if stream.lastpkt != nil {
return if err = stream.writePacket(*stream.lastpkt, pkt.Time-stream.lastpkt.Time); err != nil {
return
}
} }
stream.lastpkt = &pkt
return return
} }
func (self *Stream) writePacket(pkt av.Packet) (err error) { func (self *Stream) writePacket(pkt av.Packet, rawdur time.Duration) (err error) {
if self.lasttime == 0 {
self.lasttime = pkt.Time
}
rawdur := pkt.Time - self.lasttime
if rawdur < 0 { if rawdur < 0 {
err = fmt.Errorf("mp4: stream#%d time=%v < lasttime=%v", pkt.Idx, pkt.Time, self.lasttime) err = fmt.Errorf("mp4: stream#%d time=%v < lasttime=%v", pkt.Idx, pkt.Time, self.lastpkt.Time)
return return
} }
self.lasttime = pkt.Time
var filePos int64 var filePos int64
var sampleSize int var sampleSize int
@ -235,6 +233,15 @@ func (self *Stream) writePacket(pkt av.Packet) (err error) {
} }
func (self *Muxer) WriteTrailer() (err error) { func (self *Muxer) WriteTrailer() (err error) {
for _, stream := range self.streams {
if stream.lastpkt != nil {
if err = stream.writePacket(*stream.lastpkt, 0); err != nil {
return
}
stream.lastpkt = nil
}
}
moov := &atom.Movie{} moov := &atom.Movie{}
moov.Header = &atom.MovieHeader{ moov.Header = &atom.MovieHeader{
PreferredRate: atom.IntToFixed(1), PreferredRate: atom.IntToFixed(1),

View File

@ -14,7 +14,7 @@ type Stream struct {
r io.ReadSeeker r io.ReadSeeker
idx int idx int
lasttime time.Duration lastpkt *av.Packet
timeScale int64 timeScale int64
duration int64 duration int64