最新ndk交叉编译ffmpeg生成lib

新建cross-compile文件夹

sudo mkdir /home/pc/cross-compile
sudo chmod -R 777 /home/pc/cross-compile
cd /home/pc/cross-compile

安装编译需要用到的常用工具

sudo apt-get update && apt-get install -y make pkg-config wget

下载ndk并配置环境变量

sudo wget -O android-ndk-r26b-linux.zip --no-check-certificate https://dl.google.com/android/repository/android-ndk-r26b-linux.zip?hl=zh-cn

# 解压
unzip android-ndk-r26b-linux.zip
sudo rm -rf android-ndk-r26b-linux.zip

# 配置ndk环境变量
export ANDROID_NDK=/home/pc/cross-compile/android-ndk-r26b
export NDK_PATH=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64
export PATH=$PATH:$NDK_PATH
source ~/.bashrc


# 删除环境变量
#unset NDK_PATH
#source ~/.bashrc

查看ndk

ls /home/pc/cross-compile/android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64/bin

# 结果:
aarch64-linux-android21-clang       i686-linux-android29-clang++
aarch64-linux-android21-clang++     i686-linux-android30-clang
aarch64-linux-android22-clang       i686-linux-android30-clang++
aarch64-linux-android22-clang++     i686-linux-android31-clang
aarch64-linux-android23-clang       i686-linux-android31-clang++
aarch64-linux-android23-clang++     i686-linux-android32-clang
aarch64-linux-android24-clang       i686-linux-android32-clang++
aarch64-linux-android24-clang++     i686-linux-android33-clang
aarch64-linux-android25-clang       i686-linux-android33-clang++
aarch64-linux-android25-clang++     i686-linux-android34-clang
aarch64-linux-android26-clang       i686-linux-android34-clang++
aarch64-linux-android26-clang++     ld
aarch64-linux-android27-clang       ld64.lld
aarch64-linux-android27-clang++     ld.lld
aarch64-linux-android28-clang       lld
aarch64-linux-android28-clang++     lldb
aarch64-linux-android29-clang       lldb-argdumper
aarch64-linux-android29-clang++     lldb.sh
aarch64-linux-android30-clang       lld-link
aarch64-linux-android30-clang++     llvm-addr2line
aarch64-linux-android31-clang       llvm-ar
aarch64-linux-android31-clang++     llvm-as
aarch64-linux-android32-clang       llvm-bolt
aarch64-linux-android32-clang++     llvm-cfi-verify
aarch64-linux-android33-clang       llvm-config
aarch64-linux-android33-clang++     llvm-cov
aarch64-linux-android34-clang       llvm-cxxfilt
aarch64-linux-android34-clang++     llvm-dis
armv7a-linux-androideabi21-clang    llvm-dwarfdump
armv7a-linux-androideabi21-clang++  llvm-dwp
armv7a-linux-androideabi22-clang    llvm-ifs
armv7a-linux-androideabi22-clang++  llvm-lib
armv7a-linux-androideabi23-clang    llvm-link
armv7a-linux-androideabi23-clang++  llvm-lipo
armv7a-linux-androideabi24-clang    llvm-ml
armv7a-linux-androideabi24-clang++  llvm-modextract
armv7a-linux-androideabi25-clang    llvm-nm
armv7a-linux-androideabi25-clang++  llvm-objcopy
armv7a-linux-androideabi26-clang    llvm-objdump
armv7a-linux-androideabi26-clang++  llvm-profdata
armv7a-linux-androideabi27-clang    llvm-ranlib
armv7a-linux-androideabi27-clang++  llvm-rc
armv7a-linux-androideabi28-clang    llvm-readelf
armv7a-linux-androideabi28-clang++  llvm-readobj
armv7a-linux-androideabi29-clang    llvm-size
armv7a-linux-androideabi29-clang++  llvm-strings
armv7a-linux-androideabi30-clang    llvm-strip
armv7a-linux-androideabi30-clang++  llvm-symbolizer
armv7a-linux-androideabi31-clang    llvm-windres
armv7a-linux-androideabi31-clang++  merge-fdata
armv7a-linux-androideabi32-clang    remote_toolchain_inputs
armv7a-linux-androideabi32-clang++  sancov
armv7a-linux-androideabi33-clang    sanstats
armv7a-linux-androideabi33-clang++  scan-build
armv7a-linux-androideabi34-clang    scan-view
armv7a-linux-androideabi34-clang++  x86_64-linux-android21-clang
bisect_driver.py                    x86_64-linux-android21-clang++
clang                               x86_64-linux-android22-clang
clang++                             x86_64-linux-android22-clang++
clang-17                            x86_64-linux-android23-clang
clang-check                         x86_64-linux-android23-clang++
clangd                              x86_64-linux-android24-clang
clang-format                        x86_64-linux-android24-clang++
clang-tidy                          x86_64-linux-android25-clang
clang-tidy.sh                       x86_64-linux-android25-clang++
dsymutil                            x86_64-linux-android26-clang
git-clang-format                    x86_64-linux-android26-clang++
i686-linux-android21-clang          x86_64-linux-android27-clang
i686-linux-android21-clang++        x86_64-linux-android27-clang++
i686-linux-android22-clang          x86_64-linux-android28-clang
i686-linux-android22-clang++        x86_64-linux-android28-clang++
i686-linux-android23-clang          x86_64-linux-android29-clang
i686-linux-android23-clang++        x86_64-linux-android29-clang++
i686-linux-android24-clang          x86_64-linux-android30-clang
i686-linux-android24-clang++        x86_64-linux-android30-clang++
i686-linux-android25-clang          x86_64-linux-android31-clang
i686-linux-android25-clang++        x86_64-linux-android31-clang++
i686-linux-android26-clang          x86_64-linux-android32-clang
i686-linux-android26-clang++        x86_64-linux-android32-clang++
i686-linux-android27-clang          x86_64-linux-android33-clang
i686-linux-android27-clang++        x86_64-linux-android33-clang++
i686-linux-android28-clang          x86_64-linux-android34-clang
i686-linux-android28-clang++        x86_64-linux-android34-clang++
i686-linux-android29-clang          yasm

