mirror of
https://github.com/stashapp/stash.git
synced 2025-12-15 21:03:22 +01:00
Fix custom transcode arguments (#3491)
This commit is contained in:
parent
967a25f64a
commit
445e0a7311
4 changed files with 30 additions and 15 deletions
|
|
@ -37,6 +37,8 @@ type StreamManager struct {
|
||||||
|
|
||||||
type StreamManagerConfig interface {
|
type StreamManagerConfig interface {
|
||||||
GetMaxStreamingTranscodeSize() models.StreamingResolutionEnum
|
GetMaxStreamingTranscodeSize() models.StreamingResolutionEnum
|
||||||
|
GetLiveTranscodeInputArgs() []string
|
||||||
|
GetLiveTranscodeOutputArgs() []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewStreamManager(cacheDir string, encoder FFMpeg, ffprobe FFProbe, config StreamManagerConfig, lockManager *fsutil.ReadLockManager) *StreamManager {
|
func NewStreamManager(cacheDir string, encoder FFMpeg, ffprobe FFProbe, config StreamManagerConfig, lockManager *fsutil.ReadLockManager) *StreamManager {
|
||||||
|
|
|
||||||
|
|
@ -202,10 +202,15 @@ func (t StreamType) FileDir(hash string, maxTranscodeSize int) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *runningStream) makeStreamArgs(segment int) Args {
|
func (s *runningStream) makeStreamArgs(sm *StreamManager, segment int) Args {
|
||||||
|
extraInputArgs := sm.config.GetLiveTranscodeInputArgs()
|
||||||
|
extraOutputArgs := sm.config.GetLiveTranscodeOutputArgs()
|
||||||
|
|
||||||
args := Args{"-hide_banner"}
|
args := Args{"-hide_banner"}
|
||||||
args = args.LogLevel(LogLevelError)
|
args = args.LogLevel(LogLevelError)
|
||||||
|
|
||||||
|
args = append(args, extraInputArgs...)
|
||||||
|
|
||||||
if segment > 0 {
|
if segment > 0 {
|
||||||
args = args.Seek(float64(segment * segmentLength))
|
args = args.Seek(float64(segment * segmentLength))
|
||||||
}
|
}
|
||||||
|
|
@ -219,6 +224,8 @@ func (s *runningStream) makeStreamArgs(segment int) Args {
|
||||||
|
|
||||||
args = append(args, s.streamType.Args(segment, videoFilter, videoOnly, s.outputDir)...)
|
args = append(args, s.streamType.Args(segment, videoFilter, videoOnly, s.outputDir)...)
|
||||||
|
|
||||||
|
args = append(args, extraOutputArgs...)
|
||||||
|
|
||||||
return args
|
return args
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -441,7 +448,7 @@ func (sm *StreamManager) startTranscode(stream *runningStream, segment int, done
|
||||||
|
|
||||||
lockCtx := sm.lockManager.ReadLock(sm.context, stream.vf.Path)
|
lockCtx := sm.lockManager.ReadLock(sm.context, stream.vf.Path)
|
||||||
|
|
||||||
args := stream.makeStreamArgs(segment)
|
args := stream.makeStreamArgs(sm, segment)
|
||||||
cmd := sm.encoder.Command(lockCtx, args)
|
cmd := sm.encoder.Command(lockCtx, args)
|
||||||
|
|
||||||
stderr, err := cmd.StderrPipe()
|
stderr, err := cmd.StderrPipe()
|
||||||
|
|
|
||||||
|
|
@ -89,23 +89,34 @@ type TranscodeOptions struct {
|
||||||
StartTime float64
|
StartTime float64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o TranscodeOptions) makeStreamArgs(vf *file.VideoFile, maxScale int, startTime float64) Args {
|
func (o TranscodeOptions) makeStreamArgs(sm *StreamManager) Args {
|
||||||
|
maxTranscodeSize := sm.config.GetMaxStreamingTranscodeSize().GetMaxResolution()
|
||||||
|
if o.Resolution != "" {
|
||||||
|
maxTranscodeSize = models.StreamingResolutionEnum(o.Resolution).GetMaxResolution()
|
||||||
|
}
|
||||||
|
extraInputArgs := sm.config.GetLiveTranscodeInputArgs()
|
||||||
|
extraOutputArgs := sm.config.GetLiveTranscodeOutputArgs()
|
||||||
|
|
||||||
args := Args{"-hide_banner"}
|
args := Args{"-hide_banner"}
|
||||||
args = args.LogLevel(LogLevelError)
|
args = args.LogLevel(LogLevelError)
|
||||||
|
|
||||||
if startTime != 0 {
|
args = append(args, extraInputArgs...)
|
||||||
args = args.Seek(startTime)
|
|
||||||
|
if o.StartTime != 0 {
|
||||||
|
args = args.Seek(o.StartTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
args = args.Input(vf.Path)
|
args = args.Input(o.VideoFile.Path)
|
||||||
|
|
||||||
videoOnly := ProbeAudioCodec(vf.AudioCodec) == MissingUnsupported
|
videoOnly := ProbeAudioCodec(o.VideoFile.AudioCodec) == MissingUnsupported
|
||||||
|
|
||||||
var videoFilter VideoFilter
|
var videoFilter VideoFilter
|
||||||
videoFilter = videoFilter.ScaleMax(vf.Width, vf.Height, maxScale)
|
videoFilter = videoFilter.ScaleMax(o.VideoFile.Width, o.VideoFile.Height, maxTranscodeSize)
|
||||||
|
|
||||||
args = append(args, o.StreamType.Args(videoFilter, videoOnly)...)
|
args = append(args, o.StreamType.Args(videoFilter, videoOnly)...)
|
||||||
|
|
||||||
|
args = append(args, extraOutputArgs...)
|
||||||
|
|
||||||
args = args.Output("pipe:")
|
args = args.Output("pipe:")
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
|
@ -134,12 +145,7 @@ func (sm *StreamManager) ServeTranscode(w http.ResponseWriter, r *http.Request,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sm *StreamManager) getTranscodeStream(ctx *fsutil.LockContext, options TranscodeOptions) (http.HandlerFunc, error) {
|
func (sm *StreamManager) getTranscodeStream(ctx *fsutil.LockContext, options TranscodeOptions) (http.HandlerFunc, error) {
|
||||||
maxTranscodeSize := sm.config.GetMaxStreamingTranscodeSize().GetMaxResolution()
|
args := options.makeStreamArgs(sm)
|
||||||
if options.Resolution != "" {
|
|
||||||
maxTranscodeSize = models.StreamingResolutionEnum(options.Resolution).GetMaxResolution()
|
|
||||||
}
|
|
||||||
|
|
||||||
args := options.makeStreamArgs(options.VideoFile, maxTranscodeSize, options.StartTime)
|
|
||||||
cmd := sm.encoder.Command(ctx, args)
|
cmd := sm.encoder.Command(ctx, args)
|
||||||
|
|
||||||
stdout, err := cmd.StdoutPipe()
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
|
|
||||||
|
|
@ -287,7 +287,7 @@
|
||||||
},
|
},
|
||||||
"live_transcode": {
|
"live_transcode": {
|
||||||
"input_args": {
|
"input_args": {
|
||||||
"heading": "FFmpeg LiveTranscode Input Args",
|
"heading": "FFmpeg Live Transcode Input Args",
|
||||||
"desc": "Advanced: Additional arguments to pass to ffmpeg before the input field when live transcoding video."
|
"desc": "Advanced: Additional arguments to pass to ffmpeg before the input field when live transcoding video."
|
||||||
},
|
},
|
||||||
"output_args": {
|
"output_args": {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue