diff --git a/configure b/configure
index 0de9b2abcb..7e9eb8f3b2 100755
--- a/configure
+++ b/configure
@@ -3328,7 +3328,7 @@ libdav1d_decoder_deps="libdav1d"
 libdav1d_decoder_select="atsc_a53"
 libdavs2_decoder_deps="libdavs2"
 libdavs2_decoder_select="avs2_parser"
-libfdk_aac_decoder_deps="libfdk_aac"
+libfdk_aac_decoder_deps="libfdk_aac fmtconvert"
 libfdk_aac_encoder_deps="libfdk_aac"
 libfdk_aac_encoder_select="audio_frame_queue"
 libgme_demuxer_deps="libgme"
diff --git a/libavcodec/libfdk-aacdec.c b/libavcodec/libfdk-aacdec.c
index 11eee51a98..9e199eb56f 100644
--- a/libavcodec/libfdk-aacdec.c
+++ b/libavcodec/libfdk-aacdec.c
@@ -25,6 +25,7 @@
 #include "avcodec.h"
 #include "codec_internal.h"
 #include "internal.h"
+#include "fmtconvert.h"
 
 #ifdef AACDECODER_LIB_VL0
 #define FDKDEC_VER_AT_LEAST(vl0, vl1) \
@@ -65,6 +66,7 @@ typedef struct FDKAACDecContext {
     int delay_samples;
 #endif
     AVChannelLayout downmix_layout;
+    FmtConvertContext fmt_conv;
 } FDKAACDecContext;
 
 
@@ -367,13 +369,15 @@ FF_ENABLE_DEPRECATION_WARNINGS
     }
 #endif
 
-    avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+    avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
 
     s->decoder_buffer_size = DECODER_BUFFSIZE * DECODER_MAX_CHANNELS;
     s->decoder_buffer = av_malloc(s->decoder_buffer_size);
     if (!s->decoder_buffer)
         return AVERROR(ENOMEM);
 
+    ff_fmt_convert_init(&s->fmt_conv, avctx);
+
     return 0;
 }
 
@@ -452,9 +456,11 @@ static int fdk_aac_decode_frame(AVCodecContext *avctx, AVFrame *frame,
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         goto end;
 
-    memcpy(frame->extended_data[0], s->decoder_buffer + input_offset,
-           avctx->ch_layout.nb_channels * frame->nb_samples *
-           av_get_bytes_per_sample(avctx->sample_fmt));
+    const int count = avctx->channels * avctx->frame_size;
+    const float scale = 1.0f / (float)0x800000;
+    s->fmt_conv.int32_to_float_fmul_scalar((float *) frame->extended_data[0],
+                                           (INT_PCM *) s->decoder_buffer,
+                                           scale, count);
 
     *got_frame_ptr = 1;
     ret = avpkt->size - valid;
