How to compile ffmpeg-2.2.2 on windows with cygwin and android ndk r9c
Solution 1
Start with Roman's tutorial.
Following changes apply to Windows: you should use the NDK make.exe
, not the one from cygwin. So, I simply wrote d:/dev/Android/ndk/prebuilt/windows-x86_64/bin/make.exe
in my build_android.sh. For some weird reason, I could not run make clean
- but I simply chose to ignore this problem for now.
Following the tutorial, don't forget to set
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64
Also, use mixed-style paths, i.e. d:/dev/whatever
and not cygwin style /cygdrive/d/dev/whatever
. Be careful not to use paths with spaces - neither for ndk installation, nor for ffmpeg
git clone.
With ffmpeg 2.2, you can use --target-os=android
for ./configure
, instead of mangling ./configure
file as described in step 2.
On my machine, I did not have pr
and od
commands. I chose simply to fake them, writing
echo 'cat $3' > ./pr
echo 'echo od' > ./od
These do not spoil the build.
So, my build process is as follows:
git clean -d -f -x
./configure --enable-shared --disable-static --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-avdevice --disable-doc --disable-symver --cross-prefix=d:/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi- --target-os=android --arch=arm --enable-cross-compile --sysroot=d:/android-ndk-r9c/platforms/android-9/arch-arm/ --extra-cflags="-Os -fpic"
Compilation does display some warnings, but the .so files are all produced.
To enable NEON, I used
--extra-cflags="-Os -fpic -marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
--extra-ldflags="-Wl,--fix-cortex-a8"
Now, libavcodec.so
could not be built anymore: too many files on the linker list. So, after it crashed, I launched the linker manually:
$ d:/Dev/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64//bin/arm-linux-androideabi-gcc -shared -Wl,-Bsymbolic -Wl,--version-script,libavcodec/libavcodec.ver -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavresample -Llibavutil -Llibpostproc -Llibswscale -Llibswresample -Wl,--fix-cortex-a8 --sysroot=d:/Dev/Android/ndk/platforms/android-9/arch-arm/ -isysroot d:/Dev/Android/ndk/platforms/android-9/arch-arm/ -Wl,--as-needed -Wl,--warn-common -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample @libavcodec/libavcodec.list -lswresample -lavutil -lm -lz -pthread -o libavcodec/libavcodec.so.55
I patch the library.mak
file as follows: for $(SUBDIR)$(SLIBNAME_WITH_MAJOR)
, replace
$$(LD) $(SHFLAGS) $(LDFLAGS) $$(LD_O) $$(filter %.o,$$^) $(FFEXTRALIBS)
with
$(Q)echo >$(SUBDIR)lib$(NAME).list $(wordlist 1,400,$(filter %.o,$$<))
$(Q)echo >>$(SUBDIR)lib$(NAME).list $(wordlist 401,999,$(filter %.o,$$<))
$$(LD) $(SHFLAGS) $(LDFLAGS) $$(LD_O) @$(SUBDIR)lib$(NAME).list $(FFEXTRALIBS)
.. and from there, make
proceeded smoothly.
PS: I used make -n libavcodec/libavcodec.so.55
to prepare the response file libavcodec/libavcodec.list
.
PPS: Here is another article that helps to build and use ffmpeg for Android.
Solution 2
You can use this as build_android.sh i tested it and it worked with me
#!/bin/bash
NDK=D:/android/ndk/android-ndk-r10d
SYSROOT=$NDK/platforms/android-8/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/windows
function build_one
{
./configure \
--prefix=$PREFIX \
--disable-shared \
--enable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
you need also to run this commands :
dos2unix build_android.sh
chmod +x build_android.sh
./build_android.sh
Use this Tutorial as reference
Solution 3
Build it on Ubuntu(Guest) and copy lib's(sub folder in /andoid-ndk/sources/ffmpeg/android) folder to Windows(Host).I tried it for Window but ended with lot of bugs, finally installed Ubuntu (Free) on virtualbox. also you willl have to download Andoid (SDK, Ndk) and JDK. This may sound weird but it worked for me.
Comments
-
Hansjörg Hofer almost 2 years
did someone successfully compile
ffmpeg-2.2.2 on windows with cygwin and android ndkr9c ?
Or can point me to an up to date tutorial ?
(http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/ isn't working for me i get Makefile:2: config.mak: No such file... cygwin admin devel gnome is completely installed and make -v ok )
I need to convert a video to images(for live-wallpaper)... do you know a better method or is ffmpeg the best ?
thx
-
Volodymyr Kulyk almost 10 yearsIf it's not complicated for you. Can you post ready .sh file for windows?. And can I write C:/ndk/... instead of $NDK/... ? Ty for this answer.
-
Alex Cohn almost 10 years@VladimirKulyik:
C:/ndk
is fine. Regarding.sh
file, it won't be today, unfortunately. -
Hansjörg Hofer almost 10 yearsHi i made all like you did and i get ./build_android.sh d:/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-gcc is unable to create an executable file. C compiler test failed. Makefile:2: config.mak: No such file or directory Makefile:58: /common.mak: No such file or directory Makefile:98: /libavutil/Makefile: No such file or directory Makefile:98: /library.mak: No such file or directory Makefile:100: /doc/Makefile: No such file or directory make: *** No rule to make target `/tests/Makefile'. Stop.
-
Hansjörg Hofer almost 10 yearsdid try it on ubuntu and same error .. can you help me please on skype elec_29a ?
-
Volodymyr Kulyk almost 10 yearsI used roman10 tutorial On Ubuntu. Copy ffmpeg to ndk/sources. You should create .sh file on Linux , do not copy this file created on Windows. If you are using Ubuntux32: for TOOLCHAIN set linux-x86, else keep linux-x86_64. And before using .sh you should run: ./configure .And do not forget to give root accses for configure and .sh: sudo chmod 777 build_android.sh
-
Volodymyr Kulyk almost 10 yearsAlex Cohn can you help me to solve this problem: stackoverflow.com/questions/24330365/…
-
Alex Cohn almost 10 yearsAfter the
./configure
failed (unable to create an executable file), the make files are not prepared, that's why you see all these errors withMakefile
. -
Volodymyr Kulyk almost 10 years'Alex Cohn' one more question. I have RunTimeError: could not load needed library 'libswresample.so' for 'libavcodec-55.so'. But I have loaded libswresample-0.so. So what is the problem?
-
Alex Cohn almost 10 years@VladimirKulyik: did you use
--target-os=android
? Or you manually edited./configure
? Or both? -
Hansjörg Hofer almost 10 yearsI did finally install Ubuntu and MacOsx in Vmware and is compiling fine there... cygwin is a pain :(
-
Sohail Zahid over 8 yearsc:/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/windows/bin/arm-linux-androideabi-gcc is unable to create an executable file. C compiler test failed.@AlexCohn
-
Alex Cohn over 8 years@SohailZahid most likely,
--enable-cross-compile
did not have effect -
Vijay almost 8 yearsCan you share your steps for compile and add it to android studio?
-
Petr M almost 8 yearsRegarding library.mak patch... There is missing ) at the end of the line $(Q)echo >>$(SUBDIR)lib$(NAME).list $(wordlist 401,999,$(filter %.o,$$<)
-
ACAkgul about 7 yearsdos2unix and chmod exes are in C:\Program Files\Git\usr\bin directory, how to use them inside ffmpeg folder ? I hate these cmd things...