update muxer'videometa

This commit is contained in:
notch
2021-01-09 08:24:19 +08:00
parent d89e579b21
commit c1fbafebd5
2 changed files with 27 additions and 21 deletions

View File

@@ -132,16 +132,6 @@ func (muxer *MuxerAvcAac) muxVideoTag(frame *codec.Frame) error {
if frame.Payload[0]&0x1F == h264.NalSps { if frame.Payload[0]&0x1F == h264.NalSps {
if len(muxer.videoMeta.Sps) == 0 { if len(muxer.videoMeta.Sps) == 0 {
muxer.videoMeta.Sps = frame.Payload 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() return muxer.muxSequenceHeaderTag()
} }
@@ -277,11 +267,16 @@ func (muxer *MuxerAvcAac) muxSequenceHeaderTag() error {
return nil return nil
} }
if len(muxer.videoMeta.Sps) == 0 || len(muxer.videoMeta.Pps) == 0 { if !h264.MetadataIsReady(&muxer.videoMeta) {
// not enough // not enough
return nil return nil
} }
if muxer.videoMeta.FixedFrameRate {
muxer.dtsStep = 1000.0 / muxer.videoMeta.FrameRate
} else { // TODO:
muxer.dtsStep = 1000.0 / 30
}
muxer.spsMuxed = true muxer.spsMuxed = true
record := NewAVCDecoderConfigurationRecord(muxer.videoMeta.Sps, muxer.videoMeta.Pps) record := NewAVCDecoderConfigurationRecord(muxer.videoMeta.Sps, muxer.videoMeta.Pps)

View File

@@ -32,6 +32,7 @@ type MuxerAvcAac struct {
recvQueue *queue.SyncQueue recvQueue *queue.SyncQueue
tsframeWriter FrameWriter tsframeWriter FrameWriter
closed bool closed bool
metaReady bool
basePts int64 basePts int64
nextDts float64 nextDts float64
dtsStep float64 dtsStep float64
@@ -141,16 +142,7 @@ func (muxer *MuxerAvcAac) muxVideoTag(frame *codec.Frame) (err error) {
if len(muxer.videoMeta.Sps) == 0 { if len(muxer.videoMeta.Sps) == 0 {
muxer.videoMeta.Sps = frame.Payload muxer.videoMeta.Sps = frame.Payload
} }
var rawSps h264.RawSPS muxer.preparMetadata()
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
return return
} }
@@ -158,6 +150,7 @@ func (muxer *MuxerAvcAac) muxVideoTag(frame *codec.Frame) (err error) {
if len(muxer.videoMeta.Pps) == 0 { if len(muxer.videoMeta.Pps) == 0 {
muxer.videoMeta.Pps = frame.Payload muxer.videoMeta.Pps = frame.Payload
} }
muxer.preparMetadata()
return return
} }
@@ -183,6 +176,24 @@ func (muxer *MuxerAvcAac) muxVideoTag(frame *codec.Frame) (err error) {
return muxer.tsframeWriter.WriteMpegtsFrame(tsframe) 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 { func (muxer *MuxerAvcAac) muxAudioTag(frame *codec.Frame) error {
pts := frame.AbsTimestamp - muxer.basePts + ptsDelay pts := frame.AbsTimestamp - muxer.basePts + ptsDelay
pts *= 90 pts *= 90