最近突发奇想编译一下ffmpeg最新版本,使用以前的脚本竟然失败了,想在网上找个现成的用用,居然也没有,折腾半天所以写个文章记录一下。
环境 :ubuntu 21.10,ndk r24,ffmpeg 5.0
1.下载解压配置ndk r24,过程就不说了比较简单,检测方法 ndk-build -v,值得注意的是需要给ndk目录权限。chmod 777 -r 目录名称。
2.下载解压ffmpeg5.0,直接官网下载就可以了,一样需要给ffmpeg目录权限。
3.在ffmpeg下打 ./configure --随便一条指令测试,比如 ./configure --enable-shared,看看是否报错,我这里全新的ubuntu系统没安装gcc会报错,没安装yasm也会报错,安装相应的包即可。sudo apt-get update// 先更新 sudo apt-get install yasm sudo apt-get install build-essential //安装gcc工具包。确认可以执行./configure --enable-shared脚本命令。
4.编写bash脚本,配置参数。这一步其实就是配置,如果上一步能配置,这一步基本不会出错。下面给出的我bash即注释,出问题的点请注意看注释。具体参数说明我随便找了一个 传送门,每个版本应该大同小异。
#!/bin/bash
#配置ndk的路径,我这里用的r24
NDK_ROOT=/home/superlee/ndk/android-ndk-r24
#r24这样配置,如果不是r24路径肯定不一样。较低版本的toolchains中会有arm字样的文件夹,请选择相关的文件夹。比如r21d$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64在这个路径下。
TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
#下边几个路径也是一样的道理,每个版本都不太一样,这里我写的都是r24的其他的版本可以自己去ndk路径里找找名字差不多的应该就是
PLATFORM=arm-linux-androideabi
#这里是输出路径 ,改成自己的就可以,相对路径也可以,`pwd`/这种应该也行,我没试
PREFIX=/home/superlee/ffmpeg/out/
SYSROOT=$TOOLCHAIN/sysroot
ASM=$SYSROOT/usr/include/$PLATFORM
CROSS_PREFIX=$TOOLCHAIN/bin/$PLATFORM-
ANDROID_CROSS_PREFIX=$TOOLCHAIN/bin/armv7a-linux-androideabi28-
#这下边就是一些配置,可以根据自己的选择去挑选一下,我只是为了编译,并没有刻意去配置 值得注意的就是上边几个路径的问题。
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--cpu=armv7-a \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--cc=${ANDROID_CROSS_PREFIX}clang \
--target-os=android \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$ASM -isysroot $SYSROOT -Os -fpic"
注意上边的脚本虽然可以拿来用,但是运行之前一定要删除注释,否则可能出问题。
5.将写好的脚本拷贝到ffmpeg路径并赋予读写权限。执行sh build.sh,到这里如果第三部没报错,出错的话应该就是几个路径问题,请检查是否配置了ndk的全局路径,ndk-build -v是否能正确执行。
屏幕截图 2022-03-31 033708.png
我这里报了一行警告,但是查了一下似乎没什么影响,可以正常编译,并且可以运行。需要注意看看下边是否有你配置的选项中有Not found,比如--enable-shared command not found之类的,可能是脚本中间有空格或者特殊字符之类的或者ndk、yasm或者gcc没装好配好。
6.执行编译 make clean , make -j8 , make install。不出意外的话,可以开始编译,但是编译到libavfilter时会报错,strip找不到,需要修改ffmpeg中的脚本。路径为/ffmpeg/ffbuild/config.mak,直接vim编辑就行,每次sh build.sh这里都会变。
屏幕截图 2022-03-31 034421.png
大概是44行这么个玩意报错。把最后的arm-linux-androideabi-strip修改成llvm-strip就行了,去这个路径下找了一下就这一个strip。这个路径应该也是可以在bash脚本里配置的,但是我也没找到方法,每次sh build.sh他都会变。这个玩意坑了我好久。
7.最后编译成功
屏幕截图 2022-03-31 034753.png
最后最后总结一下遇到的问题
1.没有配置ndk全局变量,第三步执行不会成功,遇到错误不要怕,主要看最上边报错的地方,一般会有提示。
2.执行步骤3时command not found,这时候翻到最上边的日志,一般会报缺少yasm或者gcc之类的字样,安装即可。
3.is unable to create an executable file 一般就是bash里的那些路径配置错误,看看自己ndk版本,找找自己配置的路径有没有相关的文件.
4.stirp配置,这个上边详细说了,直接改脚本就行了。
这个脚本可以理解一下就是配置configure ,生成makefile,新手编译主要是路径问题。
祝大家编译顺利
网友评论