FFmpeg交叉编译
16lz
2021-01-23
1、android 官网下载 android ndk 选择 Linux 版本
wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip
2、下载完成后使用 unzip 解压
unzip android-ndk-r16b-linux-x86_64.zip
3、配置环境变量
export NDK_ROOT=/root/android-ndk-r16bexport PATH=$NDK_ROOT:$PATH
4、从官网下载FFmpeg的源码:
wget https://ffmpeg.org/releases/ffmpeg-4.0.2.tar.bz2
下载完成后使用tar
工具解压:
tar xvf ffmpeg-4.0.2.tar.bz2
解压出来后进入ffmpeg解压目录,可以看到里面有各种文件、文档。需要关注的是configure
文件。这个文件本身就是一个shell脚本,作用为生成makfile
文件,然后使用make
执行。 下面是交叉编译shell脚本内容:
#!/bin/bash#这里定义变量,后续会使用#TOOLCHAIN 变量指向ndk中的交叉编译gcc所在的目录TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64#FLAGS与INCLUDES变量 可以从AS ndk工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷贝,需要注意的是**地址**FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -O0 -fPIC"INCLUDES="-isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++/include -isystem $NDK_ROOT/sources/android/support/include -isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include"#此变量用于编译完成之后的库与头文件存放在哪个目录PREFIX=./android/armeabi-v7a2#执行configure脚本,用于生成makefile#--prefix : 安装目录#--enable-small : 优化大小#--disable-programs : 不编译ffmpeg程序(命令行工具),我们是需要获得静态(动态)库。#--disable-avdevice : 关闭avdevice模块,此模块在android中无用#--disable-encoders : 关闭所有编码器 (播放不需要编码)#--disable-muxers : 关闭所有复用器(封装器),不需要生成mp4这样的文件,所以关闭#--disable-filters :关闭视频滤镜#--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 )#--cross-prefix: 看右边的值应该就知道是干嘛的,gcc的前缀 xxx/xxx/xxx-gcc 则给xxx/xxx/xxx-#disable-shared enable-static 不写也可以,默认就是这样的。#--sysroot: #--extra-cflags: 会传给gcc的参数#--arch --target-os : 不给不行,为什么给这些值,见视频./configure \--prefix=$PREFIX \--enable-small \--disable-programs \--disable-avdevice \--disable-encoders \--disable-muxers \--disable-filters \--enable-cross-compile \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--disable-shared \--enable-static \--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \--extra-cflags="$FLAGS $INCLUDES" \--extra-cflags="-isysroot $NDK_ROOT/sysroot" \--arch=arm \--target-os=android #上面运行脚本生成makefile之后,使用make执行脚本make cleanmake install
注:如果出现以下错误
/root/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc is unable to create an executable file.C compiler test failed.
目录ffmpeg-4.0.2/ffbuild/config.log 下查看 config.log 报错信息
END /tmp/ffconf.iXGWyKi9/test.c/root/ndk/android-ndk-r10b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/root/ndk/android-ndk-r10b/platforms/android-21/arch-arm -isystem /root/ndk/android-ndk-r10b/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -O0 -fPIC -isystem /root/ndk/android-ndk-r10b/sources/cxx-stl/llvm-libc++/include -isystem /root/ndk/android-ndk-r10b/sources/android/support/include -isystem /root/ndk/android-ndk-r10b/sources/cxx-stl/llvm-libc++abi/include -isysroot /root/ndk/android-ndk-r10b/sysroot -E -o /tmp/ffconf.iXGWyKi9/test.o /tmp/ffconf.iXGWyKi9/test.ccc1: warning: command line option '-std=c++11' is valid for C++/ObjC++ but not for Ctest_ld cctest_ccBEGIN /tmp/ffconf.iXGWyKi9/test.c 1int main(void){ return 0; }END /tmp/ffconf.iXGWyKi9/test.c/root/ndk/android-ndk-r10b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/root/ndk/android-ndk-r10b/platforms/android-21/arch-arm -isystem /root/ndk/android-ndk-r10b/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -O0 -fPIC -isystem /root/ndk/android-ndk-r10b/sources/cxx-stl/llvm-libc++/include -isystem /root/ndk/android-ndk-r10b/sources/android/support/include -isystem /root/ndk/android-ndk-r10b/sources/cxx-stl/llvm-libc++abi/include -isysroot /root/ndk/android-ndk-r10b/sysroot -march=armv7-a -c -o /tmp/ffconf.iXGWyKi9/test.o /tmp/ffconf.iXGWyKi9/test.ccc1: warning: command line option '-std=c++11' is valid for C++/ObjC++ but not for C/root/ndk/android-ndk-r10b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/root/ndk/android-ndk-r10b/platforms/android-21/arch-arm -march=armv7-a -o /tmp/ffconf.iXGWyKi9/test /tmp/ffconf.iXGWyKi9/test.o/root/ndk/android-ndk-r10b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory/root/ndk/android-ndk-r10b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtend_android.o: No such file or directory/root/ndk/android-ndk-r10b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lc/root/ndk/android-ndk-r10b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-androideabi/bin/ld: error: cannot find -ldl/s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc:289: error: undefined reference to 'abort'/s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc:346: error: undefined reference to 'memcpy'/s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc:376: error: undefined reference to 'memcpy'/s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc:505: error: undefined reference to 'abort'/s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/config/arm/pr-support.c:378: error: undefined reference to 'abort'/s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/config/arm/pr-support.c:384: error: undefined reference to 'abort'collect2: error: ld returned 1 exit statusC compiler test failed.
编译成功后压缩编译文件,并拷贝到window
tar cvf ffmpeg.tar * cd 到安装目录sz ffmpeg.tar 拷贝到window下
更多相关文章
- Android Framework中添加AIDL文件编译
- Android布局文件layout.xml的一些属性值
- Android的xml文件中@、@android:type、@*、?、@+的含义和区别
- Android布局文件中常用的属性
- Android工具箱之文件目录
- Android环境变量配置
- android布局文件中各属性所代表的意义