-
Notifications
You must be signed in to change notification settings - Fork 228
/
sub_unit.go
138 lines (113 loc) · 4.43 KB
/
sub_unit.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package sub_helper
import (
"fmt"
"github.com/allanpk716/ChineseSubFinder/internal/pkg/my_util"
"github.com/allanpk716/ChineseSubFinder/internal/pkg/vad"
"math"
"time"
)
type SubUnit struct {
baseTime time.Time // 这个是基础的时间,后续需要减去这个,不然与导出的片段字幕去对比会有一个起始时间的偏差
offsetStartTime time.Time // 相对时间,这个时间会减去 baseTime 再存储
offsetEndTime time.Time // 相对时间,这个时间会减去 baseTime 再存储
VADList []vad.VADInfo
subCount int
firstAdd bool
}
func NewSubUnit() *SubUnit {
return &SubUnit{
VADList: make([]vad.VADInfo, 0),
subCount: 0,
firstAdd: false,
}
}
// AddAndInsert 添加一句对白进来,并且填充中间的空白,间隔 10ms
func (s *SubUnit) AddAndInsert(oneSubStartTime, oneSubEndTime time.Time) {
const perWindows = float64(vad.FrameDuration) / 1000
// 不是第一次添加,那么就需要把两句对白中间间隔的 active == false 的插入,插入间隙
if len(s.VADList) > 0 {
nowStartTime := s.RealTimeToOffsetTime(oneSubStartTime)
nowStartOffsetTime := my_util.Time2SecendNumber(nowStartTime)
nowEndOffsetTime := s.GetEndTimeNumber(false)
needAddRange := nowStartOffsetTime - nowEndOffsetTime
if needAddRange > perWindows {
for i := 0.0; i < needAddRange; {
s.VADList = append(s.VADList, *vad.NewVADInfoBase(false, time.Duration((s.GetEndTimeNumber(true)+i)*math.Pow10(9))))
i += perWindows
}
}
}
if s.firstAdd == false {
// 第一次 Add 需要给 baseTime 赋值
s.baseTime = oneSubStartTime
s.offsetStartTime = s.RealTimeToOffsetTime(oneSubStartTime)
s.firstAdd = true
}
s.offsetEndTime = oneSubEndTime.Add(-my_util.Time2Duration(s.baseTime))
nowStartTime := s.RealTimeToOffsetTime(oneSubStartTime)
nowEndTime := s.RealTimeToOffsetTime(oneSubEndTime)
nowStartOffsetTime := my_util.Time2SecendNumber(nowStartTime)
nowEndOffsetTime := my_util.Time2SecendNumber(nowEndTime)
needAddRange := nowEndOffsetTime - nowStartOffsetTime
if needAddRange > perWindows {
for i := 0.0; i < needAddRange; {
s.VADList = append(s.VADList, *vad.NewVADInfoBase(true, time.Duration((my_util.Time2SecendNumber(oneSubStartTime)+i)*math.Pow10(9))))
i += perWindows
}
}
s.subCount++
}
// GetDialogueCount 获取这个对白单元由几个对话
func (s SubUnit) GetDialogueCount() int {
return s.subCount
}
// GetStartTimeNumber 获取这个单元的起始时间,单位是秒
func (s SubUnit) GetStartTimeNumber(realOrOffsetTime bool) float64 {
return my_util.Time2SecendNumber(s.GetStartTime(realOrOffsetTime))
}
// GetStartTime 获取这个单元的起始时间
func (s SubUnit) GetStartTime(realOrOffsetTime bool) time.Time {
if realOrOffsetTime == true {
return s.offsetStartTime.Add(my_util.Time2Duration(s.baseTime))
} else {
return s.offsetStartTime
}
}
// GetEndTimeNumber 获取这个单元的结束时间,单位是秒
func (s SubUnit) GetEndTimeNumber(realOrOffsetTime bool) float64 {
return my_util.Time2SecendNumber(s.GetEndTime(realOrOffsetTime))
}
// GetEndTime 获取这个单元的起始时间
func (s SubUnit) GetEndTime(realOrOffsetTime bool) time.Time {
if realOrOffsetTime == true {
return s.offsetEndTime.Add(my_util.Time2Duration(s.baseTime))
} else {
return s.offsetEndTime
}
}
// GetTimelineRange 开始到结束的时间长度,单位是秒
func (s SubUnit) GetTimelineRange() float64 {
return s.GetEndTimeNumber(false) - s.GetStartTimeNumber(false)
}
// GetOffsetTimeNumber 偏移时间,单位是秒
func (s SubUnit) GetOffsetTimeNumber() float64 {
return my_util.Time2SecendNumber(s.baseTime)
}
// GetFFMPEGCutRange 这里会生成导出 FFMPEG 的参数字段,起始时间和结束的时间长度
func (s SubUnit) GetFFMPEGCutRange(expandTimeRange float64) (string, string) {
var tmpStartTime time.Time
if s.GetStartTimeNumber(true)-expandTimeRange < 0 {
tmpStartTime = time.Time{}
} else {
startTime := s.GetStartTime(true)
subTime := time.Duration(expandTimeRange) * time.Second
tmpStartTime = startTime.Add(-subTime)
}
return fmt.Sprintf("%d:%d:%d.%d", tmpStartTime.Hour(), tmpStartTime.Minute(), tmpStartTime.Second(), tmpStartTime.Nanosecond()/1000/1000),
fmt.Sprintf("%f", s.GetTimelineRange()+expandTimeRange)
}
// RealTimeToOffsetTime 真实时间转偏移时间
func (s SubUnit) RealTimeToOffsetTime(realTime time.Time) time.Time {
dd := my_util.Time2Duration(s.baseTime)
return realTime.Add(-dd)
}