mirror of https://github.com/stashapp/stash.git
110 lines
2.3 KiB
Go
110 lines
2.3 KiB
Go
package transcoder
|
|
|
|
import "github.com/stashapp/stash/pkg/ffmpeg"
|
|
|
|
type ScreenshotOptions struct {
|
|
OutputPath string
|
|
OutputType ScreenshotOutputType
|
|
|
|
// Quality is the quality scale. See https://ffmpeg.org/ffmpeg.html#Main-options
|
|
Quality int
|
|
|
|
Width int
|
|
|
|
// Verbosity is the logging verbosity. Defaults to LogLevelError if not set.
|
|
Verbosity ffmpeg.LogLevel
|
|
|
|
UseSelectFilter bool
|
|
}
|
|
|
|
func (o *ScreenshotOptions) setDefaults() {
|
|
if o.Verbosity == "" {
|
|
o.Verbosity = ffmpeg.LogLevelError
|
|
}
|
|
}
|
|
|
|
type ScreenshotOutputType struct {
|
|
codec ffmpeg.VideoCodec
|
|
format ffmpeg.Format
|
|
}
|
|
|
|
func (t ScreenshotOutputType) Args() []string {
|
|
var ret []string
|
|
if t.codec != "" {
|
|
ret = append(ret, t.codec.Args()...)
|
|
}
|
|
if t.format != "" {
|
|
ret = append(ret, t.format.Args()...)
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
var (
|
|
ScreenshotOutputTypeImage2 = ScreenshotOutputType{
|
|
format: "image2",
|
|
}
|
|
ScreenshotOutputTypeBMP = ScreenshotOutputType{
|
|
codec: ffmpeg.VideoCodecBMP,
|
|
format: "rawvideo",
|
|
}
|
|
)
|
|
|
|
func ScreenshotTime(input string, t float64, options ScreenshotOptions) ffmpeg.Args {
|
|
options.setDefaults()
|
|
|
|
var args ffmpeg.Args
|
|
args = args.LogLevel(options.Verbosity)
|
|
args = args.Overwrite()
|
|
args = args.Seek(t)
|
|
|
|
args = args.Input(input)
|
|
args = args.VideoFrames(1)
|
|
|
|
if options.Quality > 0 {
|
|
args = args.FixedQualityScaleVideo(options.Quality)
|
|
}
|
|
|
|
var vf ffmpeg.VideoFilter
|
|
|
|
if options.Width > 0 {
|
|
vf = vf.ScaleWidth(options.Width)
|
|
args = args.VideoFilter(vf)
|
|
}
|
|
|
|
args = args.AppendArgs(options.OutputType)
|
|
args = args.Output(options.OutputPath)
|
|
|
|
return args
|
|
}
|
|
|
|
// ScreenshotFrame uses the select filter to get a single frame from the video.
|
|
// It is very slow and should only be used for files with very small duration in secs / frame count.
|
|
func ScreenshotFrame(input string, frame int, options ScreenshotOptions) ffmpeg.Args {
|
|
options.setDefaults()
|
|
|
|
var args ffmpeg.Args
|
|
args = args.LogLevel(options.Verbosity)
|
|
args = args.Overwrite()
|
|
|
|
args = args.Input(input)
|
|
args = args.VideoFrames(1)
|
|
|
|
args = args.VSync(ffmpeg.VSyncMethodPassthrough)
|
|
|
|
var vf ffmpeg.VideoFilter
|
|
// keep only frame number options.Frame)
|
|
vf = vf.Select(frame)
|
|
|
|
if options.Width > 0 {
|
|
vf = vf.ScaleWidth(options.Width)
|
|
}
|
|
|
|
args = args.VideoFilter(vf)
|
|
|
|
args = args.AppendArgs(options.OutputType)
|
|
args = args.Output(options.OutputPath)
|
|
|
|
return args
|
|
}
|