14

I am trying to compile ffmpeg for android armeabi devices.
I am following tutorial by roman10.net
His given build script builds ffmpeg for armv7-a devices. I want to build it for armeabi.

My ultimate aim is to run ffmpeg commands on android armeabi and armv7-a devices.

So I change the script's CPU part from

#arm v7vfpv3
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one 

to

#arm v6
CPU=armv6
OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=./android/$CPU 
ADDITIONAL_CONFIGURE_FLAG=
build_one

(I thought changing it to armv6 would build ffmpeg compatible with armeabi devices. m I wrong?)

Doubt 1:
Do I also have to change toolchain?
i.e from arm-linux-androideabi-4.4.3 to arm-eabi-4.4.0 ?????

Doubt 2:

When I try running ./build.sh (without changing toolchain) it gives me following error:

/home/chaitanya/android/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc is unable to create an executable file.
C compiler test failed.

If you think configure made a mistake,.. blaah blahh blaah

after that I got lot of warnings saying:
‘sub_id’ is deprecated and many other function deprecated warnings.

platform: ubuntu 11.10
ffmpeg version: 0.11.2
NDK : android-ndk-r5b

Here is my build script:

#!/bin/bash
######################################################
# Usage:
# put this script in top of FFmpeg source tree
# ./build_android
# It generates binary for following architectures:
# ARMv6 
# ARMv6+VFP 
# ARMv7+VFPv3-d16 (Tegra2) 
# ARMv7+Neon (Cortex-A8)
# Customizing:
# 1. Feel free to change ./configure parameters for more features
# 2. To adapt other ARM variants
# set $CPU and $OPTIMIZE_CFLAGS 
# call build_one
######################################################
NDK=~/android/android-ndk-r5b
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
function build_one
{
./configure --target-os=linux \
    --prefix=$PREFIX \
    --enable-cross-compile \
    --extra-libs="-lgcc" \
    --arch=arm \
    #--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
    #--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
    --sysroot=$PLATFORM \
    --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS " \
    --disable-shared \
    --enable-static \
    --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \
    --disable-everything \
    --enable-demuxer=mov \
    --enable-demuxer=h264 \
    --disable-ffplay \
    --enable-protocol=file \
    --enable-avformat \
    --enable-avcodec \
    --enable-decoder=rawvideo \
    --enable-decoder=mjpeg \
    --enable-decoder=h263 \
    --enable-decoder=mpeg4 \
    --enable-decoder=h264 \
    --enable-parser=h264 \
    --disable-network \
    --enable-zlib \
    --disable-avfilter \
    --disable-avdevice \
    $ADDITIONAL_CONFIGURE_FLAG

make clean
make  -j4 install
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog  --warn-once  --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
}

#arm v6
CPU=armv6
OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=./android/$CPU 
ADDITIONAL_CONFIGURE_FLAG=
build_one

#arm v7vfpv3
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7vfp
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
#PREFIX=./android/$CPU-vfp
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one

#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

How do I tackle this problem? what is going wrong?

Lain
  • 2,166
  • 4
  • 23
  • 47
Chaitanya Chandurkar
  • 2,142
  • 3
  • 24
  • 43

4 Answers4

20

I finally found the problem with my setup when facing this same issue... Looking at the arm-build.sh script, I started following the script. Notice the "TOOLCHAIN=..." path.

Originally the path was: TOOLCHAIN=echo $NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/*-x86

When I went to verify this path exists, I noticed that it did not. I think the reason is that I have a 64-bit build.

My path is actually: .../toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64

What I ended up doing was copying the folder, and renaming it to "linux-x86" and now all is compiling.

Hope this helps someone!

Monty
  • 461
  • 5
  • 9
11

I'm not sure if this is what you are looking but I created a script in order to build FFmpeg 0.11.1 for Android. I modified the scripts provided with older Bambuser FFmpeg builds in order to get them working with 0.11.1. I'm currently using this script to build FFmpeg in my own application so I know the build works. The script located at http://servestream.sourceforge.net/build-ffmpeg.sh. I'm using android-ndk-r8b and Ubuntu 12.04 (x64) to do the building. In order to use the script do the following:

1.) Download the script
2.) Open the script and modify the PACKAGE variable to match application's package
3.) Make it executable: chmod +x build-ffmpeg.sh
4.) Set the NDK variable used by the script, for example: export NDK=/home/user/android-ndk-r8b
5.) Run the script: ./build-ffmpeg.sh

The compiled binaries will be located in the newly created "final-builds" folder in the current working directory. (Note: the script builds binaries for armeabi, armeabi-v7a and x86 architectures)

I hope this answers your question.

UPDATE:

If script isn't found, http://sourceforge.net/p/servestream/code/HEAD/tree/ffmpeg/scripts/arm-build.sh

Dr.jacky
  • 3,341
  • 6
  • 53
  • 91
William Seemann
  • 3,440
  • 10
  • 44
  • 78
  • I tried this and still get "arm-linux-androideabi-gcc unable to create an executable file" I am running Ubuntu 12.10 64 bit, ffmpeg-1.0 and using your script above. Please help – JeffG Nov 15 '12 at 11:25
  • I'm using 12.04 (64 bit) and NDK version r8b. That error usually occurs when you are using a different NDK version. If that's not the case please respond and I will try to help you sort out the issue. – William Seemann Nov 15 '12 at 17:08
  • Sorry Vikas, these scripts will only work with Linux. Compiling under Windows is a whole other battle that I probably won't pursue. – William Seemann Mar 19 '13 at 14:52
  • I managed to get "final-builds" folder and inside that there are three folders called , armeabi,armeabi-v7a and x86 . inside armeabi-v7a & armeabi folder there are another folders available. but inside x86 only the configuration.txt and info.txt files avaiable , i have a bad feeling i have done something wrong. – Mr.G Nov 27 '13 at 06:28
  • ok i managed to build it. needed to install yasm . if any one need follow this to intall yasm https://trac.ffmpeg.org/wiki/MacOSXCompilationGuide – Mr.G Nov 27 '13 at 07:09
  • @WilliamSeemann are u sure http://servestream.sourceforge.net/build-ffmpeg.sh script compatitable with mac os ?? 10.8.5 – Mr.G Nov 28 '13 at 11:07
  • The script is only compatible with Linux. – William Seemann Nov 28 '13 at 22:59
  • @WilliamSeemann thanks. i think that will be the issue. du u know any script which runs in mac – Mr.G Nov 29 '13 at 04:38
  • @WilliamSeemann Does script work for latest ffmpeg version? (2.8.3 till now) – Dr.jacky Dec 06 '15 at 08:25
  • 1
    for arm v7 it's not a problem, what about arm v8 and x84_64? – user924 Sep 08 '17 at 10:46
1

In my case, I was trying to build exoplayer's ffmpeg extension. It's not able to build with current versions of the NDK (gcc was removed in NDK 18b), so you have to revert to NDK 15c.

See here: https://github.com/google/ExoPlayer/issues/4940

Andrew Orobator
  • 7,978
  • 3
  • 36
  • 36
0

I got a similar error (C compiler test failed) while trying to build ffmpeg using r8d ndk version and also r8b.

The problem I later found out was that "Extract here" option on latest ubuntu seems to have some bug. It does not extract everything. So, using 'tar -jxf ' extracts properly and you will see more executables in the bin folder.

You could check this out for reference. http://code.google.com/p/android/issues/detail?id=41187

Devesh
  • 859
  • 8
  • 17