mirror of
https://github.com/Monibuca/engine.git
synced 2025-12-24 13:18:07 +08:00
feat: wait keyframe mode
This commit is contained in:
@@ -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:"等待流超时时间"` // 等待流超时
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user