From 4614471ad9dac96d65e22c41f4284a61daa2298d Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:02:45 +1100 Subject: [PATCH] Fix ffmpeg error when trying to scale and copy video (#4660) --- internal/manager/task_transcode.go | 23 +++++++++++++---------- pkg/scene/generate/transcode.go | 27 ++++++--------------------- 2 files changed, 19 insertions(+), 31 deletions(-) diff --git a/internal/manager/task_transcode.go b/internal/manager/task_transcode.go index edda08fbb..2897cd2b9 100644 --- a/internal/manager/task_transcode.go +++ b/internal/manager/task_transcode.go @@ -26,7 +26,7 @@ func (t *GenerateTranscodeTask) GetDescription() string { return fmt.Sprintf("Generating transcode for %s", t.Scene.Path) } -func (t *GenerateTranscodeTask) Start(ctc context.Context) { +func (t *GenerateTranscodeTask) Start(ctx context.Context) { hasTranscode := HasTranscode(&t.Scene, t.fileNamingAlgorithm) if !t.Overwrite && hasTranscode { return @@ -72,23 +72,26 @@ func (t *GenerateTranscodeTask) Start(ctc context.Context) { w, h := videoFile.TranscodeScale(transcodeSize.GetMaxResolution()) - options := generate.TranscodeOptions{ - Width: w, - Height: h, - } + // if scale is being set, then we can't use stream copy + scaleSet := w == 0 && h == 0 - if videoCodec == ffmpeg.H264 { // for non supported h264 files stream copy the video part + if scaleSet && videoCodec == ffmpeg.H264 { // for non supported h264 files stream copy the video part if audioCodec == ffmpeg.MissingUnsupported { - err = t.g.TranscodeCopyVideo(context.TODO(), videoFile.Path, sceneHash, options) + err = t.g.TranscodeCopyVideo(ctx, videoFile.Path, sceneHash) } else { - err = t.g.TranscodeAudio(context.TODO(), videoFile.Path, sceneHash, options) + err = t.g.TranscodeAudio(ctx, videoFile.Path, sceneHash) } } else { + options := generate.TranscodeOptions{ + Width: w, + Height: h, + } + if audioCodec == ffmpeg.MissingUnsupported { // ffmpeg fails if it tries to transcode an unsupported audio codec - err = t.g.TranscodeVideo(context.TODO(), videoFile.Path, sceneHash, options) + err = t.g.TranscodeVideo(ctx, videoFile.Path, sceneHash, options) } else { - err = t.g.Transcode(context.TODO(), videoFile.Path, sceneHash, options) + err = t.g.Transcode(ctx, videoFile.Path, sceneHash, options) } } diff --git a/pkg/scene/generate/transcode.go b/pkg/scene/generate/transcode.go index 6528f91da..f08d2c05b 100644 --- a/pkg/scene/generate/transcode.go +++ b/pkg/scene/generate/transcode.go @@ -32,19 +32,19 @@ func (g Generator) TranscodeVideo(ctx context.Context, input string, hash string } // TranscodeAudio will copy the video stream as is, and transcode audio. -func (g Generator) TranscodeAudio(ctx context.Context, input string, hash string, options TranscodeOptions) error { +func (g Generator) TranscodeAudio(ctx context.Context, input string, hash string) error { lockCtx := g.LockManager.ReadLock(ctx, input) defer lockCtx.Cancel() - return g.makeTranscode(lockCtx, hash, g.transcodeAudio(input, options)) + return g.makeTranscode(lockCtx, hash, g.transcodeAudio(input)) } // TranscodeCopyVideo will copy the video stream as is, and drop the audio stream. -func (g Generator) TranscodeCopyVideo(ctx context.Context, input string, hash string, options TranscodeOptions) error { +func (g Generator) TranscodeCopyVideo(ctx context.Context, input string, hash string) error { lockCtx := g.LockManager.ReadLock(ctx, input) defer lockCtx.Cancel() - return g.makeTranscode(lockCtx, hash, g.transcodeCopyVideo(input, options)) + return g.makeTranscode(lockCtx, hash, g.transcodeCopyVideo(input)) } func (g Generator) makeTranscode(lockCtx *fsutil.LockContext, hash string, generateFn generateFn) error { @@ -129,19 +129,11 @@ func (g Generator) transcodeVideo(input string, options TranscodeOptions) genera } } -func (g Generator) transcodeAudio(input string, options TranscodeOptions) generateFn { +func (g Generator) transcodeAudio(input string) generateFn { return func(lockCtx *fsutil.LockContext, tmpFn string) error { - var videoArgs ffmpeg.Args - if options.Width != 0 && options.Height != 0 { - var videoFilter ffmpeg.VideoFilter - videoFilter = videoFilter.ScaleDimensions(options.Width, options.Height) - videoArgs = videoArgs.VideoFilter(videoFilter) - } - args := transcoder.Transcode(input, transcoder.TranscodeOptions{ OutputPath: tmpFn, VideoCodec: ffmpeg.VideoCodecCopy, - VideoArgs: videoArgs, AudioCodec: ffmpeg.AudioCodecAAC, }) @@ -149,14 +141,8 @@ func (g Generator) transcodeAudio(input string, options TranscodeOptions) genera } } -func (g Generator) transcodeCopyVideo(input string, options TranscodeOptions) generateFn { +func (g Generator) transcodeCopyVideo(input string) generateFn { return func(lockCtx *fsutil.LockContext, tmpFn string) error { - var videoArgs ffmpeg.Args - if options.Width != 0 && options.Height != 0 { - var videoFilter ffmpeg.VideoFilter - videoFilter = videoFilter.ScaleDimensions(options.Width, options.Height) - videoArgs = videoArgs.VideoFilter(videoFilter) - } var audioArgs ffmpeg.Args audioArgs = audioArgs.SkipAudio() @@ -164,7 +150,6 @@ func (g Generator) transcodeCopyVideo(input string, options TranscodeOptions) ge args := transcoder.Transcode(input, transcoder.TranscodeOptions{ OutputPath: tmpFn, VideoCodec: ffmpeg.VideoCodecCopy, - VideoArgs: videoArgs, AudioArgs: audioArgs, })