[FFmpeg-cvslog] avfilter/af_silenceremove: fix the any/all confusion and change default

Paul B Mahol git at videolan.org
Sat May 27 17:06:39 EEST 2023


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Sat May 27 13:59:24 2023 +0200| [e8e486332571347dd55822c842ba67276ac308e2] | committer: Paul B Mahol

avfilter/af_silenceremove: fix the any/all confusion and change default

'any' stop mode is now correctly implemented for end trimming and is of limited usage.
Extend examples and other documentation of this filter.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e8e486332571347dd55822c842ba67276ac308e2
---

 doc/filters.texi                     | 62 ++++++++++++++++++++++++++++--------
 libavfilter/af_silenceremove.c       |  2 +-
 libavfilter/silenceremove_template.c |  4 +--
 3 files changed, 50 insertions(+), 18 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index 975a506352..4d9a3cf0b4 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -6419,15 +6419,16 @@ trimming. Default is 0, which is equal to trimming all samples detected
 as silence.
 
 @item start_mode
-Specify mode of detection of silence end in start of multi-channel audio.
+Specify mode of detection of silence end at start of multi-channel audio.
 Can be @var{any} or @var{all}. Default is @var{any}.
-With @var{any}, any sample that is detected as non-silence will cause
-stopped trimming of silence.
-With @var{all}, only if all channels are detected as non-silence will cause
-stopped trimming of silence.
+With @var{any}, any sample from any channel that is detected as non-silence
+will trigger end of silence trimming at start of audio stream.
+With @var{all}, only if every sample from every channel is detected as non-silence
+will trigger end of silence trimming at start of audio stream, limited usage.
 
 @item stop_periods
-Set the count for trimming silence from the end of audio.
+Set the count for trimming silence from the end of audio. When specifying a
+positive value, it trims audio after it finds specified silence period.
 To remove silence from the middle of a file, specify a @var{stop_periods}
 that is negative. This value is then treated as a positive value and is
 used to indicate the effect should restart processing as specified by
@@ -6453,20 +6454,34 @@ trimming. Default is 0, which is equal to trimming all samples detected
 as silence.
 
 @item stop_mode
-Specify mode of detection of silence start in end of multi-channel audio.
-Can be @var{any} or @var{all}. Default is @var{any}.
-With @var{any}, any sample that is detected as non-silence will cause
-stopped trimming of silence.
-With @var{all}, only if all channels are detected as non-silence will cause
-stopped trimming of silence.
+Specify mode of detection of silence start after start of multi-channel audio.
+Can be @var{any} or @var{all}. Default is @var{all}.
+With @var{any}, any sample from any channel that is detected as silence
+will trigger start of silence trimming after start of audio stream, limited usage.
+With @var{all}, only if every sample from every channel is detected as silence
+will trigger start of silence trimming after start of audio stream.
 
 @item detection
-Set how is silence detected. Can be @code{avg}, @code{rms}, @code{median} or @code{peak}.
+Set how is silence detected.
+ at table @option
+ at item avg
+Mean of absolute values of samples in moving window.
+ at item rms
+Root squared mean of absolute values of samples in moving window.
+ at item peak
+Maximum of absolute values of samples in moving window.
+ at item median
+Median of absolute values of samples in moving window.
+ at end table
 Default value is @code{rms}.
 
 @item window
 Set duration in number of seconds used to calculate size of window in number
-of samples for detecting silence.
+of samples for detecting silence. Using @code{0} will effectively disable
+any windowing and use only single sample per channel for silence detection.
+In that case it may be needed to also set @option{start_silence} and/or
+ at option{stop_silence} to nonzero values with also @option{start_duration} and/or
+ at option{stop_duration} to nonzero values.
 Default value is @code{0.02}. Allowed range is from @code{0} to @code{10}.
 @end table
 
@@ -6495,6 +6510,25 @@ silence is detected in all channels at same positions in stream:
 @example
 silenceremove=window=0:detection=peak:stop_mode=all:start_mode=all:stop_periods=-1:stop_threshold=0
 @end example
+
+ at item
+Trim every 2nd encountered silence period from beginning to end where there is
+more than 1 second of silence per silence period in audio:
+ at example
+silenceremove=stop_periods=-2:stop_duration=1:stop_threshold=-90dB
+ at end example
+
+ at item
+Similar as above, but keep maximum of 0.5 seconds of silence from each trimmed period:
+ at example
+silenceremove=stop_periods=-2:stop_duration=1:stop_threshold=-90dB:stop_silence=0.5
+ at end example
+
+ at item
+Similar as above, but keep maximum of 1.5 seconds of silence from start of audio:
+ at example
+silenceremove=stop_periods=-2:stop_duration=1:stop_threshold=-90dB:stop_silence=0.5:start_periods=1:start_duration=1:start_silence=1.5:stop_threshold=-90dB
+ at end example
 @end itemize
 
 @subsection Commands
diff --git a/libavfilter/af_silenceremove.c b/libavfilter/af_silenceremove.c
index 8398eeadb2..752a362203 100644
--- a/libavfilter/af_silenceremove.c
+++ b/libavfilter/af_silenceremove.c
@@ -129,7 +129,7 @@ static const AVOption silenceremove_options[] = {
     { "stop_duration",   "set stop duration of silence part",                  OFFSET(stop_duration_opt),   AV_OPT_TYPE_DURATION, {.i64=0},     0, INT32_MAX, AF },
     { "stop_threshold",  "set threshold for stop silence detection",           OFFSET(stop_threshold),      AV_OPT_TYPE_DOUBLE,   {.dbl=0},     0,   DBL_MAX, AFR },
     { "stop_silence",    "set stop duration of silence part to keep",          OFFSET(stop_silence_opt),    AV_OPT_TYPE_DURATION, {.i64=0},     0, INT32_MAX, AF },
-    { "stop_mode",       "set which channel will trigger trimming from end",   OFFSET(stop_mode),           AV_OPT_TYPE_INT,      {.i64=T_ANY}, T_ANY, T_ALL, AFR, "mode" },
+    { "stop_mode",       "set which channel will trigger trimming from end",   OFFSET(stop_mode),           AV_OPT_TYPE_INT,      {.i64=T_ALL}, T_ANY, T_ALL, AFR, "mode" },
     { "detection",       "set how silence is detected",                        OFFSET(detection),           AV_OPT_TYPE_INT,      {.i64=D_RMS}, 0,    D_NB-1, AF, "detection" },
     {   "avg",           "use mean absolute values of samples",                0,                           AV_OPT_TYPE_CONST,    {.i64=D_AVG}, 0,         0, AF, "detection" },
     {   "rms",           "use root mean squared values of samples",            0,                           AV_OPT_TYPE_CONST,    {.i64=D_RMS}, 0,         0, AF, "detection" },
diff --git a/libavfilter/silenceremove_template.c b/libavfilter/silenceremove_template.c
index e07a615ae7..901361d7eb 100644
--- a/libavfilter/silenceremove_template.c
+++ b/libavfilter/silenceremove_template.c
@@ -403,10 +403,8 @@ static void fn(filter_stop)(AVFilterContext *ctx,
         s->stop_found_periods = 0;
 
     if (s->stop_found_periods >= 0 || ctx->is_disabled) {
-        if (s->found_nonsilence) {
+        if (s->found_nonsilence)
             s->stop_sample_count += stop_thres;
-            s->stop_sample_count *= stop_thres;
-        }
     } else if (s->stop_silence_count > 0) {
         const int dst_pos = out_nb_samples * nb_channels;
         for (int ch = 0; ch < nb_channels; ch++)



More information about the ffmpeg-cvslog mailing list