|
|
@ -24,6 +24,7 @@ |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
#include "libavutil/opt.h" |
|
|
|
#include "libavutil/opt.h" |
|
|
|
|
|
|
|
#include "libavutil/timestamp.h" |
|
|
|
#include "avfilter.h" |
|
|
|
#include "avfilter.h" |
|
|
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
|
typedef struct { |
|
|
@ -32,7 +33,7 @@ typedef struct { |
|
|
|
double noise; ///< noise amplitude ratio
|
|
|
|
double noise; ///< noise amplitude ratio
|
|
|
|
int duration; ///< minimum duration of silence until notification
|
|
|
|
int duration; ///< minimum duration of silence until notification
|
|
|
|
int64_t nb_null_samples; ///< current number of continuous zero samples
|
|
|
|
int64_t nb_null_samples; ///< current number of continuous zero samples
|
|
|
|
double start; ///< if silence is detected, this value contains the time of the first zero sample
|
|
|
|
int64_t start; ///< if silence is detected, this value contains the time of the first zero sample
|
|
|
|
int last_sample_rate; ///< last sample rate to check for sample rate changes
|
|
|
|
int last_sample_rate; ///< last sample rate to check for sample rate changes
|
|
|
|
} SilenceDetectContext; |
|
|
|
} SilenceDetectContext; |
|
|
|
|
|
|
|
|
|
|
@ -106,18 +107,17 @@ static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples) |
|
|
|
if (!silence->start) { |
|
|
|
if (!silence->start) { |
|
|
|
silence->nb_null_samples++; |
|
|
|
silence->nb_null_samples++; |
|
|
|
if (silence->nb_null_samples >= nb_samples_notify) { |
|
|
|
if (silence->nb_null_samples >= nb_samples_notify) { |
|
|
|
silence->start = insamples->pts * av_q2d(inlink->time_base) - silence->duration; |
|
|
|
silence->start = insamples->pts - silence->duration / av_q2d(inlink->time_base); |
|
|
|
av_log(silence, AV_LOG_INFO, |
|
|
|
av_log(silence, AV_LOG_INFO, |
|
|
|
"silence_start: %f\n", silence->start); |
|
|
|
"silence_start: %s\n", av_ts2timestr(silence->start, &inlink->time_base)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
if (silence->start) { |
|
|
|
if (silence->start) |
|
|
|
double end = insamples->pts * av_q2d(inlink->time_base); |
|
|
|
|
|
|
|
av_log(silence, AV_LOG_INFO, |
|
|
|
av_log(silence, AV_LOG_INFO, |
|
|
|
"silence_end: %f | silence_duration: %f\n", |
|
|
|
"silence_end: %s | silence_duration: %s\n", |
|
|
|
end, end - silence->start); |
|
|
|
av_ts2timestr(insamples->pts, &inlink->time_base), |
|
|
|
} |
|
|
|
av_ts2timestr(insamples->pts - silence->start, &inlink->time_base)); |
|
|
|
silence->nb_null_samples = silence->start = 0; |
|
|
|
silence->nb_null_samples = silence->start = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|