From 445e0a7311274523744310915606b2e48d02ba6d Mon Sep 17 00:00:00 2001 From: DingDongSoLong4 <99329275+DingDongSoLong4@users.noreply.github.com> Date: Mon, 27 Feb 2023 23:15:52 +0200 Subject: [PATCH] Fix custom transcode arguments (#3491) --- pkg/ffmpeg/stream.go | 2 ++ pkg/ffmpeg/stream_segmented.go | 11 +++++++++-- pkg/ffmpeg/stream_transcode.go | 30 ++++++++++++++++++------------ ui/v2.5/src/locales/en-GB.json | 2 +- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/pkg/ffmpeg/stream.go b/pkg/ffmpeg/stream.go index baf7a018a..e71bf05b1 100644 --- a/pkg/ffmpeg/stream.go +++ b/pkg/ffmpeg/stream.go @@ -37,6 +37,8 @@ type StreamManager struct { type StreamManagerConfig interface { GetMaxStreamingTranscodeSize() models.StreamingResolutionEnum + GetLiveTranscodeInputArgs() []string + GetLiveTranscodeOutputArgs() []string } func NewStreamManager(cacheDir string, encoder FFMpeg, ffprobe FFProbe, config StreamManagerConfig, lockManager *fsutil.ReadLockManager) *StreamManager { diff --git a/pkg/ffmpeg/stream_segmented.go b/pkg/ffmpeg/stream_segmented.go index cbcdcc9d7..c1184d14c 100644 --- a/pkg/ffmpeg/stream_segmented.go +++ b/pkg/ffmpeg/stream_segmented.go @@ -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.LogLevel(LogLevelError) + args = append(args, extraInputArgs...) + if segment > 0 { 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, extraOutputArgs...) + return args } @@ -441,7 +448,7 @@ func (sm *StreamManager) startTranscode(stream *runningStream, segment int, done lockCtx := sm.lockManager.ReadLock(sm.context, stream.vf.Path) - args := stream.makeStreamArgs(segment) + args := stream.makeStreamArgs(sm, segment) cmd := sm.encoder.Command(lockCtx, args) stderr, err := cmd.StderrPipe() diff --git a/pkg/ffmpeg/stream_transcode.go b/pkg/ffmpeg/stream_transcode.go index 2596fe04e..209816ad6 100644 --- a/pkg/ffmpeg/stream_transcode.go +++ b/pkg/ffmpeg/stream_transcode.go @@ -89,23 +89,34 @@ type TranscodeOptions struct { 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.LogLevel(LogLevelError) - if startTime != 0 { - args = args.Seek(startTime) + args = append(args, extraInputArgs...) + + 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 - 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, extraOutputArgs...) + args = args.Output("pipe:") 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) { - maxTranscodeSize := sm.config.GetMaxStreamingTranscodeSize().GetMaxResolution() - if options.Resolution != "" { - maxTranscodeSize = models.StreamingResolutionEnum(options.Resolution).GetMaxResolution() - } - - args := options.makeStreamArgs(options.VideoFile, maxTranscodeSize, options.StartTime) + args := options.makeStreamArgs(sm) cmd := sm.encoder.Command(ctx, args) stdout, err := cmd.StdoutPipe() diff --git a/ui/v2.5/src/locales/en-GB.json b/ui/v2.5/src/locales/en-GB.json index c2bdbce98..c4d766e74 100644 --- a/ui/v2.5/src/locales/en-GB.json +++ b/ui/v2.5/src/locales/en-GB.json @@ -287,7 +287,7 @@ }, "live_transcode": { "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." }, "output_args": {