diff --git a/.gitmodules b/.gitmodules
index e5187598c..70f5ee225 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -80,5 +80,5 @@
     path = externals/sirit
     url = https://github.com/yuzu-emu/sirit
 [submodule "library-headers"]
-    path = externals/library-headers
+    path = externals/library-headers/library-headers
     url = https://github.com/citra-emu/ext-library-headers.git
diff --git a/externals/library-headers/CMakeLists.txt b/externals/library-headers/CMakeLists.txt
new file mode 100644
index 000000000..a3cc02606
--- /dev/null
+++ b/externals/library-headers/CMakeLists.txt
@@ -0,0 +1,48 @@
+add_library(library-headers INTERFACE)
+
+# libfdk-aac headers
+find_path(FDK_AAC_INCLUDES NAMES fdk-aac/aacdecoder_lib.h)
+if (FDK_AAC_INCLUDES STREQUAL "FDK_AAC_INCLUDES-NOTFOUND")
+    message(STATUS "fdk_aac headers not found, using bundled headers.")
+    target_include_directories(library-headers INTERFACE ./library-headers/fdk-aac/include)
+else()
+    message(STATUS "Using headers from system fdk_aac")
+    target_include_directories(library-headers SYSTEM INTERFACE ${FDK_AAC_INCLUDES})
+endif()
+
+# FFmpeg headers
+find_path(AVUTIL_INCLUDES NAMES libavutil/avutil.h)
+find_path(AVCODEC_INCLUDES NAMES libavcodec/avcodec.h)
+find_path(AVFORMAT_INCLUDES NAMES libavformat/avformat.h)
+find_path(AVFILTER_INCLUDES NAMES libavfilter/avfilter.h)
+find_path(SWRESAMPLE_INCLUDES NAMES libswresample/swresample.h)
+# Make sure all the headers are found and from the same place, so we don't
+# have missing or mismatched components.
+if (AVUTIL_INCLUDES STREQUAL "AVUTIL_INCLUDES-NOTFOUND"
+    OR NOT AVCODEC_INCLUDES STREQUAL AVUTIL_INCLUDES
+    OR NOT AVFORMAT_INCLUDES STREQUAL AVUTIL_INCLUDES
+    OR NOT AVFILTER_INCLUDES STREQUAL AVUTIL_INCLUDES
+    OR NOT SWRESAMPLE_INCLUDES STREQUAL AVUTIL_INCLUDES)
+    message(STATUS "Complete FFmpeg headers not found, using bundled headers.")
+    target_include_directories(library-headers INTERFACE ./library-headers/ffmpeg/include)
+else()
+    # Extract libavutil version from header.
+    file(STRINGS "${AVUTIL_INCLUDES}/libavutil/version.h" AVUTIL_VERSION_DATA
+        REGEX "#define LIBAVUTIL_VERSION_(MAJOR|MINOR|MICRO) ")
+    set(AVUTIL_VERSION_REGEX "([0-9]+)")
+    foreach(v MAJOR MINOR MICRO)
+        if("${AVUTIL_VERSION_DATA}" MATCHES "#define LIBAVUTIL_VERSION_${v}[\\t ]+${AVUTIL_VERSION_REGEX}")
+            set(AVUTIL_VERSION_${v} "${CMAKE_MATCH_1}")
+        endif()
+    endforeach()
+    set(AVUTIL_VERSION "${AVUTIL_VERSION_MAJOR}.${AVUTIL_VERSION_MINOR}.${AVUTIL_VERSION_MICRO}")
+
+    message(STATUS "Detected FFmpeg libavutil version is ${AVUTIL_VERSION}")
+    if ("${AVUTIL_VERSION}" VERSION_LESS "56.30.100")
+        message(WARNING "System FFmpeg version is too low (< 4.2), using bundled headers.")
+        target_include_directories(library-headers INTERFACE ./library-headers/ffmpeg/include)
+    else()
+        message(STATUS "Using headers from system FFmpeg")
+        target_include_directories(library-headers SYSTEM INTERFACE ${AVUTIL_INCLUDES})
+    endif()
+endif()
diff --git a/externals/library-headers b/externals/library-headers/library-headers
similarity index 100%
rename from externals/library-headers
rename to externals/library-headers/library-headers