From c034582a4d4f6bad94da54e82988fc6f7c6677f5 Mon Sep 17 00:00:00 2001 From: Andrey Beletsky Date: Wed, 20 Jan 2021 02:13:41 +0700 Subject: [PATCH 1/6] Allow setting working dir for ffmpeg --- ffmpeg/config.go | 1 + ffmpeg/ffmpeg.go | 1 + 2 files changed, 2 insertions(+) diff --git a/ffmpeg/config.go b/ffmpeg/config.go index 05eb7ff..618dc8b 100644 --- a/ffmpeg/config.go +++ b/ffmpeg/config.go @@ -6,4 +6,5 @@ type Config struct { FfprobeBinPath string ProgressEnabled bool Verbose bool + OutputDir string } diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index ce262f8..5ae0a53 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -93,6 +93,7 @@ func (t *Transcoder) Start(opts transcoder.Options) (<-chan transcoder.Progress, } else { cmd = exec.CommandContext(*t.commandContext, t.config.FfmpegBinPath, args...) } + cmd.Dir = t.config.OutputDir // If progresss enabled, get stderr pipe and start progress process if t.config.ProgressEnabled && !t.config.Verbose { From 171b299560054611e7491e5e80161a7878f8fc42 Mon Sep 17 00:00:00 2001 From: Andrey Beletsky Date: Fri, 28 May 2021 21:56:58 +0700 Subject: [PATCH 2/6] Fix out chan race condition --- ffmpeg/ffmpeg.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index 5ae0a53..7cbed0d 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -30,11 +30,12 @@ type Transcoder struct { inputPipeWriter *io.WriteCloser outputPipeWriter *io.WriteCloser commandContext *context.Context + done chan interface{} } // New ... func New(cfg *Config) transcoder.Transcoder { - return &Transcoder{config: cfg} + return &Transcoder{config: cfg, done: make(chan interface{})} } // Start ... @@ -119,8 +120,9 @@ func (t *Transcoder) Start(opts transcoder.Options) (<-chan transcoder.Progress, }() go func() { - defer close(out) err = cmd.Wait() + t.done <- true + close(out) }() } else { err = cmd.Wait() @@ -328,9 +330,17 @@ func (t *Transcoder) progress(stream io.ReadCloser, out chan transcoder.Progress Progress.CurrentTime = currentTime Progress.Speed = currentSpeed + select { + case <-t.done: + return + default: + } + out <- *Progress } } + + close(out) } // closePipes Closes pipes if opened From 013b5fc1d1a16f10fd996b4dee3e33d37889ffab Mon Sep 17 00:00:00 2001 From: Mark Beamer Jr Date: Sat, 19 Feb 2022 11:49:34 -0500 Subject: [PATCH 3/6] fix ffprobe call to allow for rtmp inputs. --- ffmpeg/ffmpeg.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index 7cbed0d..d2f296c 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -224,7 +224,7 @@ func (t *Transcoder) GetMetadata() (transcoder.Metadata, error) { input = "pipe:" } - args := []string{"-i", input, "-print_format", "json", "-show_format", "-show_streams", "-show_error"} + args := []string{"-print_format", "json", "-show_format", "-show_streams", "-show_error", input} cmd := exec.Command(t.config.FfprobeBinPath, args...) cmd.Stdout = &outb @@ -246,7 +246,7 @@ func (t *Transcoder) GetMetadata() (transcoder.Metadata, error) { return metadata, nil } - return nil, errors.New("ffprobe binary not found") + return nil, nil // errors.New("ffprobe binary not found") } // progress sends through given channel the transcoding status From 11076d10355f61b8f9fb3128e4d20ba79537499f Mon Sep 17 00:00:00 2001 From: Mark Beamer Jr Date: Fri, 25 Mar 2022 23:41:53 -0400 Subject: [PATCH 4/6] Add custom usage --- ffmpeg/ffmpeg.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++- transcoder.go | 1 + 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index d2f296c..d1f2a1e 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -38,6 +38,62 @@ func New(cfg *Config) transcoder.Transcoder { return &Transcoder{config: cfg, done: make(chan interface{})} } +func (t *Transcoder) StartCustom(opts transcoder.Options) (<-chan transcoder.Progress, error) { + var stderrIn io.ReadCloser + + out := make(chan transcoder.Progress) + + defer t.closePipes() + + // Append input file and standard options + args := append([]string{}, opts.GetStrArguments()...) + + // Initialize command + // If a context object was supplied to this Transcoder before + // starting, use this context when creating the command to allow + // the command to be killed when the context expires + var cmd *exec.Cmd + if t.commandContext == nil { + cmd = exec.Command(t.config.FfmpegBinPath, args...) + } else { + cmd = exec.CommandContext(*t.commandContext, t.config.FfmpegBinPath, args...) + } + cmd.Dir = t.config.OutputDir + var err error + // If progresss enabled, get stderr pipe and start progress process + if t.config.ProgressEnabled && !t.config.Verbose { + stderrIn, err = cmd.StderrPipe() + if err != nil { + return nil, fmt.Errorf("Failed getting transcoding progress (%s) with args (%s) with error %s", t.config.FfmpegBinPath, args, err) + } + } + + if t.config.Verbose { + cmd.Stderr = os.Stdout + } + + // Start process + err = cmd.Start() + if err != nil { + return nil, fmt.Errorf("Failed starting transcoding (%s) with args (%s) with error %s", t.config.FfmpegBinPath, args, err) + } + if t.config.ProgressEnabled && !t.config.Verbose { + go func() { + t.progress(stderrIn, out) + }() + + go func() { + err = cmd.Wait() + t.done <- true + close(out) + }() + } else { + err = cmd.Wait() + } + + return out, nil +} + // Start ... func (t *Transcoder) Start(opts transcoder.Options) (<-chan transcoder.Progress, error) { @@ -55,7 +111,7 @@ func (t *Transcoder) Start(opts transcoder.Options) (<-chan transcoder.Progress, // Get file metadata _, err := t.GetMetadata() if err != nil { - return nil, err + //return nil, err } // Append input file and standard options diff --git a/transcoder.go b/transcoder.go index c93bc4a..1c5b4ea 100644 --- a/transcoder.go +++ b/transcoder.go @@ -8,6 +8,7 @@ import ( // Transcoder ... type Transcoder interface { Start(opts Options) (<-chan Progress, error) + StartCustom(opts Options) (<-chan Progress, error) Input(i string) Transcoder InputPipe(w *io.WriteCloser, r *io.ReadCloser) Transcoder Output(o string) Transcoder From 16443b2dcc01597340d7f024afab045d977864b1 Mon Sep 17 00:00:00 2001 From: Mark Beamer Jr Date: Mon, 18 Apr 2022 20:49:04 -0400 Subject: [PATCH 5/6] Add -find_stream_info to look in the stream not just the header for info, so it always returns. --- ffmpeg/ffmpeg.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index d1f2a1e..c859df1 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -280,7 +280,7 @@ func (t *Transcoder) GetMetadata() (transcoder.Metadata, error) { input = "pipe:" } - args := []string{"-print_format", "json", "-show_format", "-show_streams", "-show_error", input} + args := []string{"-print_format", "json", "-show_format", "-show_streams", "-find_stream_info", "-show_error", input} cmd := exec.Command(t.config.FfprobeBinPath, args...) cmd.Stdout = &outb From 5e7e86dd0353e25db989ce261b44e3953fd4d844 Mon Sep 17 00:00:00 2001 From: Mark Beamer Jr Date: Wed, 20 Apr 2022 14:26:31 -0400 Subject: [PATCH 6/6] add additional parameters to increase the limit for probing --- ffmpeg/ffmpeg.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index c859df1..bd8d005 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -280,7 +280,7 @@ func (t *Transcoder) GetMetadata() (transcoder.Metadata, error) { input = "pipe:" } - args := []string{"-print_format", "json", "-show_format", "-show_streams", "-find_stream_info", "-show_error", input} + args := []string{"-print_format", "json", "-show_format", "-show_streams", "-find_stream_info", "-analyzeduration", "10000000", "-probesize", "10000000", "-show_error", input} cmd := exec.Command(t.config.FfprobeBinPath, args...) cmd.Stdout = &outb