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

Steven Liu lq at chinaffmpeg.org
Fri Feb 17 10:55:51 EET 2017


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;
 }
 
-- 
2.10.1.382.ga23ca1b.dirty





More information about the ffmpeg-devel mailing list