diff --git a/av/format/flv/muxeravcaac.go b/av/format/flv/muxeravcaac.go index 885ff9a..3d55377 100644 --- a/av/format/flv/muxeravcaac.go +++ b/av/format/flv/muxeravcaac.go @@ -132,16 +132,6 @@ func (muxer *MuxerAvcAac) muxVideoTag(frame *codec.Frame) error { if frame.Payload[0]&0x1F == h264.NalSps { if len(muxer.videoMeta.Sps) == 0 { muxer.videoMeta.Sps = frame.Payload - var rawSps h264.RawSPS - err := rawSps.Decode(muxer.videoMeta.Sps) - if err != nil { - return err - } - - muxer.videoMeta.Width = rawSps.Width() - muxer.videoMeta.Height = rawSps.Height() - muxer.videoMeta.FrameRate = rawSps.FrameRate() - muxer.dtsStep = 1000.0 / muxer.videoMeta.FrameRate } return muxer.muxSequenceHeaderTag() } @@ -277,11 +267,16 @@ func (muxer *MuxerAvcAac) muxSequenceHeaderTag() error { return nil } - if len(muxer.videoMeta.Sps) == 0 || len(muxer.videoMeta.Pps) == 0 { + if !h264.MetadataIsReady(&muxer.videoMeta) { // not enough return nil } + if muxer.videoMeta.FixedFrameRate { + muxer.dtsStep = 1000.0 / muxer.videoMeta.FrameRate + } else { // TODO: + muxer.dtsStep = 1000.0 / 30 + } muxer.spsMuxed = true record := NewAVCDecoderConfigurationRecord(muxer.videoMeta.Sps, muxer.videoMeta.Pps) diff --git a/av/format/mpegts/muxeravcaac.go b/av/format/mpegts/muxeravcaac.go index ac011b5..e06c860 100644 --- a/av/format/mpegts/muxeravcaac.go +++ b/av/format/mpegts/muxeravcaac.go @@ -32,6 +32,7 @@ type MuxerAvcAac struct { recvQueue *queue.SyncQueue tsframeWriter FrameWriter closed bool + metaReady bool basePts int64 nextDts float64 dtsStep float64 @@ -141,16 +142,7 @@ func (muxer *MuxerAvcAac) muxVideoTag(frame *codec.Frame) (err error) { if len(muxer.videoMeta.Sps) == 0 { muxer.videoMeta.Sps = frame.Payload } - var rawSps h264.RawSPS - err = rawSps.Decode(muxer.videoMeta.Sps) - if err != nil { - return - } - - muxer.videoMeta.Width = rawSps.Width() - muxer.videoMeta.Height = rawSps.Height() - muxer.videoMeta.FrameRate = rawSps.FrameRate() - muxer.dtsStep = 1000.0 / muxer.videoMeta.FrameRate + muxer.preparMetadata() return } @@ -158,6 +150,7 @@ func (muxer *MuxerAvcAac) muxVideoTag(frame *codec.Frame) (err error) { if len(muxer.videoMeta.Pps) == 0 { muxer.videoMeta.Pps = frame.Payload } + muxer.preparMetadata() return } @@ -183,6 +176,24 @@ func (muxer *MuxerAvcAac) muxVideoTag(frame *codec.Frame) (err error) { return muxer.tsframeWriter.WriteMpegtsFrame(tsframe) } +func (muxer *MuxerAvcAac) preparMetadata() { + if muxer.metaReady { + return + } + + if !h264.MetadataIsReady(&muxer.videoMeta) { + // not enough + return + } + + if muxer.videoMeta.FixedFrameRate { + muxer.dtsStep = 1000.0 / muxer.videoMeta.FrameRate + } else { // TODO: + muxer.dtsStep = 1000.0 / 30 + } + muxer.metaReady = true +} + func (muxer *MuxerAvcAac) muxAudioTag(frame *codec.Frame) error { pts := frame.AbsTimestamp - muxer.basePts + ptsDelay pts *= 90