|
|
@ -3,9 +3,13 @@ package ffmpeg |
|
|
|
import ( |
|
|
|
"reflect" |
|
|
|
"strconv" |
|
|
|
"strings" |
|
|
|
) |
|
|
|
|
|
|
|
func argsBuilder(arg ...string) []string { |
|
|
|
var result []string |
|
|
|
return append(result, arg...) |
|
|
|
} |
|
|
|
|
|
|
|
func filterOptions(options ...Option) []Option { |
|
|
|
cache := make(map[reflect.Type]Option) |
|
|
|
for _, option := range options { |
|
|
@ -20,56 +24,44 @@ func filterOptions(options ...Option) []Option { |
|
|
|
} |
|
|
|
|
|
|
|
type Option interface { |
|
|
|
Option() string |
|
|
|
Option() []string |
|
|
|
} |
|
|
|
|
|
|
|
// VideoBitrate the bitrate of the video
|
|
|
|
type VideoBitrate string |
|
|
|
|
|
|
|
func (b VideoBitrate) Option() string { |
|
|
|
s := strings.Builder{} |
|
|
|
s.WriteString(`-b:v `) |
|
|
|
s.WriteString(string(b)) |
|
|
|
return s.String() |
|
|
|
func (b VideoBitrate) Option() []string { |
|
|
|
return argsBuilder("-b:v", string(b)) |
|
|
|
} |
|
|
|
|
|
|
|
// AudioBitrate the bitrate of the audio
|
|
|
|
type AudioBitrate string |
|
|
|
|
|
|
|
func (b AudioBitrate) Option() string { |
|
|
|
s := strings.Builder{} |
|
|
|
s.WriteString(`-b:a `) |
|
|
|
s.WriteString(string(b)) |
|
|
|
return s.String() |
|
|
|
func (b AudioBitrate) Option() []string { |
|
|
|
return argsBuilder("-b:a", string(b)) |
|
|
|
} |
|
|
|
|
|
|
|
// CustomOption a custom option that can be used to pass any option to ffmpeg
|
|
|
|
type CustomOption string |
|
|
|
|
|
|
|
func (o CustomOption) Option() string { |
|
|
|
return string(o) |
|
|
|
func (o CustomOption) Option() []string { |
|
|
|
return argsBuilder(string(o)) |
|
|
|
} |
|
|
|
|
|
|
|
type CRF int |
|
|
|
|
|
|
|
func (c CRF) Option() string { |
|
|
|
func (c CRF) Option() []string { |
|
|
|
intC := int(c) |
|
|
|
if intC < 0 || intC > 51 { |
|
|
|
panic("CRF must be between 0 and 51") |
|
|
|
} |
|
|
|
s := strings.Builder{} |
|
|
|
s.WriteString(`-crf `) |
|
|
|
s.WriteString(strconv.Itoa(intC)) |
|
|
|
return s.String() |
|
|
|
return argsBuilder("-crf", strconv.Itoa(intC)) |
|
|
|
} |
|
|
|
|
|
|
|
type Preset string |
|
|
|
|
|
|
|
func (p Preset) Option() string { |
|
|
|
s := strings.Builder{} |
|
|
|
s.WriteString(`-preset `) |
|
|
|
s.WriteString(string(p)) |
|
|
|
return s.String() |
|
|
|
func (p Preset) Option() []string { |
|
|
|
return argsBuilder("-preset", string(p)) |
|
|
|
} |
|
|
|
|
|
|
|
const ( |
|
|
@ -87,11 +79,8 @@ const ( |
|
|
|
|
|
|
|
type Tune string |
|
|
|
|
|
|
|
func (t Tune) Option() string { |
|
|
|
s := strings.Builder{} |
|
|
|
s.WriteString(`-tune `) |
|
|
|
s.WriteString(string(t)) |
|
|
|
return s.String() |
|
|
|
func (t Tune) Option() []string { |
|
|
|
return argsBuilder("-tune", string(t)) |
|
|
|
} |
|
|
|
|
|
|
|
const ( |
|
|
@ -107,11 +96,8 @@ const ( |
|
|
|
|
|
|
|
type H264Profile string |
|
|
|
|
|
|
|
func (p H264Profile) Option() string { |
|
|
|
s := strings.Builder{} |
|
|
|
s.WriteString(`-profile:v `) |
|
|
|
s.WriteString(string(p)) |
|
|
|
return s.String() |
|
|
|
func (p H264Profile) Option() []string { |
|
|
|
return argsBuilder("-profile:v", string(p)) |
|
|
|
} |
|
|
|
|
|
|
|
const ( |
|
|
@ -125,21 +111,18 @@ const ( |
|
|
|
|
|
|
|
type H265Quality string |
|
|
|
|
|
|
|
func (h H265Quality) Option() string { |
|
|
|
return string(h) |
|
|
|
func (h H265Quality) Option() []string { |
|
|
|
return argsBuilder(`-x265-params`, string(h)) |
|
|
|
} |
|
|
|
|
|
|
|
const ( |
|
|
|
H265QualityLossless = `-x265-params lossless=1` |
|
|
|
H265QualityLossless = `lossless=1` |
|
|
|
) |
|
|
|
|
|
|
|
type AMFQuality string |
|
|
|
|
|
|
|
func (a AMFQuality) Option() string { |
|
|
|
s := strings.Builder{} |
|
|
|
s.WriteString(`-quality `) |
|
|
|
s.WriteString(string(a)) |
|
|
|
return s.String() |
|
|
|
func (a AMFQuality) Option() []string { |
|
|
|
return argsBuilder("-quality", string(a)) |
|
|
|
} |
|
|
|
|
|
|
|
const ( |
|
|
@ -150,11 +133,8 @@ const ( |
|
|
|
|
|
|
|
type Accelerator string |
|
|
|
|
|
|
|
func (a Accelerator) Option() string { |
|
|
|
s := strings.Builder{} |
|
|
|
s.WriteString(`-hwaccel `) |
|
|
|
s.WriteString(string(a)) |
|
|
|
return s.String() |
|
|
|
func (a Accelerator) Option() []string { |
|
|
|
return argsBuilder("-hwaccel", string(a)) |
|
|
|
} |
|
|
|
|
|
|
|
const ( |
|
|
@ -170,9 +150,6 @@ const ( |
|
|
|
|
|
|
|
type FrameRate int |
|
|
|
|
|
|
|
func (f FrameRate) Option() string { |
|
|
|
s := strings.Builder{} |
|
|
|
s.WriteString(`-r `) |
|
|
|
s.WriteString(strconv.Itoa(int(f))) |
|
|
|
return s.String() |
|
|
|
func (f FrameRate) Option() []string { |
|
|
|
return argsBuilder("-r", strconv.Itoa(int(f))) |
|
|
|
} |
|
|
|