diff --git a/configure b/configure
index c157338b1f..8c1e88febe 100755
--- a/configure
+++ b/configure
@@ -1787,7 +1787,6 @@ EXTERNAL_LIBRARY_GPL_LIST="
 
 EXTERNAL_LIBRARY_NONFREE_LIST="
     decklink
-    libfdk_aac
     libtls
 "
 
@@ -1886,6 +1885,7 @@ EXTERNAL_LIBRARY_LIST="
     openssl
     pocketsphinx
     vapoursynth
+	libfdk_aac
 "
 
 HWACCEL_AUTODETECT_LIBRARY_LIST="
@@ -6576,9 +6576,7 @@ enabled libdav1d          && require_pkg_config libdav1d "dav1d >= 0.5.0" "dav1d
 enabled libdavs2          && require_pkg_config libdavs2 "davs2 >= 1.6.0" davs2.h davs2_decoder_open
 enabled libdc1394         && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
 enabled libdrm            && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion
-enabled libfdk_aac        && { check_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
-                               { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
-                                 warn "using libfdk without pkg-config"; } }
+enabled libfdk_aac        && require_headers fdk-aac/aacenc_lib.h
 flite_extralibs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
 enabled libflite          && require libflite "flite/flite.h" flite_init $flite_extralibs
 enabled fontconfig        && enable libfontconfig