下载ffmpeg并解压

sudo wget --no-check-certificate http://ffmpeg.org/releases/ffmpeg-6.1.tar.gz
tar -zxvf ffmpeg-6.1.tar.gz
sudo rm -rf ffmpeg-6.1.tar.gz

编译ffmpeg

cd ffmpeg-6.1

./configure \
--prefix=/home/pc/cross-compile/output/ffmpeg/armv7a-linux-androideabi21 \
--enable-neon  \
--enable-hwaccels  \
--enable-gpl   \
--disable-postproc \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-static \
--enable-shared \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$NDK_PATH/bin/arm-linux-androideabi- \
--target-os=android \
--arch=arm \
--cpu=armv7-a \
--cc=$NDK_PATH/bin/armv7a-linux-androideabi21-clang \
--cxx=$NDK_PATH/bin/armv7a-linux-androideabi21-clang++ \
--nm=$NDK_PATH/bin/llvm-nm \
--ar=$NDK_PATH/bin/llvm-ar \
--ranlib=$NDK_PATH/bin/llvm-ranlib    \
--strip=$NDK_PATH/bin/llvm-strip  \
--pkg-config=/usr/bin/pkg-config  \
--enable-cross-compile \
--sysroot=$NDK_PATH/sysroot \
--extra-cflags="-Os -fpic -mfloat-abi=softfp -mfpu=vfp -marm -march=armv7-a " \
--extra-ldflags="$ADDI_LDFLAGS"

生成lib库

make clean
make -j16
make install

image.png

编译生成arm64-v8a库

# 我们上面的步骤已经编译生成了armv7-a库,生成arm64-v8a库的步骤类似,只需改几个地方就行了,下面是完整内容:

