mirror of https://github.com/stashapp/stash.git
179 lines
4.7 KiB
Go
179 lines
4.7 KiB
Go
package ffmpeg
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime"
|
|
)
|
|
|
|
// Arger is an interface that can be used to append arguments to an Args slice.
|
|
type Arger interface {
|
|
Args() []string
|
|
}
|
|
|
|
// Args represents a slice of arguments to be passed to ffmpeg.
|
|
type Args []string
|
|
|
|
// LogLevel sets the LogLevel to l and returns the result.
|
|
func (a Args) LogLevel(l LogLevel) Args {
|
|
if l == "" {
|
|
return a
|
|
}
|
|
|
|
return append(a, l.Args()...)
|
|
}
|
|
|
|
// XError adds the -xerror flag and returns the result.
|
|
func (a Args) XError() Args {
|
|
return append(a, "-xerror")
|
|
}
|
|
|
|
// Overwrite adds the overwrite flag (-y) and returns the result.
|
|
func (a Args) Overwrite() Args {
|
|
return append(a, "-y")
|
|
}
|
|
|
|
// Seek adds a seek (-ss) to the given seconds and returns the result.
|
|
func (a Args) Seek(seconds float64) Args {
|
|
return append(a, "-ss", fmt.Sprint(seconds))
|
|
}
|
|
|
|
// Duration sets the duration (-t) to the given seconds and returns the result.
|
|
func (a Args) Duration(seconds float64) Args {
|
|
return append(a, "-t", fmt.Sprint(seconds))
|
|
}
|
|
|
|
// Input adds the input (-i) and returns the result.
|
|
func (a Args) Input(i string) Args {
|
|
return append(a, "-i", i)
|
|
}
|
|
|
|
// Output adds the output o and returns the result.
|
|
func (a Args) Output(o string) Args {
|
|
return append(a, o)
|
|
}
|
|
|
|
// NullOutput adds a null output and returns the result.
|
|
// On Windows, this outputs to NUL, on everything else, /dev/null.
|
|
func (a Args) NullOutput() Args {
|
|
var output string
|
|
if runtime.GOOS == "windows" {
|
|
output = "nul" // https://stackoverflow.com/questions/313111/is-there-a-dev-null-on-windows
|
|
} else {
|
|
output = "/dev/null"
|
|
}
|
|
|
|
return a.Output(output)
|
|
}
|
|
|
|
// VideoFrames adds the -frames:v with f and returns the result.
|
|
func (a Args) VideoFrames(f int) Args {
|
|
return append(a, "-frames:v", fmt.Sprint(f))
|
|
}
|
|
|
|
// FixedQualityScaleVideo adds the -q:v argument with q and returns the result.
|
|
func (a Args) FixedQualityScaleVideo(q int) Args {
|
|
return append(a, "-q:v", fmt.Sprint(q))
|
|
}
|
|
|
|
// VideoFilter adds the vf video filter and returns the result.
|
|
func (a Args) VideoFilter(vf VideoFilter) Args {
|
|
return append(a, vf.Args()...)
|
|
}
|
|
|
|
// VSync adds the VsyncMethod and returns the result.
|
|
func (a Args) VSync(m VSyncMethod) Args {
|
|
return append(a, m.Args()...)
|
|
}
|
|
|
|
// AudioBitrate adds the -b:a argument with b and returns the result.
|
|
func (a Args) AudioBitrate(b string) Args {
|
|
return append(a, "-b:a", b)
|
|
}
|
|
|
|
// MaxMuxingQueueSize adds the -max_muxing_queue_size argument with s and returns the result.
|
|
func (a Args) MaxMuxingQueueSize(s int) Args {
|
|
// https://trac.ffmpeg.org/ticket/6375
|
|
return append(a, "-max_muxing_queue_size", fmt.Sprint(s))
|
|
}
|
|
|
|
// SkipAudio adds the skip audio flag (-an) and returns the result.
|
|
func (a Args) SkipAudio() Args {
|
|
return append(a, "-an")
|
|
}
|
|
|
|
// VideoCodec adds the given video codec and returns the result.
|
|
func (a Args) VideoCodec(c VideoCodec) Args {
|
|
return append(a, c.Args()...)
|
|
}
|
|
|
|
// AudioCodec adds the given audio codec and returns the result.
|
|
func (a Args) AudioCodec(c AudioCodec) Args {
|
|
return append(a, c.Args()...)
|
|
}
|
|
|
|
// Format adds the format flag with f and returns the result.
|
|
func (a Args) Format(f Format) Args {
|
|
return append(a, f.Args()...)
|
|
}
|
|
|
|
// ImageFormat adds the image format (using -f) and returns the result.
|
|
func (a Args) ImageFormat(f ImageFormat) Args {
|
|
return append(a, f.Args()...)
|
|
}
|
|
|
|
// AppendArgs appends the given Arger to the Args and returns the result.
|
|
func (a Args) AppendArgs(o Arger) Args {
|
|
return append(a, o.Args()...)
|
|
}
|
|
|
|
// Args returns a string slice of the arguments.
|
|
func (a Args) Args() []string {
|
|
return []string(a)
|
|
}
|
|
|
|
// LogLevel represents the log level of ffmpeg.
|
|
type LogLevel string
|
|
|
|
// Args returns the arguments to set the log level in ffmpeg.
|
|
func (l LogLevel) Args() []string {
|
|
if l == "" {
|
|
return nil
|
|
}
|
|
|
|
return []string{"-v", string(l)}
|
|
}
|
|
|
|
// LogLevels for ffmpeg. See -v entry under https://ffmpeg.org/ffmpeg.html#Generic-options
|
|
var (
|
|
LogLevelQuiet LogLevel = "quiet"
|
|
LogLevelPanic LogLevel = "panic"
|
|
LogLevelFatal LogLevel = "fatal"
|
|
LogLevelError LogLevel = "error"
|
|
LogLevelWarning LogLevel = "warning"
|
|
LogLevelInfo LogLevel = "info"
|
|
LogLevelVerbose LogLevel = "verbose"
|
|
LogLevelDebug LogLevel = "debug"
|
|
LogLevelTrace LogLevel = "trace"
|
|
)
|
|
|
|
// VSyncMethod represents the vsync method of ffmpeg.
|
|
type VSyncMethod string
|
|
|
|
// Args returns the arguments to set the vsync method in ffmpeg.
|
|
func (m VSyncMethod) Args() []string {
|
|
if m == "" {
|
|
return nil
|
|
}
|
|
|
|
return []string{"-vsync", string(m)}
|
|
}
|
|
|
|
// Video sync methods for ffmpeg. See -vsync entry under https://ffmpeg.org/ffmpeg.html#Advanced-options
|
|
var (
|
|
VSyncMethodPassthrough VSyncMethod = "0"
|
|
VSyncMethodCFR VSyncMethod = "1"
|
|
VSyncMethodVFR VSyncMethod = "2"
|
|
VSyncMethodDrop VSyncMethod = "drop"
|
|
VSyncMethodAuto VSyncMethod = "-1"
|
|
)
|