修复hls流第一个ts切片没有sps和pps问题

This commit is contained in:
yangjiechina
2024-07-17 21:31:18 +08:00
parent 21c4512b3a
commit 3856631af7
2 changed files with 14 additions and 9 deletions

View File

@@ -166,11 +166,11 @@ func (m *memoryPool) freeOldBlocks() bool {
} }
func (m *memoryPool) FreeHead() { func (m *memoryPool) FreeHead() {
if m.freeOldBlocks() || m.blockQueue.IsEmpty() { if m.freeOldBlocks() /*|| m.blockQueue.IsEmpty()*/ {
return return
} }
//utils.Assert(!m.blockQueue.IsEmpty()) utils.Assert(!m.blockQueue.IsEmpty())
size := m.blockQueue.Pop().(int) size := m.blockQueue.Pop().(int)
m.head += size m.head += size
@@ -183,11 +183,11 @@ func (m *memoryPool) FreeHead() {
} }
func (m *memoryPool) FreeTail() { func (m *memoryPool) FreeTail() {
if m.freeOldBlocks() || m.blockQueue.IsEmpty() { if m.freeOldBlocks() /*|| m.blockQueue.IsEmpty()*/ {
return return
} }
//utils.Assert(!m.blockQueue.IsEmpty()) utils.Assert(!m.blockQueue.IsEmpty())
size := m.blockQueue.PopBack().(int) size := m.blockQueue.PopBack().(int)
m.tail -= size m.tail -= size

View File

@@ -223,6 +223,7 @@ func (s *PublishSource) CreateDefaultOutStreams() {
panic(err) panic(err)
} }
s.dispatchGOPBuffer(hlsStream)
s.hlsStream = hlsStream s.hlsStream = hlsStream
s.transStreams[GenerateTransStreamId(ProtocolHls, streams...)] = s.hlsStream s.transStreams[GenerateTransStreamId(ProtocolHls, streams...)] = s.hlsStream
} }
@@ -330,6 +331,12 @@ func (s *PublishSource) CreateTransStream(protocol Protocol, streams []utils.AVS
return transStream, err return transStream, err
} }
func (s *PublishSource) dispatchGOPBuffer(transStream TransStream) {
s.gopBuffer.PeekAll(func(packet utils.AVPacket) {
transStream.Input(packet)
})
}
func (s *PublishSource) AddSink(sink Sink) bool { func (s *PublishSource) AddSink(sink Sink) bool {
// 暂时不考虑多路视频流意味着只能1路视频流和多路音频流同理originStreams和allStreams里面的Stream互斥. 同时多路音频流的Codec必须一致 // 暂时不考虑多路视频流意味着只能1路视频流和多路音频流同理originStreams和allStreams里面的Stream互斥. 同时多路音频流的Codec必须一致
audioCodecId, videoCodecId := sink.DesiredAudioCodecId(), sink.DesiredVideoCodecId() audioCodecId, videoCodecId := sink.DesiredAudioCodecId(), sink.DesiredVideoCodecId()
@@ -413,9 +420,7 @@ func (s *PublishSource) AddSink(sink Sink) bool {
//新的传输流,发送缓存的音视频帧 //新的传输流,发送缓存的音视频帧
if !ok && AppConfig.GOPCache && s.existVideo { if !ok && AppConfig.GOPCache && s.existVideo {
s.gopBuffer.PeekAll(func(packet utils.AVPacket) { s.dispatchGOPBuffer(transStream)
transStream.Input(packet)
})
} }
return true return true
@@ -564,8 +569,8 @@ func (s *PublishSource) OnDeMuxStream(stream utils.AVStream) {
s.existVideo = true s.existVideo = true
} }
//为每个Stream创建对应的Buffer //创建GOPBuffer
if AppConfig.GOPCache && s.existVideo { if AppConfig.GOPCache && s.existVideo && s.gopBuffer == nil {
s.gopBuffer = NewStreamBuffer() s.gopBuffer = NewStreamBuffer()
//设置GOP缓存溢出回调 //设置GOP缓存溢出回调
s.gopBuffer.SetDiscardHandler(s.OnDiscardPacket) s.gopBuffer.SetDiscardHandler(s.OnDiscardPacket)