diff --git a/meson.build b/meson.build
index 56752902aee8539fc1e07b150580e316e9b42449..a5e872afc58dcacace1940b09954c7c970c785dc 100644
--- a/meson.build
+++ b/meson.build
@@ -139,7 +139,7 @@ foreach dep: [
     ['portaudio-2.0', '', 'PortAudio'],
     ['openal', '>=0.0.8', 'OpenAL'],
     # video
-    ['ffms2', '', 'FFMS2'], # needs a proper port
+    ['ffms2', '', 'FFMS2'],
     # other
     ['fftw3', '', 'FFTW3'],
     ['hunspell', '', 'Hunspell'], # needs a proper port
diff --git a/subprojects/ffmpeg.wrap b/subprojects/ffmpeg.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..0a59585ad4c8e01928cac251a34308a794300c7c
--- /dev/null
+++ b/subprojects/ffmpeg.wrap
@@ -0,0 +1,11 @@
+[wrap-git]
+directory = ffmpeg
+url = https://gitlab.freedesktop.org/gstreamer/meson-ports/ffmpeg.git
+revision = meson-4.3
+
+[provide]
+libavformat = libavformat_dep
+libavcodec = libavcodec_dep
+libswscale = libswscale_dep
+libavutil = libavutil_dep
+libswresample = libswresample_dep
diff --git a/subprojects/ffms2.wrap b/subprojects/ffms2.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..9cb18212f47f2f9d5a952e4fc668f7cd42d8aee3
--- /dev/null
+++ b/subprojects/ffms2.wrap
@@ -0,0 +1,9 @@
+[wrap-file]
+directory = ffms2-2.40
+source_url = https://github.com/FFMS/ffms2/archive/2.40.tar.gz
+source_filename = 2.40.tar.gz
+source_hash = 82e95662946f3d6e1b529eadbd72bed196adfbc41368b2d50493efce6e716320
+patch_directory = ffms2
+
+[provide]
+ffms2 = ffms2_dep
diff --git a/subprojects/packagefiles/ffms2/meson.build b/subprojects/packagefiles/ffms2/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..a7328ea8d730b85e4f574a37686b1322e1014f6d
--- /dev/null
+++ b/subprojects/packagefiles/ffms2/meson.build
@@ -0,0 +1,45 @@
+project('ffms2', 'cpp', version: '2.40.0')
+
+deps = []
+
+deps += dependency('zlib')
+deps += dependency('libavformat')
+deps += dependency('libavcodec')
+deps += dependency('libswscale')
+deps += dependency('libavutil')
+deps += dependency('libswresample')
+
+args = ['-D_FILE_OFFSET_BITNS=64', '-DFFMS_EXPORTS', '-D__STDC_CONSTANT_MACROS']
+usage_args = []
+
+if get_option('default_library') == 'static'
+    usage_args += '-DFFMS_STATIC'
+endif
+
+ffms2_sources = [
+    'src/core/audiosource.cpp',
+    #'src/core/audiosource.h',
+    'src/core/ffms.cpp',
+    'src/core/filehandle.cpp',
+    #'src/core/filehandle.h',
+    'src/core/indexing.cpp',
+    #'src/core/indexing.h',
+    'src/core/track.cpp',
+    #'src/core/track.h',
+    'src/core/utils.cpp',
+    #'src/core/utils.h',
+    'src/core/videosource.cpp',
+    #'src/core/videosource.h',
+    'src/core/videoutils.cpp',
+    #'src/core/videoutils.h',
+    'src/core/zipfile.cpp',
+    #'src/core/zipfile.h',
+]
+
+deps_inc = include_directories('include')
+
+ffms2 = library('ffms2', ffms2_sources, include_directories: deps_inc, dependencies: deps,
+                cpp_args: args + usage_args)
+ffms2_dep = declare_dependency(link_with: ffms2,
+                               include_directories: deps_inc,
+                               compile_args: usage_args)