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
|
import { FFmpegCommandWrapper, FFmpegCommandWrapperOptions } from './ffmpeg-command-wrapper.js'
import { getVideoStreamDuration } from './ffprobe.js'
export class FFmpegImage {
private readonly commandWrapper: FFmpegCommandWrapper
constructor (options: FFmpegCommandWrapperOptions) {
this.commandWrapper = new FFmpegCommandWrapper(options)
}
convertWebPToJPG (options: {
path: string
destination: string
}): Promise<void> {
const { path, destination } = options
this.commandWrapper.buildCommand(path)
.output(destination)
return this.commandWrapper.runCommand({ silent: true })
}
processGIF (options: {
path: string
destination: string
newSize: { width: number, height: number }
}): Promise<void> {
const { path, destination, newSize } = options
this.commandWrapper.buildCommand(path)
.fps(20)
.size(`${newSize.width}x${newSize.height}`)
.output(destination)
return this.commandWrapper.runCommand()
}
async generateThumbnailFromVideo (options: {
fromPath: string
output: string
}) {
const { fromPath, output } = options
let duration = await getVideoStreamDuration(fromPath)
if (isNaN(duration)) duration = 0
this.commandWrapper.buildCommand(fromPath)
.seekInput(duration / 2)
.videoFilter('thumbnail=500')
.outputOption('-frames:v 1')
.output(output)
return this.commandWrapper.runCommand()
}
async generateStoryboardFromVideo (options: {
path: string
destination: string
sprites: {
size: {
width: number
height: number
}
count: {
width: number
height: number
}
duration: number
}
}) {
const { path, destination, sprites } = options
const command = this.commandWrapper.buildCommand(path)
const filter = [
`setpts=N/round(FRAME_RATE)/TB`,
`select='not(mod(t,${options.sprites.duration}))'`,
`scale=${sprites.size.width}:${sprites.size.height}`,
`tile=layout=${sprites.count.width}x${sprites.count.height}`
].join(',')
command.outputOption('-filter_complex', filter)
command.outputOption('-frames:v', '1')
command.outputOption('-q:v', '2')
command.output(destination)
return this.commandWrapper.runCommand()
}
}
|