@zwa73/utils 1.0.158 → 1.0.160
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/UtilFfmpegTools.js +48 -19
- package/package.json +1 -1
- package/src/UtilFfmpegTools.ts +48 -19
package/dist/UtilFfmpegTools.js
CHANGED
|
@@ -72,11 +72,16 @@ class SFfmpegTool {
|
|
|
72
72
|
static async flac2ogg(inputFlacFile, outputOggPath, quality = 10) {
|
|
73
73
|
let wavPath = pathe_1.default.join(pathe_1.default.dirname(inputFlacFile), `tmp_${pathe_1.default.basename(inputFlacFile, ".flac")}.wav`);
|
|
74
74
|
await new Promise((resolve, reject) => {
|
|
75
|
-
(0, fluent_ffmpeg_1.default)(inputFlacFile)
|
|
75
|
+
const ins = (0, fluent_ffmpeg_1.default)(inputFlacFile)
|
|
76
76
|
.audioCodec("pcm_s16le")
|
|
77
77
|
.save(wavPath)
|
|
78
|
-
.on("end",
|
|
79
|
-
resolve(
|
|
78
|
+
.on("end", () => {
|
|
79
|
+
resolve(true);
|
|
80
|
+
ins.kill('SIGTERM');
|
|
81
|
+
})
|
|
82
|
+
.on("error", (err) => {
|
|
83
|
+
reject(err);
|
|
84
|
+
ins.kill('SIGTERM');
|
|
80
85
|
});
|
|
81
86
|
});
|
|
82
87
|
await SFfmpegTool.wav2ogg(wavPath, outputOggPath, quality);
|
|
@@ -100,12 +105,18 @@ class SFfmpegTool {
|
|
|
100
105
|
//.audioChannels(channels)
|
|
101
106
|
//.noMetadata()
|
|
102
107
|
return new Promise((resolve, reject) => {
|
|
103
|
-
(0, fluent_ffmpeg_1.default)(inputWavPath)
|
|
108
|
+
const ins = (0, fluent_ffmpeg_1.default)(inputWavPath)
|
|
104
109
|
.audioQuality(quality)
|
|
105
110
|
.audioCodec("libvorbis")
|
|
106
111
|
.save(outputOggPath)
|
|
107
|
-
.on("end", () =>
|
|
108
|
-
|
|
112
|
+
.on("end", () => {
|
|
113
|
+
resolve(true);
|
|
114
|
+
ins.kill('SIGTERM');
|
|
115
|
+
})
|
|
116
|
+
.on("error", (err) => {
|
|
117
|
+
reject(err);
|
|
118
|
+
ins.kill('SIGTERM');
|
|
119
|
+
});
|
|
109
120
|
});
|
|
110
121
|
}
|
|
111
122
|
/**剪切音频
|
|
@@ -116,12 +127,18 @@ class SFfmpegTool {
|
|
|
116
127
|
*/
|
|
117
128
|
static async cutAudio(audioPath, outPath, start, time) {
|
|
118
129
|
return new Promise((resolve, reject) => {
|
|
119
|
-
(0, fluent_ffmpeg_1.default)(audioPath)
|
|
130
|
+
const ins = (0, fluent_ffmpeg_1.default)(audioPath)
|
|
120
131
|
.setStartTime(start)
|
|
121
132
|
.setDuration(time)
|
|
122
133
|
.save(outPath)
|
|
123
|
-
.on("end", () =>
|
|
124
|
-
|
|
134
|
+
.on("end", () => {
|
|
135
|
+
resolve(true);
|
|
136
|
+
ins.kill('SIGTERM');
|
|
137
|
+
})
|
|
138
|
+
.on("error", (err) => {
|
|
139
|
+
reject(err);
|
|
140
|
+
ins.kill('SIGTERM');
|
|
141
|
+
});
|
|
125
142
|
});
|
|
126
143
|
}
|
|
127
144
|
/**删除首尾静音
|
|
@@ -132,14 +149,20 @@ class SFfmpegTool {
|
|
|
132
149
|
*/
|
|
133
150
|
static async trimSilence(inputWavPath, outputWavPath, threshold = -50, silence = 0.2) {
|
|
134
151
|
return new Promise((resolve, reject) => {
|
|
135
|
-
(0, fluent_ffmpeg_1.default)(inputWavPath)
|
|
152
|
+
const ins = (0, fluent_ffmpeg_1.default)(inputWavPath)
|
|
136
153
|
.audioFilters(`silenceremove=start_periods=1:start_threshold=${threshold}dB:start_silence=${silence}`)
|
|
137
154
|
.audioFilters("areverse")
|
|
138
155
|
.audioFilters(`silenceremove=start_periods=1:start_threshold=${threshold}dB:start_silence=${silence}`)
|
|
139
156
|
.audioFilters("areverse")
|
|
140
157
|
.save(outputWavPath)
|
|
141
|
-
.on("end", () =>
|
|
142
|
-
|
|
158
|
+
.on("end", () => {
|
|
159
|
+
resolve(true);
|
|
160
|
+
ins.kill('SIGTERM');
|
|
161
|
+
})
|
|
162
|
+
.on("error", (err) => {
|
|
163
|
+
reject(err);
|
|
164
|
+
ins.kill('SIGTERM');
|
|
165
|
+
});
|
|
143
166
|
});
|
|
144
167
|
}
|
|
145
168
|
/**重采样
|
|
@@ -148,11 +171,17 @@ class SFfmpegTool {
|
|
|
148
171
|
*/
|
|
149
172
|
static async resample(inputWavPath, outputWavPath, rate = 22050) {
|
|
150
173
|
return new Promise((resolve, reject) => {
|
|
151
|
-
(0, fluent_ffmpeg_1.default)(inputWavPath)
|
|
174
|
+
const ins = (0, fluent_ffmpeg_1.default)(inputWavPath)
|
|
152
175
|
.audioFrequency(rate)
|
|
153
176
|
.save(outputWavPath)
|
|
154
|
-
.on("end", () =>
|
|
155
|
-
|
|
177
|
+
.on("end", () => {
|
|
178
|
+
resolve(true);
|
|
179
|
+
ins.kill('SIGTERM');
|
|
180
|
+
})
|
|
181
|
+
.on("error", (err) => {
|
|
182
|
+
reject(err);
|
|
183
|
+
ins.kill('SIGTERM');
|
|
184
|
+
});
|
|
156
185
|
});
|
|
157
186
|
}
|
|
158
187
|
//多线程处理
|
|
@@ -162,7 +191,7 @@ class SFfmpegTool {
|
|
|
162
191
|
* @param cpCount - 并发数
|
|
163
192
|
*/
|
|
164
193
|
static async wav2oggMP(ioMap, quality = 10, cpCount = 16) {
|
|
165
|
-
await new UtilClass_1.Stream(Object.entries(ioMap))
|
|
194
|
+
await new UtilClass_1.Stream(Object.entries(ioMap), cpCount)
|
|
166
195
|
.map(async ([inPath, outPath]) => {
|
|
167
196
|
UtilLogger_1.SLogger.info(`SFfmpegTool.wav2oggMP 正在处理:${outPath}`);
|
|
168
197
|
await SFfmpegTool.wav2ogg(inPath, outPath, quality);
|
|
@@ -175,7 +204,7 @@ class SFfmpegTool {
|
|
|
175
204
|
* @param cpCount - 并发数
|
|
176
205
|
*/
|
|
177
206
|
static async flac2oggMP(ioMap, quality = 10, cpCount = 16) {
|
|
178
|
-
await new UtilClass_1.Stream(Object.entries(ioMap))
|
|
207
|
+
await new UtilClass_1.Stream(Object.entries(ioMap), cpCount)
|
|
179
208
|
.map(async ([inPath, outPath]) => {
|
|
180
209
|
UtilLogger_1.SLogger.info(`SFfmpegTool.flac2oggMP 正在处理:${outPath}`);
|
|
181
210
|
await SFfmpegTool.flac2ogg(inPath, outPath, quality);
|
|
@@ -188,7 +217,7 @@ class SFfmpegTool {
|
|
|
188
217
|
* @param silence - 保留静音时长
|
|
189
218
|
*/
|
|
190
219
|
static async trimSilenceMP(ioMap, threshold = -50, silence = 0.2, cpCount = 16) {
|
|
191
|
-
await new UtilClass_1.Stream(Object.entries(ioMap))
|
|
220
|
+
await new UtilClass_1.Stream(Object.entries(ioMap), cpCount)
|
|
192
221
|
.map(async ([inPath, outPath]) => {
|
|
193
222
|
UtilLogger_1.SLogger.info(`SFfmpegTool.trimSilenceMP 正在处理:${outPath}`);
|
|
194
223
|
await SFfmpegTool.trimSilence(inPath, outPath, threshold, silence);
|
|
@@ -201,7 +230,7 @@ class SFfmpegTool {
|
|
|
201
230
|
* @param cpCount - 并发数
|
|
202
231
|
*/
|
|
203
232
|
static async resampleMP(ioMap, rate = 22050, cpCount = 16) {
|
|
204
|
-
await new UtilClass_1.Stream(Object.entries(ioMap))
|
|
233
|
+
await new UtilClass_1.Stream(Object.entries(ioMap), cpCount)
|
|
205
234
|
.map(async ([inPath, outPath]) => {
|
|
206
235
|
UtilLogger_1.SLogger.info(`SFfmpegTool.resampleMP 正在处理:${outPath}`);
|
|
207
236
|
await SFfmpegTool.resample(inPath, outPath, rate);
|
package/package.json
CHANGED
package/src/UtilFfmpegTools.ts
CHANGED
|
@@ -58,11 +58,16 @@ class SFfmpegTool {
|
|
|
58
58
|
`tmp_${path.basename(inputFlacFile, ".flac")}.wav`
|
|
59
59
|
);
|
|
60
60
|
await new Promise((resolve, reject) => {
|
|
61
|
-
fluentFfmpeg(inputFlacFile)
|
|
61
|
+
const ins = fluentFfmpeg(inputFlacFile)
|
|
62
62
|
.audioCodec("pcm_s16le")
|
|
63
63
|
.save(wavPath)
|
|
64
|
-
.on("end",
|
|
65
|
-
resolve(
|
|
64
|
+
.on("end", () => {
|
|
65
|
+
resolve(true);
|
|
66
|
+
ins.kill('SIGTERM');
|
|
67
|
+
})
|
|
68
|
+
.on("error", (err) => {
|
|
69
|
+
reject(err);
|
|
70
|
+
ins.kill('SIGTERM');
|
|
66
71
|
});
|
|
67
72
|
});
|
|
68
73
|
await SFfmpegTool.wav2ogg(wavPath, outputOggPath, quality);
|
|
@@ -89,12 +94,18 @@ class SFfmpegTool {
|
|
|
89
94
|
//.audioChannels(channels)
|
|
90
95
|
//.noMetadata()
|
|
91
96
|
return new Promise((resolve, reject) => {
|
|
92
|
-
fluentFfmpeg(inputWavPath)
|
|
97
|
+
const ins = fluentFfmpeg(inputWavPath)
|
|
93
98
|
.audioQuality(quality)
|
|
94
99
|
.audioCodec("libvorbis")
|
|
95
100
|
.save(outputOggPath)
|
|
96
|
-
.on("end", () =>
|
|
97
|
-
|
|
101
|
+
.on("end", () => {
|
|
102
|
+
resolve(true);
|
|
103
|
+
ins.kill('SIGTERM');
|
|
104
|
+
})
|
|
105
|
+
.on("error", (err) => {
|
|
106
|
+
reject(err);
|
|
107
|
+
ins.kill('SIGTERM');
|
|
108
|
+
});
|
|
98
109
|
});
|
|
99
110
|
}
|
|
100
111
|
/**剪切音频
|
|
@@ -110,12 +121,18 @@ class SFfmpegTool {
|
|
|
110
121
|
time: number
|
|
111
122
|
): Promise<boolean> {
|
|
112
123
|
return new Promise((resolve, reject) => {
|
|
113
|
-
fluentFfmpeg(audioPath)
|
|
124
|
+
const ins = fluentFfmpeg(audioPath)
|
|
114
125
|
.setStartTime(start)
|
|
115
126
|
.setDuration(time)
|
|
116
127
|
.save(outPath)
|
|
117
|
-
.on("end", () =>
|
|
118
|
-
|
|
128
|
+
.on("end", () => {
|
|
129
|
+
resolve(true);
|
|
130
|
+
ins.kill('SIGTERM');
|
|
131
|
+
})
|
|
132
|
+
.on("error", (err) => {
|
|
133
|
+
reject(err);
|
|
134
|
+
ins.kill('SIGTERM');
|
|
135
|
+
});
|
|
119
136
|
});
|
|
120
137
|
}
|
|
121
138
|
/**删除首尾静音
|
|
@@ -131,7 +148,7 @@ class SFfmpegTool {
|
|
|
131
148
|
silence: number = 0.2
|
|
132
149
|
): Promise<boolean> {
|
|
133
150
|
return new Promise((resolve, reject) => {
|
|
134
|
-
fluentFfmpeg(inputWavPath)
|
|
151
|
+
const ins = fluentFfmpeg(inputWavPath)
|
|
135
152
|
.audioFilters(
|
|
136
153
|
`silenceremove=start_periods=1:start_threshold=${threshold}dB:start_silence=${silence}`
|
|
137
154
|
)
|
|
@@ -141,8 +158,14 @@ class SFfmpegTool {
|
|
|
141
158
|
)
|
|
142
159
|
.audioFilters("areverse")
|
|
143
160
|
.save(outputWavPath)
|
|
144
|
-
.on("end", () =>
|
|
145
|
-
|
|
161
|
+
.on("end", () => {
|
|
162
|
+
resolve(true);
|
|
163
|
+
ins.kill('SIGTERM');
|
|
164
|
+
})
|
|
165
|
+
.on("error", (err) => {
|
|
166
|
+
reject(err);
|
|
167
|
+
ins.kill('SIGTERM');
|
|
168
|
+
});
|
|
146
169
|
});
|
|
147
170
|
}
|
|
148
171
|
/**重采样
|
|
@@ -151,11 +174,17 @@ class SFfmpegTool {
|
|
|
151
174
|
*/
|
|
152
175
|
static async resample(inputWavPath: string, outputWavPath: string, rate: number = 22050): Promise<boolean> {
|
|
153
176
|
return new Promise((resolve, reject) => {
|
|
154
|
-
fluentFfmpeg(inputWavPath)
|
|
177
|
+
const ins = fluentFfmpeg(inputWavPath)
|
|
155
178
|
.audioFrequency(rate)
|
|
156
179
|
.save(outputWavPath)
|
|
157
|
-
.on("end", () =>
|
|
158
|
-
|
|
180
|
+
.on("end", () => {
|
|
181
|
+
resolve(true);
|
|
182
|
+
ins.kill('SIGTERM');
|
|
183
|
+
})
|
|
184
|
+
.on("error", (err) => {
|
|
185
|
+
reject(err);
|
|
186
|
+
ins.kill('SIGTERM');
|
|
187
|
+
});
|
|
159
188
|
});
|
|
160
189
|
}
|
|
161
190
|
|
|
@@ -166,7 +195,7 @@ class SFfmpegTool {
|
|
|
166
195
|
* @param cpCount - 并发数
|
|
167
196
|
*/
|
|
168
197
|
static async wav2oggMP(ioMap: IOMap, quality = 10, cpCount = 16) {
|
|
169
|
-
await new Stream(Object.entries(ioMap))
|
|
198
|
+
await new Stream(Object.entries(ioMap),cpCount)
|
|
170
199
|
.map(async ([inPath, outPath]) => {
|
|
171
200
|
SLogger.info(`SFfmpegTool.wav2oggMP 正在处理:${outPath}`);
|
|
172
201
|
await SFfmpegTool.wav2ogg(inPath, outPath, quality);
|
|
@@ -183,7 +212,7 @@ class SFfmpegTool {
|
|
|
183
212
|
quality: number = 10,
|
|
184
213
|
cpCount: number = 16
|
|
185
214
|
) {
|
|
186
|
-
await new Stream(Object.entries(ioMap))
|
|
215
|
+
await new Stream(Object.entries(ioMap),cpCount)
|
|
187
216
|
.map(async ([inPath, outPath]) => {
|
|
188
217
|
SLogger.info(`SFfmpegTool.flac2oggMP 正在处理:${outPath}`);
|
|
189
218
|
await SFfmpegTool.flac2ogg(inPath, outPath, quality);
|
|
@@ -201,7 +230,7 @@ class SFfmpegTool {
|
|
|
201
230
|
silence: number = 0.2,
|
|
202
231
|
cpCount: number = 16
|
|
203
232
|
) {
|
|
204
|
-
await new Stream(Object.entries(ioMap))
|
|
233
|
+
await new Stream(Object.entries(ioMap),cpCount)
|
|
205
234
|
.map(async ([inPath, outPath]) => {
|
|
206
235
|
SLogger.info(`SFfmpegTool.trimSilenceMP 正在处理:${outPath}`);
|
|
207
236
|
await SFfmpegTool.trimSilence(inPath, outPath, threshold, silence);
|
|
@@ -215,7 +244,7 @@ class SFfmpegTool {
|
|
|
215
244
|
* @param cpCount - 并发数
|
|
216
245
|
*/
|
|
217
246
|
static async resampleMP(ioMap: IOMap, rate: number = 22050, cpCount: number = 16) {
|
|
218
|
-
await new Stream(Object.entries(ioMap))
|
|
247
|
+
await new Stream(Object.entries(ioMap),cpCount)
|
|
219
248
|
.map(async ([inPath, outPath]) => {
|
|
220
249
|
SLogger.info(`SFfmpegTool.resampleMP 正在处理:${outPath}`);
|
|
221
250
|
await SFfmpegTool.resample(inPath, outPath, rate);
|