lal
lal copied to clipboard
自定义推流情况下 hls和flv首屏播放和延迟时间相差30+秒
流程: 1 jt1078推流 2 rtsp拉流 rtsp://49.234.235.7:5544/test 3 使用2的拉流去推流 start_relay_pull接口 stream_name=test110 auto_stop_pull_after_no_out_ms=15000000 4 使用3的test110拉流 http://49.234.235.7:8080/hls/test110.m3u8
问题:
1 这几个流我都打开了 然后发现hls的打开延迟30+秒 并且和flv或rtsp流的也是差30+秒
2 是因为什么处理异常吗 导致session.FeedAvPacket处理较慢或者卡着了
const (
customizePubStreamName = "test"
)
session, err := lals.AddCustomizePubSession(customizePubStreamName)
nazalog.Assert(nil, err)
session.WithOption(func(option *base.AvPacketStreamOption) {
option.VideoFormat = base.AvPacketStreamVideoFormatAnnexb
})
oldData := map[jt1078.DataType][]byte{}
videoPacketCh := make(chan protocol.Message, 10)
go func() {
var (
once sync.Once
startTs int64
startRealTime time.Time
)
for v := range videoPacketCh {
once.Do(func() {
startTs = v.Timestamp
startRealTime = time.Now()
})
diffTs := v.Timestamp - startTs
diffReal := time.Now().Sub(startRealTime).Milliseconds()
fmt.Println(fmt.Sprintf("[%s] [%s] len[%d] timestamp[%d] [%d] [%d] ts-[%d] rl-[%d]",
v.DataType.String(), v.SubPackageType.String(), len(v.Data), v.Timestamp,
v.LastIFrameInterval, v.LastFrameInterval, diffTs, diffReal))
if diffTs > diffReal {
time.Sleep(time.Duration(diffTs-diffReal) * time.Millisecond)
if diffTs > diffReal+50 && v.DataType == jt1078.DataTypeI0000 {
startTs = v.Timestamp
startRealTime = time.Now()
}
}
packet := base.AvPacket{
PayloadType: base.AvPacketPtAvc,
Timestamp: v.Timestamp,
Payload: v.Data,
}
session.FeedAvPacket(packet)
}
}()
for {
msg := <-testMsg
isComplete := false
switch msg.SubPackageType {
case jt1078.SubPackageTypeAtomic0000:
oldData[msg.DataType] = msg.Data
isComplete = true
case jt1078.SubPackageTypeFirst0001:
oldData[msg.DataType] = nil
oldData[msg.DataType] = msg.Data
case jt1078.SubPackageTypeLast0010:
oldData[msg.DataType] = append(oldData[msg.DataType], msg.Data...)
isComplete = true
case jt1078.SubPackageTypeMiddle0011:
oldData[msg.DataType] = append(oldData[msg.DataType], msg.Data...)
default:
}
if !isComplete {
continue
}
msg.Data = oldData[msg.DataType]
select {
case videoPacketCh <- msg:
default:
fmt.Println("数据处理中 本次数据抛弃", time.Now())
panic(any("123"))
}
}
}
jt1078推流对应的hls正常吗,为啥不直接用jt1078对应的拉流,
jt1078推流对应的hls一样不对 就想在拉新的流 用新的流去推流试一试
直接拉的话 如图所示 1 hls http://49.234.235.7:8080/hls/test.m3u8 9:30:00 2 flv http://49.234.235.7:8080/test.flv 9:30:34 一般都是相差30+秒 如何hls的首屏打开时间也大致差这么多
startTime := time.Now()
fmt.Println("start time is ", startTime)
session.FeedAvPacket(packet)
endTime := time.Now()
fmt.Println("end time is ", endTime, time.Since(startTime))
还有就是这种情况FeedAvPacket会卡住 (通过打印了startTime 没有打印 endTime判断)
超时关闭。