FFmpeg is a cross-platform, open-source audio and video processing library. In this article you will learn how to compile a lightweight, audio-only version of FFmpeg for Windows and Visual Studio. You can find prebuilt binaries of the audio-only FFmpeg package on my Github project page.
If you prefer the full build, you can check out github.com/GyanD/codexffmpeg, for example version 7.1 or the previous major version 6.1.1. Download the ffmpeg-x.x.x-full_build-shared.7z
archive to get the shared libraries (including headers and link libraries) and then follow the instructions on Managing C/C++ library dependencies on Windows to make the header and library files accessible to CMake or Visual Studio.
Prerequisites
- Visual Studio (the Community edition or Build Tools with Desktop development with C++ workload will do)
- MSYS2 (follow the install instructions on their website)
Though GCC
isn’t needed for building FFmpeg here, the easiest way to get the build script running, is to install the basic C/C++ tooling for MSYS2 with pacman -S --needed base-devel
(otherwise, install tools like autoconf
or make
manually).
License
Using the shell script below, resulting FFmpeg binaries will be licensed under LGPLv2.1. Still, please make sure to read https://www.ffmpeg.org/legal.html carefully.
Building FFmpeg
The following guide to build FFmpeg with Visual Studio is based on https://trac.ffmpeg.org/wiki/CompilationGuide/MSVC :
- Download the latest FFmpeg release from https://www.ffmpeg.org/download.html#releases and extract the archive, for example to
C:\ffmpeg
. - Save the shell script as
ffmpeg_build.sh
toC:\ffmpeg
. - Press Windows key to open the start menu, type “native” and select “x64 Native Tools Command Prompt for VS 2022”.
- Type
where link.exe
(this will return the full path to Visual Studio’s link.exe). - Make sure that the path shown and the path defined as
VC_TOOLS_DIR
in the shell script are the same. If not, update the shell script. Keep in mind, that a path like"C:\Program Files"
is written as"/c/Program Files"
in MSYS2. - Execute the command
C:\msys64\msys2_shell.cmd -mingw64
. This will open MSYS2 in another command prompt window. All following commands will be entered there. If you installed MSYS2 in a different location, make sure to use the correct path. - Temporarily rename the MSYS2 linker with
mv /usr/bin/link.exe /usr/bin/link_.exe
. This is necessary to make the build script use the correct linker of Visual Studio. - Navigate to the FFmpeg source directory, for example
cd /c/ffmpeg
. - Build FFmpeg by typing
./ffmpeg_build.sh
. The configure step might take a few seconds, the build step shouldn’t take very long since large parts of the library are disabled. - Once the build finished, the libraries can be found in the build subdirectory, for example
/c/ffmpeg/build
. - Undo the renaming of MSYS2 linker with
mv /usr/bin/link_.exe /usr/bin/link.exe
.
Shell script
This script is based on Essentia build_config.sh and AcoustID ffmpeg-build. Note that it does not support MP3 encoding (decoding is supported). If you want to build FFmpeg with MP3 encoding support add --enable-libmp3lame
, --enable-muxer=mp3
and --enable-encoder=libmp3lame
flags.
#!/usr/bin/env bash
set -eu
BASE_DIR=$(pwd)
OUTPUT_DIR=build
VC_TOOLS_DIR="/c/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64"
mkdir -p $OUTPUT_DIR
FFMPEG_CONFIGURE_FLAGS=(
--disable-static
--enable-shared
--enable-pic
--enable-asm
--enable-cross-compile
--disable-doc
--disable-debug
--disable-programs
--disable-avdevice
--disable-avfilter
--disable-postproc
--disable-swscale
--disable-network
--disable-muxers
--disable-demuxers
--disable-bsfs
--disable-filters
--disable-parsers
--disable-indevs
--disable-outdevs
--disable-encoders
--disable-decoders
--disable-hwaccels
--disable-nvenc
--disable-vulkan
--disable-videotoolbox
--disable-audiotoolbox
--disable-libopenjpeg
--disable-protocols
--enable-protocol=file
--enable-protocol=pipe
--disable-lzma
--disable-zlib
--disable-xlib
--disable-bzlib
--disable-iconv
--enable-demuxer=aac
--enable-demuxer=ac3
--enable-demuxer=aiff
--enable-demuxer=ape
--enable-demuxer=asf
--enable-demuxer=flac
--enable-demuxer=flv
--enable-demuxer=matroska
--enable-demuxer=mov
--enable-demuxer=m4v
--enable-demuxer=mp3
--enable-demuxer=mpc
--enable-demuxer=mpc8
--enable-demuxer=ogg
--enable-demuxer=pcm_alaw
--enable-demuxer=pcm_mulaw
--enable-demuxer=pcm_f64be
--enable-demuxer=pcm_f64le
--enable-demuxer=pcm_f32be
--enable-demuxer=pcm_f32le
--enable-demuxer=pcm_s32be
--enable-demuxer=pcm_s32le
--enable-demuxer=pcm_s24be
--enable-demuxer=pcm_s24le
--enable-demuxer=pcm_s16be
--enable-demuxer=pcm_s16le
--enable-demuxer=pcm_s8
--enable-demuxer=pcm_u32be
--enable-demuxer=pcm_u32le
--enable-demuxer=pcm_u24be
--enable-demuxer=pcm_u24le
--enable-demuxer=pcm_u16be
--enable-demuxer=pcm_u16le
--enable-demuxer=pcm_u8
--enable-demuxer=shorten
--enable-demuxer=tak
--enable-demuxer=tta
--enable-demuxer=wav
--enable-demuxer=wv
--enable-demuxer=xwma
--enable-demuxer=dsf
--enable-decoder=aac
--enable-decoder=aac_latm
--enable-decoder=ac3
--enable-decoder=alac
--enable-decoder=als
--enable-decoder=ape
--enable-decoder=atrac1
--enable-decoder=atrac3
--enable-decoder=eac3
--enable-decoder=flac
--enable-decoder=gsm
--enable-decoder=gsm_ms
--enable-decoder=mp1
--enable-decoder=mp1float
--enable-decoder=mp2
--enable-decoder=mp2float
--enable-decoder=mp3
--enable-decoder=mp3adu
--enable-decoder=mp3adufloat
--enable-decoder=mp3float
--enable-decoder=mp3on4
--enable-decoder=mp3on4float
--enable-decoder=mpc7
--enable-decoder=mpc8
--enable-decoder=opus
--enable-decoder=ralf
--enable-decoder=shorten
--enable-decoder=tak
--enable-decoder=tta
--enable-decoder=vorbis
--enable-decoder=wavpack
--enable-decoder=wmalossless
--enable-decoder=wmapro
--enable-decoder=wmav1
--enable-decoder=wmav2
--enable-decoder=wmavoice
--enable-decoder=pcm_alaw
--enable-decoder=pcm_bluray
--enable-decoder=pcm_dvd
--enable-decoder=pcm_f32be
--enable-decoder=pcm_f32le
--enable-decoder=pcm_f64be
--enable-decoder=pcm_f64le
--enable-decoder=pcm_lxf
--enable-decoder=pcm_mulaw
--enable-decoder=pcm_s8
--enable-decoder=pcm_s8_planar
--enable-decoder=pcm_s16be
--enable-decoder=pcm_s16be_planar
--enable-decoder=pcm_s16le
--enable-decoder=pcm_s16le_planar
--enable-decoder=pcm_s24be
--enable-decoder=pcm_s24daud
--enable-decoder=pcm_s24le
--enable-decoder=pcm_s24le_planar
--enable-decoder=pcm_s32be
--enable-decoder=pcm_s32le
--enable-decoder=pcm_s32le_planar
--enable-decoder=pcm_u8
--enable-decoder=pcm_u16be
--enable-decoder=pcm_u16le
--enable-decoder=pcm_u24be
--enable-decoder=pcm_u24le
--enable-decoder=pcm_u32be
--enable-decoder=pcm_u32le
--enable-decoder=dsd_lsbf
--enable-decoder=dsd_msbf
--enable-decoder=dsd_lsbf_planar
--enable-decoder=dsd_msbf_planar
--enable-parser=aac
--enable-parser=aac_latm
--enable-parser=ac3
--enable-parser=cook
--enable-parser=dca
--enable-parser=flac
--enable-parser=gsm
--enable-parser=mpegaudio
--enable-parser=tak
--enable-parser=vorbis
--enable-muxer=wav
--enable-muxer=aiff
--enable-muxer=ogg
--enable-muxer=flac
--enable-encoder=pcm_s16le
--enable-encoder=pcm_s16be
--enable-encoder=vorbis
--enable-encoder=flac
)
FFMPEG_CONFIGURE_FLAGS+=(
--prefix=$BASE_DIR/$OUTPUT_DIR
--target-os=win64
--toolchain=msvc
--arch=x86_64
--build-suffix=-audio
)
export PATH=$VC_TOOLS_DIR:$PATH
./configure "${FFMPEG_CONFIGURE_FLAGS[@]}"
make -j4
make install
Please use the contact form for comments.