lal icon indicating copy to clipboard operation
lal copied to clipboard

自定义推流情况下 hls和flv首屏播放和延迟时间相差30+秒

Open cuteLittleDevil opened this issue 2 years ago • 4 comments

流程: 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处理较慢或者卡着了 1662103958302

1662104402229

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

cuteLittleDevil avatar Sep 02 '22 07:09 cuteLittleDevil

jt1078推流对应的hls正常吗,为啥不直接用jt1078对应的拉流,

q191201771 avatar Sep 04 '22 07:09 q191201771

jt1078推流对应的hls一样不对 就想在拉新的流 用新的流去推流试一试

cuteLittleDevil avatar Sep 05 '22 01:09 cuteLittleDevil

1662341500997

直接拉的话 如图所示 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的首屏打开时间也大致差这么多

cuteLittleDevil avatar Sep 05 '22 01:09 cuteLittleDevil

image

			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判断)

cuteLittleDevil avatar Sep 05 '22 01:09 cuteLittleDevil

超时关闭。

q191201771 avatar Mar 21 '23 12:03 q191201771