mirror of
https://github.com/lkmio/lkm.git
synced 2025-09-27 11:32:26 +08:00
优化缓存发包策略
This commit is contained in:
@@ -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]++
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user