./configure \
--prefix=/home/pc/cross-compile/output/ffmpeg/aarch64-linux-android21 \
--enable-neon  \
--enable-hwaccels  \
--enable-gpl   \
--disable-postproc \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-static \
--enable-shared \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$NDK_PATH/bin/aarch64-linux-android- \
--target-os=android \
--arch=arm64 \
--cpu=armv8-a \
--cc=$NDK_PATH/bin/aarch64-linux-android21-clang \
--cxx=$NDK_PATH/bin/aarch64-linux-android21-clang++ \
--nm=$NDK_PATH/bin/llvm-nm \
--ar=$NDK_PATH/bin/llvm-ar \
--ranlib=$NDK_PATH/bin/llvm-ranlib    \
--strip=$NDK_PATH/bin/llvm-strip  \
--pkg-config=/usr/bin/pkg-config  \
--enable-cross-compile \
--sysroot=$NDK_PATH/sysroot \
--extra-cflags="-march=armv8-a" \
--extra-ldflags="$ADDI_LDFLAGS"

image.png

注意事项

这里面最核心的就是编译这步,由于网上资料不全,在这里卡了好久,各种报错。
最核心的几个参数:
--cross-prefix=
--cc=
--cxx=
--nm=
--ar=
--ranlib=
--strip=
--pkg-config=
少了上面那几个参数,编译都编译不过去,
--cross-prefix用于指明交叉编译工具前缀,如v7下是:arm-linux-androideabi- ,而v8下是:aarch64-linux-android- ,这个可以通过查找ndk找到。
--cc用于配置 C 编译器,在这里我们是clang,
--cxx用于配置c++编译器,在这里我们是clang++。
--nm、--ar、--ranlib、--strip这几个选项由于ndk-r26中已经被替换成:llvm-nm、llvm-ar、llvm-ranlib、llvm-strip,所以我们编译时也要把这几个参数替换掉。
--pkg-config用于检查和获取库和头文件信息的工具,我们需要显示指明他的安装路径,不然编译或者make会报错,我们可以通过 “which pkg-config” 命令查找到路径,如果没安装的话,我们可以先通过 “apt-get update && apt-get install -y pkg-config” 安装。

然后是与我们最终生成lib库相关的几个重要参数:
--prefix= :用于指明我们最终生成文件的保存路径,注意需要提前创建目标文件夹并赋予写的权限。
--arch=   :如果我们需要生成的是32位,填arm,若是64位,则填arm64。
--cpu=    :如果我们需要生成的是32位,填armv7-a,若是64位,则填armv8-a。
--cc=     :如果我们需要生成的是32位,填armv7a-linux-androideabi21-clang,若是64位,则填aarch64-linux-android21-clang。android21代表最低支持android21版本,我们还可以根据需求用aarch64-linux-android34-clang。
--cxx=    :与--cc类似,不过他用的是clang++,比如:armv7a-linux-androideabi21-clang++
--extra-cflags=    :配置编译的架构信息,如果我们需要生成的是32位,填"-Os -fpic -mfloat-abi=softfp -mfpu=vfp -marm -march=armv7-a ",若是64位,则填"-march=armv8-a"。

然后其他参数是配置ffmpeg启用/禁用什么东西,比如:
--enable-shared  :代表生成动态库
--enable-static  :代表生成静态库

编译生成后的ffmpeg目录结构

对我们最重要的是include和lib。include用于存放头文件,lib用于存放静态库.a,或动态库.so。
FFmpeg 有六个常用的功能模块:
libavformat:多媒体文件或协议的封装和解封装库;

libavcodec:音视频编解码库;

libavfilter:音视频、字幕滤镜库;

libswscale:图像格式转换库;

libswresample:音频重采样库;

libavutil:工具库。

image.png

参考:https://mp.weixin.qq.com/s?__biz=MzIwNTIwMzAzNg==&mid=2654162543&idx=1&sn=894a6bfb0f8f652ef53860075af1754b&chksm=8cf39d5cbb84144a9d62fa80cbeed1843aadfe97bf8a30ab02474f98ec86be649d65e301674b&scene=21#wechat_redirect ,非常感谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容