首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用openssl静态编译FFmpeg

用openssl静态编译FFmpeg
EN

Stack Overflow用户
提问于 2017-02-26 20:29:52
回答 1查看 1.6K关注 0票数 2

我一直试图将ffmpeg编译成一个静态库,以便在我的android应用程序中使用它,但我无法让它工作。

我使用FFmpeg 3.2.4和ndk r13b,在windows 10上使用bash (Ubuntu14.04)。

以下是我所做的:

  • 我为x86_64和api 21创建了一个独立的工具链,使用: python make_standalone_toolchain.py --api 21 --arch x86_64 --install-dir {}
  • 制作了一个配置脚本: ./配置\-目标-os=android\-arch=x86_64\-前缀=/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 \-启用-交叉编译\-pkg-config-旗标=“-静态”-启用-ffmpeg\-禁用-ffplay-ffplay禁用-ff探头\-禁用-ffserver\-禁用-doc\-禁用-htmlpage\禁用-命令页\-禁用-podpage\-禁用-txtpage\-额外-c标志=“-fPIC”\-额外-cxxflags标志=“-fPIC”-禁用-共享--启用-静态\-启用-使使安装

它产生了一个FFmpeg可执行文件,但是当我在API 23模拟器上运行它时,我收到了一条错误消息:error: only position independent executables (PIE) are supported.,甚至我使用了-fPic。

我怎么才能修好它?此外,我也不确定我的配置,没有最新的源代码,如何正确编译它的每一个ABI (arm,arm64,x86,x86_64,mips,mips64),我的应用程序。我见过很多脚本,我不太熟悉编译本机代码,所以我不确定我需要什么设置,例如C标志等等。

准确地说,我是如何配置FFmpeg的:

  • 我需要一个静态库
  • 我只需要ffmpeg命令行实用程序。
  • 我想为每个ABI列出的above.This配置编译库,尝试为x86_64编译。
  • 当然是在android上运行

对于如何正确配置和编译这一点,我将非常感激。

编辑

感谢@Alex,我已经能够编译ffmpeg,但是我无法使用启用ssl编译它,但是我遇到了一个问题。

因为我们提供了一个系统根目录,所以编译器不会在我的主机上查找文件,所以我们需要从源代码中编译用于android的ssl。我使用了这个库OpenSSL-For-Android,并使用了预编译的库。

我在配置文件中添加了以下行:

代码语言:javascript
复制
--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上所说的:

代码语言:javascript
复制
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(这就是我所想的,如果我错了,请纠正我--我在这个领域还不够经验)。怎么解决这个问题呢?我看过一些PKG的设置,但我不知道如何正确配置它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-27 13:30:47

为armeabi-v7a尝试以下命令行:

代码语言:javascript
复制
../../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来说:

代码语言:javascript
复制
../../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目录运行,而是从obj/local/armeabi-v7aobj/local/x86运行--这样我就可以将对象文件保存在不同的目录中,并且可以为不同的ABI创建,而不必再次运行./configureE 211。我不需要NDK独立的工具链。

您需要雅玛斯来为x86编译。一组--启用--标志适合我当前的需求,而不一定是您的需求。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42473862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档