-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathffmpeg_command.go
More file actions
83 lines (75 loc) · 2.4 KB
/
Copy pathffmpeg_command.go
File metadata and controls
83 lines (75 loc) · 2.4 KB
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
package ffimage
import (
"strconv"
"strings"
)
func (i *Image) buildFFmpegArgs(outputPath string, outputFormat ImageFormat) []string {
args := []string{"-i", i.Path}
filters := strings.Join(i.output.filters, ",")
switch outputFormat {
case ImageFormatGIF:
filterGraph := "[0:v]" + filters + ",split=2[gif_source][palette_source];" +
"[palette_source]palettegen[palette];" +
"[gif_source][palette]paletteuse[output]"
args = append(args, "-filter_complex", filterGraph, "-map", "[output]")
case ImageFormatAVIF:
filterGraph := "[0:v]" + filters + ",split=2[rgb][alpha_source];" +
"[alpha_source]alphaextract[alpha];" +
"[rgb]format=rgba[color];" +
"[color][alpha]alphamerge[merged];" +
"[merged]format=yuva420p[yuva];" +
"[yuva]split=2[output_color][output_alpha_source];" +
"[output_alpha_source]alphaextract[output_alpha]"
args = append(args,
"-filter_complex", filterGraph,
"-map", "[output_color]",
"-map", "[output_alpha]",
)
default:
if filters != "" {
args = append(args, "-vf", filters)
}
}
args = append(args, "-map_metadata", "-1")
args = append(args, i.output.customArgs...)
if i.output.framerate != nil {
args = append(args, "-r", strconv.Itoa(*i.output.framerate))
}
if i.output.dropFrames {
args = append(args, "-vframes", "1")
}
if i.output.quality != 0 {
switch outputFormat {
case ImageFormatAVIF:
quality := qualityFactor(0, 63, i.output.quality, true)
args = append(args, "-crf", strconv.Itoa(quality))
case ImageFormatJPEG:
quality := qualityFactor(2, 31, i.output.quality, true)
args = append(args, "-qscale:v", strconv.Itoa(quality))
case ImageFormatJPEGXL:
quality := qualityFactor(0, 100, i.output.quality, false)
args = append(args, "-qscale:v", strconv.Itoa(quality))
case ImageFormatWEBP:
quality := qualityFactor(0, 100, i.output.quality, false)
args = append(args, "-quality", strconv.Itoa(quality))
}
}
if outputFormat == ImageFormatAPNG {
args = append(args, "-plays", strconv.Itoa(i.output.loop))
} else {
args = append(args, "-loop", strconv.Itoa(i.output.loop))
}
if outputFormat == ImageFormatAVIF {
if i.output.dropFrames || i.singleFrame {
args = append(args,
"-frames:v:0", "1",
"-frames:v:1", "1",
"-still-picture", "1",
)
} else if i.output.framerate == nil {
args = append(args, "-fps_mode", "passthrough")
}
}
args = append(args, outputPath, "-y")
return args
}