fix: 拉取只存在音频的流失败问题

This commit is contained in:
yangjiechina
2025-05-02 18:34:44 +08:00
parent e226f64f45
commit c2445233ee
2 changed files with 11 additions and 10 deletions

View File

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

View File

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