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 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)

View File

@@ -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