remove mpegts.Frame Next fields

This commit is contained in:
notch
2020-12-28 09:58:05 +08:00
parent d2f6c23c3d
commit 97e16c54e4
3 changed files with 24 additions and 33 deletions

View File

@@ -46,8 +46,8 @@ type Muxer struct {
lastAccessTime time.Time
logger *xlog.Logger
audioCacheHeader *mpegts.Frame // audio frame cache
audioCacheTail *mpegts.Frame
afCache *mpegts.Frame // audio frame cache
afCacheBuff bytes.Buffer
}
// NewMuxer .
@@ -108,19 +108,17 @@ func (muxer *Muxer) WriteMpegtsFrame(frame *mpegts.Frame) (err error) {
}
if frame.IsAudio() {
if muxer.audioCacheHeader == nil {
muxer.audioCacheHeader = frame
muxer.audioCacheTail = frame
if muxer.afCache == nil {
headerFrame := *frame
muxer.afCache = &headerFrame
muxer.afCacheBuff.Write(frame.Payload)
} else {
muxer.audioCacheTail.Next = frame
muxer.audioCacheTail = frame
muxer.afCacheBuff.Write(frame.Header)
muxer.afCacheBuff.Write(frame.Payload)
}
if frame.Pts-muxer.audioCacheHeader.Pts > hlsAacDelay*90 {
err = muxer.flushFrame(muxer.audioCacheHeader)
muxer.audioCacheHeader = nil
muxer.audioCacheTail = nil
return err
if frame.Pts-muxer.afCache.Pts > hlsAacDelay*90 {
return muxer.flushAudioCache()
}
// reap when current source is pure audio.
@@ -150,6 +148,18 @@ func (muxer *Muxer) WriteMpegtsFrame(frame *mpegts.Frame) (err error) {
return
}
func (muxer *Muxer) flushAudioCache() (err error) {
if muxer.afCache == nil {
return
}
muxer.afCache.Payload = muxer.afCacheBuff.Bytes()
err = muxer.flushFrame(muxer.afCache)
muxer.afCache = nil
muxer.afCacheBuff.Reset()
return
}
func (muxer *Muxer) flushFrame(frame *mpegts.Frame) (err error) {
muxer.current.updateDuration(frame.Pts)
if err = muxer.current.file.writeFrame(frame); err != nil {
@@ -212,13 +222,7 @@ func (muxer *Muxer) reapSegment(segmentStartDts int64) (err error) {
// segment open, flush the audio.
// @see: ngx_rtmp_hls_open_fragment
/* start fragment with audio to make iPhone happy */
if muxer.audioCacheHeader != nil {
if err = muxer.flushFrame(muxer.audioCacheHeader); err != nil {
return
}
muxer.audioCacheHeader = nil
muxer.audioCacheTail = nil
}
err = muxer.flushAudioCache()
return
}
@@ -303,11 +307,7 @@ func (muxer *Muxer) LastAccessTime() time.Time {
// Close .
func (muxer *Muxer) Close() error {
if muxer.audioCacheHeader != nil {
muxer.flushFrame(muxer.audioCacheHeader)
muxer.audioCacheHeader = nil
muxer.audioCacheTail = nil
}
muxer.flushAudioCache()
return muxer.segmentClose(true)
}

View File

@@ -32,7 +32,6 @@ type Frame struct {
Header []byte // 1. AAC-ADTS Header; 2. aud nal [+sps nal+pps nal]+sample nal start code
Payload []byte // data without startcode
key bool
Next *Frame // 注意仅用于音频表示多个音频帧合并成一个Packet输出以减少填充
}
// IsVideo .

View File

@@ -137,14 +137,6 @@ func (w *Writer) WriteMpegtsFrame(frame *Frame) (err error) {
buf.Write(frame.Header)
buf.Write(frame.Payload)
// 音频一包多帧处理
if frame.Pid == tsAudioPid {
for next := frame.Next; next != nil; next = next.Next {
buf.Write(next.Header)
buf.Write(next.Payload)
}
}
avdata := buf.Bytes()
last := len(avdata)