diff --git a/stream/mw_buffer.go b/stream/mw_buffer.go index 2cf4d5b..3210ab3 100644 --- a/stream/mw_buffer.go +++ b/stream/mw_buffer.go @@ -107,7 +107,8 @@ func (m *mergeWritingBuffer) FlushSegment() (*collections.ReferenceCounter[[]byt counter := collections.NewReferenceCounter(data) // 遇到完整关键帧切片, 替代前一组 - if m.hasKeyVideoDataInCurrentSegment { + // 或者只保留最近的音频切片 + if m.hasKeyVideoDataInCurrentSegment || !m.existVideo { for m.lastKeyVideoDataSegments.Size() > 0 { segment := m.lastKeyVideoDataSegments.Pop() segment.Release() @@ -131,7 +132,7 @@ func (m *mergeWritingBuffer) FlushSegment() (*collections.ReferenceCounter[[]byt } func (m *mergeWritingBuffer) TryFlushSegment() (*collections.ReferenceCounter[[]byte], bool) { - if (!AppConfig.GOPCache || !m.existVideo) || m.duration >= AppConfig.MergeWriteLatency { + if !AppConfig.GOPCache || m.duration >= AppConfig.MergeWriteLatency { return m.FlushSegment() } @@ -156,7 +157,7 @@ func (m *mergeWritingBuffer) Reserve(size int) { } func (m *mergeWritingBuffer) ReadSegmentsFromKeyFrameIndex(cb func(*collections.ReferenceCounter[[]byte])) { - if !AppConfig.GOPCache || !m.existVideo || m.lastKeyVideoDataSegments.Size() == 0 { + if !AppConfig.GOPCache || m.lastKeyVideoDataSegments.Size() == 0 { return } @@ -189,7 +190,7 @@ func NewMergeWritingBuffer(existVideo bool) MergeWritingBuffer { buffers: collections.NewQueue[*mbBuffer](24), } - if existVideo && AppConfig.GOPCache { + if AppConfig.GOPCache { buffer.lastKeyVideoDataSegments = collections.NewQueue[*collections.ReferenceCounter[[]byte]](36) } diff --git a/stream/source.go b/stream/source.go index 0618da0..443805e 100644 --- a/stream/source.go +++ b/stream/source.go @@ -320,9 +320,9 @@ func (s *PublishSource) DispatchBuffer(transStream TransStream, index int, data for _, sink := range sinks { - // 如果存在视频, 确保向sink发送的第一帧是关键帧 - if exist && sink.GetSentPacketCount() < 1 { - if !keyVideo { + if sink.GetSentPacketCount() < 1 { + // 如果存在视频, 确保向sink发送的第一帧是关键帧 + if exist && !keyVideo { continue } @@ -806,7 +806,7 @@ func (s *PublishSource) OnPacket(packet *avformat.AVPacket) { // track超时,忽略推流数据 if s.NotTrackAdded(packet.Index) { - s.TransDemuxer.DiscardBackPacket(packet.BufferIndex) + s.TransDemuxer.DiscardHeadPacket(packet.BufferIndex) return } @@ -832,9 +832,9 @@ func (s *PublishSource) OnPacket(packet *avformat.AVPacket) { } } - // 未开启GOP缓存或只存在音频流, 释放掉内存 + // 未开启GOP缓存或只存在音频流, 立即释放 if !AppConfig.GOPCache || !s.existVideo { - s.TransDemuxer.DiscardBackPacket(packet.BufferIndex) + s.TransDemuxer.DiscardHeadPacket(packet.BufferIndex) } }