[FFmpeg-devel] [PATCH] avfilter/af_atempo: fix sound shake when change speed

Steven Liu lingjiujianke at gmail.com
Sat Feb 18 08:38:12 EET 2017


2017-02-18 10:28 GMT+08:00 Pavel Koshevoy <pkoshevoy at gmail.com>:

> On Fri, Feb 17, 2017 at 1:55 AM, Steven Liu <lq at chinaffmpeg.org> wrote:
> > commandline:
> > ./ffmpeg -i ~/Downloads/test.wav -af atempo=1.5 -acodec aac -y
> > output.aac
> >
> > play the output.aac, the sound is very shake, terrible.
> > after this patch,
> > play the sound is smooth
> >
> > Signed-off-by: Steven Liu <lq at chinaffmpeg.org>
> > ---
> >  libavfilter/af_atempo.c | 17 +++++++----------
> >  1 file changed, 7 insertions(+), 10 deletions(-)
> >
> > diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
> > index a487882..db2f981 100644
> > --- a/libavfilter/af_atempo.c
> > +++ b/libavfilter/af_atempo.c
> > @@ -123,6 +123,8 @@ typedef struct {
> >      // tempo scaling factor:
> >      double tempo;
> >
> > +    int drift;
> > +
> >      // a snapshot of previous fragment input and output position values
> >      // captured when the tempo scale factor was set most recently:
> >      int64_t origin[2];
> > @@ -179,6 +181,7 @@ static void yae_clear(ATempoContext *atempo)
> >      atempo->head = 0;
> >      atempo->tail = 0;
> >
> > +    atempo->drift = 0;
> >      atempo->nfrag = 0;
> >      atempo->state = YAE_LOAD_FRAGMENT;
> >
> > @@ -696,21 +699,12 @@ static int yae_adjust_position(ATempoContext
> *atempo)
> >      const AudioFragment *prev = yae_prev_frag(atempo);
> >      AudioFragment       *frag = yae_curr_frag(atempo);
> >
> > -    const double prev_output_position =
> > -        (double)(prev->position[1] - atempo->origin[1] + atempo->window
> / 2);
> > -
> > -    const double ideal_output_position =
> > -        (double)(prev->position[0] - atempo->origin[0] + atempo->window
> / 2) /
> > -        atempo->tempo;
> > -
> > -    const int drift = (int)(prev_output_position -
> ideal_output_position);
> > -
> >      const int delta_max  = atempo->window / 2;
> >      const int correction = yae_align(frag,
> >                                       prev,
> >                                       atempo->window,
> >                                       delta_max,
> > -                                     drift,
> > +                                     atempo->drift,
> >                                       atempo->correlation,
> >                                       atempo->complex_to_real);
> >
> > @@ -722,6 +716,9 @@ static int yae_adjust_position(ATempoContext
> *atempo)
> >          frag->nsamples = 0;
> >      }
> >
> > +    // update cumulative correction drift counter:
> > +    atempo->drift += correction;
> > +
> >      return correction;
> >  }
> >
>
>
> Essentially, what you are doing here is reverting
> 0c77cdb491de7a178e4142cb6a24538eec6b4f64
>
>     libavfilter/af_atempo: Avoid round-off error build-up, ticket #2484
>
>     Current method for constraining fragment position drift suffers from
>     round-off error build up.
>
>     Instead of calculating cumulative drift as a sum of input fragment
>     position corrections, it is more accurate to calculate drift as the
>     difference between current fragment position and the ideal position
>     specified by the tempo scale factor.
>
>
> Can you open another ticket and attach your sample file to it so I can
> see how terrible it really sounds, and attempt a less destructive
> solution perhaps?  Please attach your output file as well.
>
> Thank you,
>     Pavel.




Ok, tickets has been create;
https://trac.ffmpeg.org/ticket/6157


More information about the ffmpeg-devel mailing list