diff --git a/libavcodec/libfdk-aac_internal.h b/libavcodec/libfdk-aac_internal.h
new file mode 100644
index 0000000000..9bcfdb9aba
--- /dev/null
+++ b/libavcodec/libfdk-aac_internal.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2018 Gianluigi Tiesi
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_LIBFDK_AAC_INTERNAL_H
+#define AVCODEC_LIBFDK_AAC_INTERNAL_H
+
+#ifdef _WIN32
+#include <windows.h>
+#define LIBNAME "libfdk-aac-2.dll"
+#define dlopen(fname, f) ((void *) LoadLibraryA(fname))
+#define dlclose(handle) FreeLibrary((HMODULE) handle)
+#define dlsym(handle, name) GetProcAddress((HMODULE) handle, name)
+#else
+#include <dlfcn.h>
+#define LIBNAME "libfdk-aac.so.2"
+#endif
+
+#define DLSYM(x) \
+    do \
+    { \
+        s->pfn.x = ( imp_##x ) dlsym(s->hLib, AV_STRINGIFY(x)); \
+        if (!s->pfn.x ) \
+        { \
+            av_log(avctx, AV_LOG_ERROR, "Unable to find symbol " AV_STRINGIFY(x) " in dynamic " LIBNAME "\n"); \
+            return -1; \
+        } \
+    } while (0)
+
+
+#include <fdk-aac/aacenc_lib.h>
+#include <fdk-aac/aacdecoder_lib.h>
+
+typedef AACENC_ERROR (*imp_aacEncOpen)(HANDLE_AACENCODER *phAacEncoder, const UINT encModules, const UINT maxChannels);
+typedef AACENC_ERROR (*imp_aacEncClose)(HANDLE_AACENCODER *phAacEncoder);
+typedef AACENC_ERROR (*imp_aacEncEncode)(const HANDLE_AACENCODER hAacEncoder, const AACENC_BufDesc *inBufDesc, const AACENC_BufDesc *outBufDesc, const AACENC_InArgs *inargs, AACENC_OutArgs *outargs);
+typedef AACENC_ERROR (*imp_aacEncInfo)(const HANDLE_AACENCODER hAacEncoder, AACENC_InfoStruct *pInfo);
+typedef AACENC_ERROR (*imp_aacEncoder_SetParam)(const HANDLE_AACENCODER hAacEncoder, const AACENC_PARAM param, const UINT value);
+
+typedef struct _aacEncLib {
+    imp_aacEncOpen aacEncOpen;
+    imp_aacEncClose aacEncClose;
+    imp_aacEncEncode aacEncEncode;
+    imp_aacEncInfo aacEncInfo;
+    imp_aacEncoder_SetParam aacEncoder_SetParam;
+} aacEncLib;
+
+typedef LINKSPEC_H HANDLE_AACDECODER (*imp_aacDecoder_Open)(TRANSPORT_TYPE transportFmt, UINT nrOfLayers);
+typedef LINKSPEC_H void (*imp_aacDecoder_Close)(HANDLE_AACDECODER self);
+typedef LINKSPEC_H AAC_DECODER_ERROR (*imp_aacDecoder_Fill)(HANDLE_AACDECODER self, UCHAR *pBuffer[], const UINT bufferSize[], UINT *bytesValid);
+typedef LINKSPEC_H AAC_DECODER_ERROR (*imp_aacDecoder_DecodeFrame)(HANDLE_AACDECODER self, INT_PCM *pTimeData, const INT timeDataSize, const UINT flags);
+typedef LINKSPEC_H CStreamInfo* (*imp_aacDecoder_GetStreamInfo)(HANDLE_AACDECODER self);
+typedef LINKSPEC_H AAC_DECODER_ERROR (*imp_aacDecoder_ConfigRaw)(HANDLE_AACDECODER self, UCHAR *conf[], const UINT length[]);
+typedef LINKSPEC_H AAC_DECODER_ERROR (*imp_aacDecoder_SetParam)(const HANDLE_AACDECODER self, const AACDEC_PARAM param, const INT value);
+typedef LINKSPEC_H AAC_DECODER_ERROR (*imp_aacDecoder_AncDataInit)(HANDLE_AACDECODER self, UCHAR *buffer, int size);
+
+typedef struct _aacDecLib {
+    imp_aacDecoder_Open aacDecoder_Open;
+    imp_aacDecoder_Close aacDecoder_Close;
+    imp_aacDecoder_Fill aacDecoder_Fill;
+    imp_aacDecoder_DecodeFrame aacDecoder_DecodeFrame;
+    imp_aacDecoder_ConfigRaw aacDecoder_ConfigRaw;
+    imp_aacDecoder_GetStreamInfo aacDecoder_GetStreamInfo;
+    imp_aacDecoder_SetParam aacDecoder_SetParam;
+    imp_aacDecoder_AncDataInit aacDecoder_AncDataInit;
+} aacDecLib;
+
+#endif /* AVCODEC_LIBFDK_AAC_INTERNAL_H */
\ No newline at end of file
diff --git a/libavcodec/libfdk-aacdec.c b/libavcodec/libfdk-aacdec.c
index 8c1586e25e..9cf71838a9 100644
--- a/libavcodec/libfdk-aacdec.c
+++ b/libavcodec/libfdk-aacdec.c
@@ -25,6 +25,7 @@
 #include "avcodec.h"
 #include "codec_internal.h"
 #include "decode.h"
+#include "libfdk-aac_internal.h"
 
 #ifdef AACDECODER_LIB_VL0
 #define FDKDEC_VER_AT_LEAST(vl0, vl1) \
@@ -48,6 +49,8 @@ enum ConcealMethod {
 typedef struct FDKAACDecContext {
     const AVClass *class;
     HANDLE_AACDECODER handle;
+	void *hLib;
+    aacDecLib pfn;
     uint8_t *decoder_buffer;
     int decoder_buffer_size;
     uint8_t *anc_buffer;
@@ -113,7 +116,7 @@ static const AVClass fdk_aac_dec_class = {
 static int get_stream_info(AVCodecContext *avctx)
 {
     FDKAACDecContext *s   = avctx->priv_data;
-    CStreamInfo *info     = aacDecoder_GetStreamInfo(s->handle);
+    CStreamInfo *info     = s->pfn.aacDecoder_GetStreamInfo(s->handle);
     int channel_counts[0x24] = { 0 };
     int i, ch_error       = 0;
     uint64_t ch_layout    = 0;
@@ -231,8 +234,10 @@ static av_cold int fdk_aac_decode_close(AVCodecContext *avctx)
 {
     FDKAACDecContext *s = avctx->priv_data;
 
-    if (s->handle)
-        aacDecoder_Close(s->handle);
+    if (s->hLib && s->handle) {
+        s->pfn.aacDecoder_Close(s->handle);
+        dlclose(s->hLib);
+    }
     av_freep(&s->decoder_buffer);
     av_freep(&s->anc_buffer);
 
@@ -244,6 +249,28 @@ static av_cold int fdk_aac_decode_init(AVCodecContext *avctx)
     FDKAACDecContext *s = avctx->priv_data;
     AAC_DECODER_ERROR err;
 
+	if (!(s->hLib = dlopen(LIBNAME, RTLD_NOW))) {
+		av_log(avctx, AV_LOG_ERROR, "Unable to load " LIBNAME "\n");
+		return -1;
+	}
+
+	DLSYM(aacDecoder_Open);
+#define aacDecoder_Open s->pfn.aacDecoder_Open
+	DLSYM(aacDecoder_Close);
+	DLSYM(aacDecoder_Fill);
+#define aacDecoder_Fill s->pfn.aacDecoder_Fill
+	DLSYM(aacDecoder_DecodeFrame);
+#define aacDecoder_DecodeFrame s->pfn.aacDecoder_DecodeFrame
+	DLSYM(aacDecoder_GetStreamInfo);
+#define aacDecoder_GetStreamInfo s->pfn.aacDecoder_GetStreamInfo
+	DLSYM(aacDecoder_ConfigRaw);
+#define aacDecoder_ConfigRaw s->pfn.aacDecoder_ConfigRaw
+	DLSYM(aacDecoder_SetParam);
+#define aacDecoder_SetParam s->pfn.aacDecoder_SetParam
+	DLSYM(aacDecoder_AncDataInit);
+#define aacDecoder_AncDataInit s->pfn.aacDecoder_AncDataInit
+
+
     s->handle = aacDecoder_Open(avctx->extradata_size ? TT_MP4_RAW : TT_MP4_ADTS, 1);
     if (!s->handle) {
         av_log(avctx, AV_LOG_ERROR, "Error opening decoder\n");
diff --git a/libavcodec/libfdk-aacenc.c b/libavcodec/libfdk-aacenc.c
index fc2e71c51f..2083f38824 100644
--- a/libavcodec/libfdk-aacenc.c
+++ b/libavcodec/libfdk-aacenc.c
@@ -27,6 +27,7 @@
 #include "codec_internal.h"
 #include "encode.h"
 #include "profiles.h"
+#include "libfdk-aac_internal.h"
 
 #ifdef AACENCODER_LIB_VL0
 #define FDKENC_VER_AT_LEAST(vl0, vl1) \
@@ -47,6 +48,8 @@ typedef struct AACContext {
     int header_period;
     int vbr;
 
+	void *hLib;
+	aacEncLib pfn;
     AudioFrameQueue afq;
 } AACContext;
 
@@ -111,8 +114,10 @@ static int aac_encode_close(AVCodecContext *avctx)
 {
     AACContext *s = avctx->priv_data;
 
-    if (s->handle)
-        aacEncClose(&s->handle);
+    if (s->hLib && s->handle) {
+        s->pfn.aacEncClose(&s->handle);
+        dlclose(s->hLib);
+    }
     ff_af_queue_close(&s->afq);
 
     return 0;
@@ -128,6 +133,22 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
     int aot = FF_PROFILE_AAC_LOW + 1;
     int sce = 0, cpe = 0;
 
+	if (!(s->hLib = dlopen(LIBNAME, RTLD_NOW))) {
+        av_log(avctx, AV_LOG_ERROR, "Unable to load " LIBNAME "\n");
+        return -1;
+    }
+
+    DLSYM(aacEncOpen);
+#define aacEncOpen s->pfn.aacEncOpen
+    DLSYM(aacEncClose);
+    DLSYM(aacEncEncode);
+#define aacEncEncode s->pfn.aacEncEncode
+    DLSYM(aacEncInfo);
+#define aacEncInfo s->pfn.aacEncInfo
+    DLSYM(aacEncoder_SetParam);
+#define aacEncoder_SetParam s->pfn.aacEncoder_SetParam
+
+
     if ((err = aacEncOpen(&s->handle, 0, avctx->ch_layout.nb_channels)) != AACENC_OK) {
         av_log(avctx, AV_LOG_ERROR, "Unable to open the encoder: %s\n",
                aac_get_error(err));
