My goal was to compile minimal FFMPEG binary on Windows with the following properties:
- is statically-linked
- has jpeg decoder
- has vp8 encoder
- has a few enabled filters
- both win32 and win64
Here's my log as of September 3, 2020.
Some context:
- I had success compiling FFMPEG on mac for mac - here's the log
- I failed cross-compiling FFMPEG from mac to windows using https://github.com/rdp/ffmpeg-windows-build-helpers without success. I also failed to cross-compile from barebone ubuntu-18.04 docker image to windows as well. I roughly documented my steps here: https://gist.github.com/aslushnikov/2f07c6219e4d2b02b99f77edd6b7cb12. Resulting build didn't have vp8 encoder.
- I failed using https://github.com/m-ab-s/media-autobuild_suite on Windows 10. The minimal build that I was able to get was 62MB and was full of codecs.
As a result, I succeeded using MSYS2
that I downloaded from https://www.msys2.org/ and installed to c:\msys64
.
-
Launch
c:\msys64\mingw64
to launch a shell with a proper environment. -
MSYS2
usespacman
to install dependencies. Run the following commands to update & install packages:
$ pacman -Syu
$ pacman -Su
$ pacman -S make pkgconf diffutils yasm
$ pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2
notes:
yasm
is needed forlibvpx
- the rest is a general compilation toolchain
- Compile
libvpx
manually and install library to a well-known location (prefix):
$ cd /c/
$ git clone https://chromium.googlesource.com/webm/libvpx
$ cd libvpx
$ ./configure --prefix=/eee64 --target=x86_64-win64-gcc --enable-static --disable-shared --disable-docs --disable-tools --disable-unit-tests --disable-examples
$ make && make install
Note: libvpx
has a useful readme: https://chromium.googlesource.com/webm/libvpx/+/master/README
- Once
libvpx
is compiled, compileffmpeg
using the just-compiledlibvpx
:
$ cd /c/
$ git clone git://source.ffmpeg.org/ffmpeg.git
$ cd ffmpeg
$ git checkout n4.3.1
$ ./configure --extra-cflags="-I/eee64/include" \
--extra-ldflags="-L/eee64/lib -static" \
--prefix=/eee64 \
--pkg-config-flags="--static" \
--bindir=$PWD/output/bin \
--disable-everything \
--enable-ffmpeg \
--enable-protocol=pipe \
--enable-protocol=file \
--enable-parser=mjpeg \
--enable-decoder=mjpeg \
--enable-demuxer=image2pipe \
--enable-filter=pad \
--enable-filter=crop \
--enable-filter=scale \
--enable-muxer=webm \
--enable-libvpx \
--enable-static \
--enable-encoder=libvpx_vp8 \
--disable-pthreads \
--disable-zlib \
--disable-iconv \
--disable-bzlib \
--disable-w32threads
$ make && make install
note: the following resources helped me to deal with some dynamic dependencies in the resulting ffmpeg.exe
:
-
Launch
c:\msys64\mingw32
to launch a shell with a proper environment. i'm not sure if this is required or everything could be done frommingw64
- but it worked. -
Update libraries for mingw32
$ pacman -Syu
$ pacman -Su
- Uninstall the
x86_64
compilers that we installed to build win64 version:
$ pacman -R mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2
- Install the i686 compilers instead of their x86_64 counterparts:
$ pacman -S mingw-w64-i686-nasm mingw-w64-i686-gcc mingw-w64-i686-SDL2
- Remove all old source folders - we'll re-clone everything later for simplicity
$ rm -rf /c/ffmpeg && rm -rf /c/libvpx
- Clone & compile libvpx. Notice a change:
--target=x86-win32-gcc
$ cd /c/
$ git clone https://chromium.googlesource.com/webm/libvpx
$ cd libvpx
$ ./configure --prefix=/eee32 --target=x86-win32-gcc --enable-static --disable-shared --disable-docs --disable-tools --disable-unit-tests --disable-examples
$ make && make install
- Clone & compile ffmpeg
$ cd /c/
$ git clone git://source.ffmpeg.org/ffmpeg.git
$ cd ffmpeg
$ git checkout n4.3.1
$ ./configure --extra-cflags="-I/eee32/include" \
--extra-ldflags="-L/eee32/lib -static" \
--prefix=/eee32 \
--pkg-config-flags="--static" \
--bindir=$PWD/output/bin \
--disable-everything \
--enable-ffmpeg \
--enable-protocol=pipe \
--enable-protocol=file \
--enable-parser=mjpeg \
--enable-decoder=mjpeg \
--enable-demuxer=image2pipe \
--enable-filter=pad \
--enable-filter=crop \
--enable-filter=scale \
--enable-muxer=webm \
--enable-libvpx \
--enable-static \
--enable-encoder=libvpx_vp8 \
--disable-pthreads \
--disable-zlib \
--disable-iconv \
--disable-bzlib \
--disable-w32threads
$ make && make install
note: using -j
for make somehow breaks compilation - so I'd suggest compiling everything in one thread.