我一直在尝试将ffmpeg编译成静态库,以便在我的Android应用程序中使用它,但我无法让它工作。
我正在使用FFmpeg 3.2.4和ndk r13b,在Windows 10(Ubuntu 14.04)上使用bash。
这就是我所做的:
我使用以下方法为x86_64和api 21制作了一个独立的工具链:
python make_standalone_toolchain.py --api 21 --arch x86_64 --install-dir {}
制作配置脚本:
./configure \
--target-os=android \
--arch=x86_64 \
--prefix=/home/david/ffmpeg_x86_64_build \
--cross-prefix=/home/david/x86_64_toolchain/bin/x86_64-linux-android-\
--sysroot=/home/david/x86_64_toolchain/sysroot \
--enable-cross-compile \
--pkg-config-flags="--static" \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-htmlpages \
--disable-manpages \
--disable-podpages \
--disable-txtpages \
--extra-cflags="-fPIC" \
--extra-cxxflags="-fPIC"
--disable-shared --enable-static \
--enable-yasm
make
make install
它产生了一个FFmpeg可执行文件,但是当我在我的API 23模拟器上运行它时,我收到一条错误消息:error: only position independent executables (PIE) are supported.
即使我使用-fPic
我该如何解决?另外我不确定我的配置,关于如何为我的应用程序所需的每个ABI(arm,arm64,x86,x86_64,mips,mips64)正确编译它没有最新的来源。 我见过很多脚本,我对编译本机代码不太熟悉,所以我不确定我需要什么设置,例如像C标志等。
准确地说我是如何尝试配置FFmpeg的:
我非常感谢有关如何正确配置和编译的一些帮助。
感谢@Alex Cohn,我已经能够编译ffmpeg,但是我无法使用--enable-ssl进行编译,但是我遇到了一个问题。
由于我们提供的是系统根目录,编译器不会在我的主机上查找文件,因此我们需要从源代码编译ssl for android。 我使用了这个库OpenSSL-For-Android,并使用了预编译库。
我在配置文件中添加了这些行:
--extra-cflags='-m32 -fPIE -I./OpenSSL-For-Android/openssl-1.0.2j/include' \
--extra-ldflags='-m32 -Wl,-eh-frame-hdr -Wl,-m,elf_i386 -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -fPIE -pie -L./OpenSSL-For-Android/openssl-1.0.2j/lib/x86'
我试过告诉配置,它应该在这里搜索openssl的头文件,并且它应该链接到这个库。
但它在config.log上声明的测试失败了:
BEGIN /tmp/ffconf.JVeoLDmr.c
1 extern int SSL_library_init();
2 int main(void){ SSL_library_init(); }
END /tmp/ffconf.JVeoLDmr.c
/home/david/ndk/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc --sysroot=/home/david/ndk/platforms/android-9/arch-x86/ -isysroot /home/david/ndk/platforms/android-9/arch-x86/ -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Dstrtod=avpriv_strtod -DPIC -m32 -fPIE -I./OpenSSL-For-Android/openssl-1.0.2j/include -std=c99 -fomit-frame-pointer -fPIC -pthread -c -o /tmp/ffconf.x5yr8e11.o /tmp/ffconf.JVeoLDmr.c
/home/david/ndk/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc -m32 -Wl,-eh-frame-hdr -Wl,-m,elf_i386 -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -fPIE -pie -L./OpenSSL-For-Android/openssl-1.0.2j/lib/x86 --sysroot=/home/david/ndk/platforms/android-9/arch-x86/ -isysroot /home/david/ndk/platforms/android-9/arch-x86/ -Wl,--as-needed -Wl,-z,noexecstack -o /tmp/ffconf.mxzx6kFL /tmp/ffconf.x5yr8e11.o -lssl -lcrypto -lws2_32 -lgdi32 -lm -pthread
/home/david/ndk/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld: error: cannot find -lssl
/home/david/ndk/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld: error: cannot find -lws2_32
/home/david/ndk/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld: error: cannot find -lgdi32
/tmp/ffconf.x5yr8e11.o:ffconf.JVeoLDmr.c:function main: error: undefined reference to 'SSL_library_init'
似乎它没有使用我传递它的预编译共享库(因为它是为Android编译的)并且没有找到另一个openssl实例,因为sysroot是Android AOSP(这就是我的意思)想,如果我错了,请纠正我 - 我在这个领域没有足够的经验)。 怎么解决这个问题?我已经看到了PKG-Config的一些设置,但我不知道如何正确配置它。
答案 0 :(得分:3)
尝试使用armeabi-v7a的命令行:
../../ffmpeg/configure --target-os=linux --enable-cross-compile \
--enable-pthreads --enable-small \
--arch=arm --enable-armv6 --enable-armv6t2 --enable-vfp \
--enable-armv5te --enable-inline-asm \
--enable-neon --enable-thumb --enable-fast-unaligned --enable-runtime-cpudetect \
--cross-prefix=%NDK_ROOT%/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi- \
--sysroot=%NDK_ROOT%/platforms/android-9/arch-arm/ \
--disable-everything --disable-doc --disable-shared --disable-avdevice \
--disable-postproc --disable-network --disable-iconv --disable-zlib --disable-ffplay --disable-ffprobe --disable-ffserver --disable-swscale-alpha \
--enable-demuxer='h264,matroska,mpegts,rawvideo,mpegps,yuv4mpegpipe,flv,mov,mpegvideo,nut,avi' \
--enable-filter='scale,fps,framestep,pad,crop' --enable-protocol='file,pipe' \
--enable-muxer='h264,rawvideo,yuv4mpegpipe,matroska,mpegts,mp4,mov,nut,avi' \
--enable-bsf=h264_mp4toannexb --enable-parser=mpeg4video \
--enable-encoder=rawvideo --enable-decoder=rawvideo \
--extra-cflags='-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -fPIE' \
--extra-ldflags='-fPIE -pie'
这适用于x86:
../../ffmpeg/configure --target-os=linux --enable-cross-compile \
--enable-pthreads --enable-small \
--arch=x86 --enable-runtime-cpudetect --enable-yasm \
--cross-prefix=%NDK_ROOT%/toolchains/x86-4.9/prebuilt/windows-x86_64/bin/i686-linux-android- \
--sysroot=%NDK_ROOT%/platforms/android-9/arch-x86/ \
--disable-everything --disable-doc --disable-shared --disable-avdevice \
--disable-postproc --disable-network --disable-iconv --disable-zlib --disable-ffplay --disable-ffprobe --disable-ffserver --disable-swscale-alpha \
--enable-demuxer='h264,matroska,mpegts,rawvideo,mpegps,yuv4mpegpipe,flv,mov,mpegvideo,nut,avi' \
--enable-filter='scale,fps,framestep,pad,crop' --enable-protocol='file,pipe' \
--enable-muxer='h264,rawvideo,yuv4mpegpipe,matroska,mpegts,mp4,mov,nut,avi' \
--enable-bsf=h264_mp4toannexb --enable-parser=mpeg4video \
--enable-encoder=rawvideo --enable-decoder=rawvideo \
--extra-cflags='-m32 -fPIE' \
--extra-ldflags='-m32 -Wl,-eh-frame-hdr -Wl,-m,elf_i386 -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -fPIE -pie'
我更喜欢从 ffmpeg 目录运行 configure ,而不是从obj/local/armeabi-v7a
和obj/local/x86
运行 - 这样我就可以保留对象文件位于不同的目录中,并且可以制作用于不同的ABI,而无需再次运行 ./configure 。我这里不需要NDK独立工具链。
您需要yasm来编译x86。 - enable - 标志符合我当前的需求,不一定是您的需求。