我一直在尝试将FFMPEG编译到静态库中,以便在我的Android应用程序中使用它,但我无法工作。
IM使用FFMPEG 3.2.4和NDK R13B,在Windows 10上使用Bash(Ubuntu 14.04)。
这是我所做的:
-
我为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,MIPS64),没有最新的源有关如何正确编译它。我看过很多脚本,我对编译本机代码不太熟悉,所以我不确定我需要哪些设置,例如c标志等。
。是我尝试如何配置ffmpeg的准确性:
- 我需要一个静态库
- 我只需要ffmpeg命令行实用程序
- 我想为上面列出的每个abi编译库。此配置试图编译x86_64。
- 当然可以在Android上跑步
我非常感谢如何正确配置和编译此帮助。
编辑
感谢@Alex Cohn,我已经能够编译FFMPEG,但是我无法使用-Anable-ssl来编译它,但是我遇到了问题。
由于我们提供了系统根,因此编译器不会在主机机器上寻找文件,因此我们需要从源来编译Android的SSL。我已经使用了此库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(这就是我是Android AOSP)思考,如果我错了,请纠正我 - 我在这个领域的经验不够)。如何修复?我已经看到了使用PKG-Config的一些设置,但是我没有任何线索,因为如何正确配置它。
尝试此命令行的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'
我更喜欢运行 configure 不是来自 ffmpeg 目录,而是来自obj/local/armeabi-v7a
和obj/local/x86
-这样我可以将对象文件保存在单独的目录中,并且可以 Make 对于不同的ABI而言,不运行 ./configure 。我不需要NDK独立工具链。
您需要Yasm来编译X86。的集合 - 启用 - 标志适合我当前的需求,不一定是您的需求。