fix: record write time

This commit is contained in:
langhuihui
2025-06-23 16:48:31 +08:00
parent ac3ad009a7
commit 0d3d86518d
2 changed files with 21 additions and 20 deletions

View File

@@ -185,13 +185,6 @@ func (r *Recorder) Run() (err error) {
ctx := &r.RecordJob
suber := ctx.Subscriber
noFragment := ctx.RecConf.Fragment == 0 || ctx.RecConf.Append
startTime := time.Now()
if ctx.Event.BeforeDuration > 0 {
startTime = startTime.Add(-time.Duration(ctx.Event.BeforeDuration) * time.Millisecond)
}
if err = r.createStream(startTime); err != nil {
return
}
if noFragment {
file, err = os.OpenFile(r.Event.FilePath, os.O_CREATE|os.O_RDWR|util.Conditional(ctx.RecConf.Append, os.O_APPEND, os.O_TRUNC), 0666)
if err != nil {
@@ -235,14 +228,14 @@ func (r *Recorder) Run() (err error) {
_, err = file.Write(FLVHead)
}
writer := NewFlvWriter(file)
checkFragment := func(absTime uint32) {
checkFragment := func(absTime uint32, writeTime time.Time) {
if duration = int64(absTime); time.Duration(duration)*time.Millisecond >= ctx.RecConf.Fragment {
writeMetaTag(file, suber, filepositions, times, &duration)
r.writeTailer(time.Now())
r.writeTailer(writeTime)
filepositions = []uint64{0}
times = []float64{0}
offset = 0
if err = r.createStream(time.Now()); err != nil {
if err = r.createStream(writeTime); err != nil {
return
}
if file, err = os.OpenFile(r.Event.FilePath, os.O_CREATE|os.O_RDWR, 0666); err != nil {
@@ -268,18 +261,30 @@ func (r *Recorder) Run() (err error) {
}
return m7s.PlayBlock(ctx.Subscriber, func(audio *rtmp.RTMPAudio) (err error) {
if r.Event.StartTime.IsZero() {
err = r.createStream(suber.AudioReader.Value.WriteTime)
if err != nil {
return err
}
}
if suber.VideoReader == nil && !noFragment {
checkFragment(suber.AudioReader.AbsTime)
checkFragment(suber.AudioReader.AbsTime, suber.AudioReader.Value.WriteTime)
}
err = writer.WriteTag(FLV_TAG_TYPE_AUDIO, suber.AudioReader.AbsTime, uint32(audio.Size), audio.Buffers...)
offset += int64(audio.Size + 15)
return
}, func(video *rtmp.RTMPVideo) (err error) {
if r.Event.StartTime.IsZero() {
err = r.createStream(suber.VideoReader.Value.WriteTime)
if err != nil {
return err
}
}
if suber.VideoReader.Value.IDR {
filepositions = append(filepositions, uint64(offset))
times = append(times, float64(suber.VideoReader.AbsTime)/1000)
if !noFragment {
checkFragment(suber.VideoReader.AbsTime)
checkFragment(suber.VideoReader.AbsTime, suber.VideoReader.Value.WriteTime)
}
}
err = writer.WriteTag(FLV_TAG_TYPE_VIDEO, suber.VideoReader.AbsTime, uint32(video.Size), video.Buffers...)

View File

@@ -68,7 +68,7 @@ func (r *Recorder) createNewTs() {
}
}
func (r *Recorder) writeSegment(ts time.Duration) (err error) {
func (r *Recorder) writeSegment(ts time.Duration, writeTime time.Time) (err error) {
if dur := ts - r.lastTs; dur >= r.RecordJob.RecConf.Fragment || r.lastTs == 0 {
if dur == ts && r.lastTs == 0 { //时间戳不对的情况首个默认为2s
dur = time.Duration(2) * time.Second
@@ -82,10 +82,10 @@ func (r *Recorder) writeSegment(ts time.Duration) (err error) {
}
// 结束当前片段的记录
r.writeTailer(time.Now())
r.writeTailer(writeTime)
// 创建新的数据库记录
err = r.createStream(time.Now())
err = r.createStream(writeTime)
if err != nil {
return
}
@@ -102,10 +102,6 @@ func (r *Recorder) Run() (err error) {
ctx := &r.RecordJob
suber := ctx.Subscriber
startTime := time.Now()
if ctx.Event.BeforeDuration > 0 {
startTime = startTime.Add(-time.Duration(ctx.Event.BeforeDuration) * time.Millisecond)
}
// 创建第一个片段记录
if err = r.createStream(startTime); err != nil {
return
@@ -139,7 +135,7 @@ func (r *Recorder) ProcessADTS(audio *pkg.ADTS) (err error) {
func (r *Recorder) ProcessAnnexB(video *pkg.AnnexB) (err error) {
if r.RecordJob.Subscriber.VideoReader.Value.IDR {
if err = r.writeSegment(video.GetTimestamp()); err != nil {
if err = r.writeSegment(video.GetTimestamp(), r.RecordJob.Subscriber.VideoReader.Value.WriteTime); err != nil {
return
}
}