Compiling audio-only FFmpeg on Windows

How to compile an audio-only version of FFmpeg on Windows

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 to C:\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.