feat: wait keyframe mode

This commit is contained in:
langhuihui
2024-07-22 13:18:02 +08:00
parent 30c8d5e4eb
commit 56130d5339
2 changed files with 22 additions and 1 deletions

View File

@@ -61,7 +61,7 @@ type Subscribe struct {
SubAudioTracks []string `desc:"指定订阅的音频轨道"` // 指定订阅的音频轨道
SubVideoTracks []string `desc:"指定订阅的视频轨道"` // 指定订阅的视频轨道
SubDataTracks []string `desc:"指定订阅的数据轨道"` // 指定订阅的数据轨道
SubMode int `desc:"订阅模式" enum:"0:实时模式,1:首屏后不进行追赶,2:从缓冲最大的关键帧开始播放"` // 0实时模式追赶发布者进度在播放首屏后等待发布者的下一个关键帧然后跳到该帧。1、首屏后不进行追赶。2、从缓冲最大的关键帧开始播放也不追赶需要发布者配置缓存长度
SubMode int `desc:"订阅模式" enum:"0:实时模式,1:首屏后不进行追赶,2:从缓冲最大的关键帧开始播放,3:等待关键帧"` // 0实时模式追赶发布者进度在播放首屏后等待发布者的下一个关键帧然后跳到该帧。1、首屏后不进行追赶。2、从缓冲最大的关键帧开始播放也不追赶需要发布者配置缓存长度3、等待发布者的关键帧。
SyncMode int `desc:"同步模式" enum:"0:采用时间戳同步,1:采用写入时间同步"` // 0采用时间戳同步1采用写入时间同步
IFrameOnly bool `desc:"只要关键帧"` // 只要关键帧
WaitTimeout time.Duration `default:"10s" desc:"等待流超时时间"` // 等待流超时

View File

@@ -13,11 +13,13 @@ const (
READSTATE_INIT = iota
READSTATE_FIRST
READSTATE_NORMAL
READSTATE_WAITKEY
)
const (
SUBMODE_REAL = iota
SUBMODE_NOJUMP
SUBMODE_BUFFER
SUBMODE_WAITKEY
)
var ErrDiscard = errors.New("discard")
@@ -89,6 +91,13 @@ func (r *AVRingReader) ReadFrame(mode int) (err error) {
r.Info("buffer mode", zap.Duration("time", r.Track.LastValue.Timestamp-r.Track.HistoryRing.Value.Timestamp))
}
r.State = READSTATE_NORMAL
case SUBMODE_WAITKEY:
startRing = r.Track.Ring
if startRing == r.Track.IDRing {
r.State = READSTATE_NORMAL
} else {
r.State = READSTATE_WAITKEY
}
}
if err = r.StartRead(startRing); err != nil {
return
@@ -127,6 +136,18 @@ func (r *AVRingReader) ReadFrame(mode int) (err error) {
time.Sleep(fast)
}
}
case READSTATE_WAITKEY:
r.Debug("wait key frame", zap.Uint32("seq", r.Track.Value.Sequence))
for {
if err = r.readFrame(); err != nil {
return
}
if r.Value.IFrame {
r.Debug("got key frame", zap.Uint32("seq", r.Track.Value.Sequence))
r.State = READSTATE_NORMAL
break
}
}
}
r.AbsTime = uint32((r.Value.Timestamp - r.SkipTs).Milliseconds())
if r.AbsTime == 0 {