优化缓存发包策略

This commit is contained in:
yangjiechina
2023-12-03 21:44:30 +08:00
parent 21792bf407
commit 0149865a26

View File

@@ -2,11 +2,12 @@ package stream
import ( import (
"fmt" "fmt"
"sync"
"time"
"github.com/yangjiechina/avformat/stream" "github.com/yangjiechina/avformat/stream"
"github.com/yangjiechina/avformat/utils" "github.com/yangjiechina/avformat/utils"
"github.com/yangjiechina/live-server/transcode" "github.com/yangjiechina/live-server/transcode"
"sync"
"time"
) )
// SourceType Source 推流类型 // SourceType Source 推流类型
@@ -202,37 +203,28 @@ func (s *SourceImpl) AddSink(sink ISink) bool {
} }
var streams [5]utils.AVStream var streams [5]utils.AVStream
var index int var size int
bufferCount := -1
for _, stream := range s.originStreams.All() { for _, stream := range s.originStreams.All() {
if disableVideo && stream.Type() == utils.AVMediaTypeVideo { if disableVideo && stream.Type() == utils.AVMediaTypeVideo {
continue continue
} }
streams[index] = stream streams[size] = stream
index++ size++
//从缓存的Stream中挑选出最小的缓存数量交叉发送.
count := s.buffers[stream.Index()].Size()
if bufferCount == -1 {
bufferCount = count
} else {
bufferCount = utils.MinInt(bufferCount, count)
}
} }
transStreamId := GenerateTransStreamId(sink.Protocol(), streams[:index]...) transStreamId := GenerateTransStreamId(sink.Protocol(), streams[:size]...)
transStream, ok := s.transStreams[transStreamId] transStream, ok := s.transStreams[transStreamId]
if !ok { if !ok {
//创建一个新的传输流 //创建一个新的传输流
transStream = TransStreamFactory(sink.Protocol(), streams[:index]) transStream = TransStreamFactory(sink.Protocol(), streams[:size])
if s.transStreams == nil { if s.transStreams == nil {
s.transStreams = make(map[TransStreamId]ITransStream, 10) s.transStreams = make(map[TransStreamId]ITransStream, 10)
} }
s.transStreams[transStreamId] = transStream s.transStreams[transStreamId] = transStream
for i := 0; i < index; i++ { for i := 0; i < size; i++ {
transStream.AddTrack(streams[i]) transStream.AddTrack(streams[i])
} }
@@ -249,22 +241,42 @@ func (s *SourceImpl) AddSink(sink ISink) bool {
} }
if AppConfig.GOPCache > 0 && !ok { if AppConfig.GOPCache > 0 && !ok {
//先交叉发送 indexs := make([]int, size)
for i := 0; i < bufferCount; i++ {
for _, stream := range streams[:index] { for {
buffer := s.buffers[stream.Index()] min := int64(0xFFFFFFFF)
packet := buffer.Peek(i).(utils.AVPacket)
transStream.Input(packet) for index, stream := range streams[:size] {
size := s.buffers[stream.Index()].Size()
if size == indexs[index] {
continue
}
pkt := s.buffers[stream.Index()].Peek(indexs[index]).(utils.AVPacket)
v := pkt.Dts()
if min == 0xFFFFFFFF {
min = v
} else if v < min {
v = min
}
} }
}
//发送超过最低缓存数的缓存包 if min == 0xFFFFFFFF {
for _, stream := range streams[:index] { break
buffer := s.buffers[stream.Index()] }
for i := bufferCount; i > buffer.Size(); i++ { for index, stream := range streams[:size] {
packet := buffer.Peek(i).(utils.AVPacket) buffer := s.buffers[stream.Index()]
transStream.Input(packet) size := buffer.Size()
if size == indexs[index] {
continue
}
for i := indexs[index]; i < buffer.Size(); i++ {
packet := buffer.Peek(i).(utils.AVPacket)
transStream.Input(packet)
indexs[index]++
}
} }
} }
} }