From b4285f07d0e26af436d39673f394f139f103e2b3 Mon Sep 17 00:00:00 2001 From: karataev Date: Wed, 27 Apr 2022 13:00:48 +0300 Subject: [PATCH 1/5] fix call cmd wait --- .gitignore | 3 ++- ffmpeg/ffmpeg.go | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index b932f2d..388e3fa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ main.go -build \ No newline at end of file +.idea +build diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index 5d69b54..20f1e17 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -118,8 +118,12 @@ func (t *Transcoder) Start(opts transcoder.Options) (<-chan transcoder.Progress, }() select { case <-time.After(t.config.Timeout): - cmd.Process.Signal(syscall.SIGTERM) - case <-done: + err = cmd.Process.Signal(syscall.SIGTERM) + if err != nil { + return nil, err + } + cmd.Wait() + case err := <-done: if err != nil { return nil, err } From c1c0e666431552526988b2bfbdd6006264bf7e38 Mon Sep 17 00:00:00 2001 From: karataev Date: Wed, 27 Apr 2022 13:55:44 +0300 Subject: [PATCH 2/5] fix cmd run with context --- ffmpeg/ffmpeg.go | 47 ++++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index 20f1e17..361fee1 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -3,6 +3,7 @@ package ffmpeg import ( "bufio" "bytes" + "context" "encoding/json" "errors" "fmt" @@ -12,7 +13,6 @@ import ( "regexp" "strconv" "strings" - "syscall" "time" "github.com/C0nstantin/transcoder" @@ -84,7 +84,14 @@ func (t *Transcoder) Start(opts transcoder.Options) (<-chan transcoder.Progress, } // Initialize command - cmd := exec.Command(t.config.FfmpegBinPath, args...) + ctx := context.Background() + if int(t.config.Timeout) > 0 { + ctx1, cancel := context.WithDeadline(ctx, time.Now().Add(t.config.Timeout)) + defer cancel() + ctx = ctx1 + } + cmd := exec.CommandContext(ctx, t.config.FfmpegBinPath, args...) + //cmd := exec.Command(t.config.FfmpegBinPath, args...) // If progresss enabled, get stderr pipe and start progress process if t.config.ProgressEnabled && !t.config.Verbose { @@ -103,39 +110,25 @@ func (t *Transcoder) Start(opts transcoder.Options) (<-chan transcoder.Progress, 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) + }() - if (t.config.ProgressEnabled && !t.config.Verbose) || (int(t.config.Timeout) > 0) { - if t.config.ProgressEnabled { - go func() { - t.progress(stderrIn, out) - }() - } - done := make(chan error, 1) go func() { defer close(out) - done <- cmd.Wait() - + err = cmd.Wait() }() - select { - case <-time.After(t.config.Timeout): - err = cmd.Process.Signal(syscall.SIGTERM) - if err != nil { - return nil, err - } - cmd.Wait() - case err := <-done: - if err != nil { - return nil, err - } - } - } else { err = cmd.Wait() - if err != nil { - return nil, fmt.Errorf("Error ffmeg execute command %s, %w", cmd.String(), err) - } } + if ctx.Err() == context.DeadlineExceeded { + return nil, fmt.Errorf("Command timed out %s ", cmd.String()) + } + if err != nil { + return nil, err + } return out, nil } From ae1d3bc2d6a1310966896a537b951e825531947e Mon Sep 17 00:00:00 2001 From: karataev Date: Wed, 27 Apr 2022 15:22:20 +0300 Subject: [PATCH 3/5] fix cmd run with context 2 version --- ffmpeg/ffmpeg.go | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index 361fee1..2b80e43 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -106,25 +106,20 @@ func (t *Transcoder) Start(opts transcoder.Options) (<-chan transcoder.Progress, } // 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) - } + //err = cmd.Start() + if t.config.ProgressEnabled && !t.config.Verbose { go func() { t.progress(stderrIn, out) }() - - go func() { - defer close(out) - err = cmd.Wait() - }() - } else { - err = cmd.Wait() + } + err = cmd.Run() + if err != nil { + return nil, fmt.Errorf("Failed starting transcoding (%s) with args (%s) with error %s", t.config.FfmpegBinPath, args, err) } if ctx.Err() == context.DeadlineExceeded { - return nil, fmt.Errorf("Command timed out %s ", cmd.String()) - + fmt.Printf("Command timed out %s ", cmd.String()) + return out, nil } if err != nil { return nil, err From 4e2dcb7af0f131a8339145e051908e86b1762576 Mon Sep 17 00:00:00 2001 From: karataev Date: Wed, 27 Apr 2022 15:47:07 +0300 Subject: [PATCH 4/5] fix cmd run with context 2 version --- ffmpeg/ffmpeg.go | 60 ++++++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index 2b80e43..acb20a7 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -3,7 +3,6 @@ package ffmpeg import ( "bufio" "bytes" - "context" "encoding/json" "errors" "fmt" @@ -13,6 +12,7 @@ import ( "regexp" "strconv" "strings" + "syscall" "time" "github.com/C0nstantin/transcoder" @@ -84,14 +84,7 @@ func (t *Transcoder) Start(opts transcoder.Options) (<-chan transcoder.Progress, } // Initialize command - ctx := context.Background() - if int(t.config.Timeout) > 0 { - ctx1, cancel := context.WithDeadline(ctx, time.Now().Add(t.config.Timeout)) - defer cancel() - ctx = ctx1 - } - cmd := exec.CommandContext(ctx, t.config.FfmpegBinPath, args...) - //cmd := exec.Command(t.config.FfmpegBinPath, args...) + cmd := exec.Command(t.config.FfmpegBinPath, args...) // If progresss enabled, get stderr pipe and start progress process if t.config.ProgressEnabled && !t.config.Verbose { @@ -106,24 +99,47 @@ func (t *Transcoder) Start(opts transcoder.Options) (<-chan transcoder.Progress, } // Start process - //err = cmd.Start() - - if t.config.ProgressEnabled && !t.config.Verbose { - go func() { - t.progress(stderrIn, out) - }() - } - err = cmd.Run() + 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 ctx.Err() == context.DeadlineExceeded { - fmt.Printf("Command timed out %s ", cmd.String()) - return out, nil + + if t.config.ProgressEnabled && !t.config.Verbose { + + if t.config.ProgressEnabled { + go func() { + t.progress(stderrIn, out) + }() + } } - if err != nil { - return nil, err + if int(t.config.Timeout) > 0 { + done := make(chan error, 1) + go func() { + defer close(out) + done <- cmd.Wait() + + }() + select { + case <-time.After(t.config.Timeout): + err = cmd.Process.Signal(syscall.SIGINT) + if err != nil { + return nil, err + } + time.Sleep(3 * time.Second) + + case err := <-done: + if err != nil { + return nil, err + } + } + + } else { + err = cmd.Wait() + if err != nil { + return nil, fmt.Errorf("Error ffmeg execute command %s, %w", cmd.String(), err) + } } + return out, nil } From 1072ac0b44fd61899633ec2cb666b6dc5f8886df Mon Sep 17 00:00:00 2001 From: Denis Sobolev Date: Wed, 27 Apr 2022 16:38:18 +0300 Subject: [PATCH 5/5] chore: test update sleep --- ffmpeg/ffmpeg.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index acb20a7..632ea2f 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -125,7 +125,7 @@ func (t *Transcoder) Start(opts transcoder.Options) (<-chan transcoder.Progress, if err != nil { return nil, err } - time.Sleep(3 * time.Second) + time.Sleep(30 * time.Second) case err := <-done: if err != nil {