ijkplayer Android 端编译完整流程(ijk0.8.8--ffmpeg4.0)
创始人
2025-06-01 04:47:39
0

一、源码库和 Tags

Ijkplayer 源码:https://github.com/bilibili/ijkplayer
Ijkplayer Tags 列表:https://github.com/bilibili/ijkplayer/tags
BiliBili OpenSSL Tags 列表:https://github.com/bilibili/openssl/tags
BiliBili FFmpeg Tags 列表:https://github.com/bilibili/FFmpeg/tags

二、编译环境

  • 系统:MacOS Monterey 12.5.1,Apple M1
  • NDK: android-ndk-r10e
    配置好环境变量,ANDROID_SDKANDROID_NDK,我用的 zsh
vim ~/.zshrc
source ~/.zshrc

三、配置和编译

1、下载 ijkplayer 源码

直接从 https://github.com/bilibili/ijkplayer/releases/tag/k0.8.8 下载最新版本 k0.8.8 代码,或用以下 git 命令拉取

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer
cd ijkplayer
git checkout -B latest k0.8.8

2、修改编译配置

1)修改需要编译的 ABI 架构

我只需编译 armv7a 和 arm64,修改以下脚本,避免拷贝和编译多份不同架构的代码。

把以下这些脚本里的 pull_fork 只保留需要的架构。
init-android-openssl.sh
init-android.sh
init-android-libsoxr.sh

pull_fork "armv5"
pull_fork "armv7a"
pull_fork "arm64"
pull_fork "x86"
pull_fork "x86_64"改成 =======>>>>pull_fork "armv7a"
pull_fork "arm64"

把以下这些脚本里的 ACT_ABI_32ACT_ABI_64 只保留需要的架构。
./android/compile-ijk.sh
./android/contrib/compile-openssl.sh
./android/contrib/compile-libsoxr.sh
./android/compile-ijk.sh

ACT_ABI_32="armv5 armv7a x86"
ACT_ABI_64="armv5 armv7a arm64 x86 x86_64"改成 =======>>>>ACT_ABI_32="armv7a"
ACT_ABI_64="armv7a arm64"

2)修改 ijkplayer 依赖的 FFmpeg 的版本(改成 4.0 版本)

ijkplayer k0.8.8 默认的 FFmpeg 的版本是 3.4,即 ff3.4–ijk0.8.7–20180103–001,现改成 FFmpeg 4.0 版本 ff4.0–ijk0.8.8–20210426–001,最新版本列表见:https://github.com/bilibili/FFmpeg/tags
在 init-android.sh 脚本中,改完后如下:

IJK_FFMPEG_UPSTREAM=https://github.com/Bilibili/FFmpeg.git
IJK_FFMPEG_FORK=https://github.com/Bilibili/FFmpeg.git
#IJK_FFMPEG_COMMIT=ff3.4--ijk0.8.7--20180103--001
IJK_FFMPEG_COMMIT=ff4.0--ijk0.8.8--20210426--001
IJK_FFMPEG_LOCAL_REPO=extra/ffmpegset -e
TOOLS=toolsgit --versionecho "== pull ffmpeg base =="
sh $TOOLS/pull-repo-base.sh $IJK_FFMPEG_UPSTREAM $IJK_FFMPEG_LOCAL_REPOfunction pull_fork()
{echo "== pull ffmpeg fork $1 =="sh $TOOLS/pull-repo-ref.sh $IJK_FFMPEG_FORK android/contrib/ffmpeg-$1 ${IJK_FFMPEG_LOCAL_REPO}cd android/contrib/ffmpeg-$1git checkout ${IJK_FFMPEG_COMMIT} -B ijkplayercd -
}#pull_fork "armv5"
pull_fork "armv7a"
pull_fork "arm64"
#pull_fork "x86"
#pull_fork "x86_64"./init-config.sh
./init-android-libyuv.sh
./init-android-soundtouch.sh

3、修改编译的版本类型(精简版/完整版)

默认是精简版,完整版支持的格式更多,但是编译出的包体积更大,可根据自己的需要进行选择,本文编译的的精简版

cd config 
rm module.sh 
ln -s module-default.sh module.sh # 完整版 
ln -s module-lite.sh module.sh # 精简版 
ln -s module-lite-hevc.sh module.sh # 包含 HEVC 的精简版

4、初始化项目(下载依赖的代码)

# 下载指定的 ffmpeg 源码 ff4.0--ijk0.8.8--20210426--001
./init-android.sh# 下载 openssl 源码,用于支持 https
./init-android-openssl.sh

5、开始编译

# 在项目根目录下
cd android/contrib # 编译 openssl
./compile-openssl.sh clean  
./compile-openssl.sh all  # 编译 FFmpeg 
./compile-ffmpeg.sh clean 
./compile-ffmpeg.sh all  # 编译 ijkplayer
cd ..  
./compile-ijk.sh all

6、编译过程遇到的错误

注意:如期间遇到弹窗提示 ndk 的一些命令行工具不安全,不用管,选择【打开】或【取消】,在 Mac 的 【系统偏好设置】–>【安全性与隐私】的提示里选择【仍然允许】

1)编译 openssl 出错,错误如下:

error: undefined reference to ‘OBJ_create’
error: ld returned 1 exit status

../libcrypto.a(ec_pmeth.o):ec_pmeth.c:function pkey_ec_ctrl_str: error: undefined reference to 'OBJ_ln2nid'
../libcrypto.a(asn_moid.o):asn_moid.c:function oid_module_init: error: undefined reference to 'OBJ_create'
../libcrypto.a(asn_moid.o):asn_moid.c:function oid_module_init: error: undefined reference to 'OBJ_create'
collect2: error: ld returned 1 exit status
make[2]: *** [link_app.] Error 1
make[1]: *** [openssl] Error 2
make: *** [build_apps] Error 1
./compile-openssl.sh all

失败原因:多线程编译导致
解决方案:改成单线程编译
,参考链接:

需要修改的脚本:./android/contrib/tools/do-detect-env.sh #91 行

# 原本下面是通过系统命令 "sysctl -n machdep.cpu.thread_count" 来获取并设置编译线程数的,比如我电脑获取的是 8
export IJK_MAKE_FLAG=-j`sysctl -n machdep.cpu.thread_count`改成 =======>>>># 强行改成单线程编译
export IJK_MAKE_FLAG=-j1

2)编译 ffmpeg 出错,错误如下:

Unknown option “–disable-ffserver”.

--------------------
[*] check ffmpeg env
--------------------
OpenSSL detected--------------------
[*] configurate ffmpeg
--------------------
/Users/wangjianjun/Alan/OpenSrcCode/ijkplayer_k0.8.25_ffmpeg4.0/ijkplayer-k0.8.8/android/contrib/build/ffmpeg-armv7a/toolchain/bin//arm-linux-androideabi-gcc
Unknown option "--disable-ffserver".
See ./configure --help for available options.

出错原因:ffmpeg 4.0 删除了 ffserver
解决方案:禁掉 ffserver,参考链接,修改 config/module.sh 文件,注释掉以下两行:

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vda"

3)编译 ffmpeg 出错,错误如下:

error: undefined reference to ‘ff_ac3_parse_header’
出错原因:ffmpeg 4.0 不再支持 eac3
解决方案:禁掉 eac3,参考链接,修改 config/module.sh 文件,增加如下一行:

# 在 export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-bsfs" 下方添加:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=eac3_core"

4)编译 ijkplayer 出错,错误如下:

Android NDK: Host ‘awk’ tool is outdated. Please define NDK_HOST_AWK to point to Gawk or Nawk !
解决方案:参考链接

1、进入到目录: android-ndk-r10e/prebuilt/darwin-x86_64/bin
2、将 awk 重命名为 awk_

7、编译结果

1)编译 openssl

在这里插入图片描述
在这里插入图片描述

2)编译 ijkffmpeg

在这里插入图片描述

3)编译 ijkplayer

armeabi-v7a:
在这里插入图片描述
arm64-v8a:
在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

周代音乐内容分为几类 周代音乐内容分为几类A.3 B.4 C.5 D.6答案错误,务信,被坑了
古代的叙事诗 古代的叙事诗那个《孔雀东南飞》可能是,还有《木兰诗》、《长恨歌》、《琵琶行》应该也是的。其实是不是叙...
最新放假通知!连休8天 今天是端午节假期的最后一天下次休假在啥时候?根据国务院办公厅关于2025年部分节假日安排的通知今年的...
白头发男主角是王爷的小说 白头发男主角是王爷的小说不嫁妖孽王爷 白发王妃(女主白了头发,男主为了女主喝了一种药也白了头发)
用物理学原理解释彩虹为什么是弯... 用物理学原理解释彩虹为什么是弯的,中午为何很难看到彩虹是空气中水蒸气浓度不同造成的色散,所以必须在比...
大幅超去年同期 2025端午档... 据网络平台数据,截至6月2日12时47分,2025年端午档电影票房破4亿,大幅超去年同期。合家欢电影...
东方海洋:全资子公司取得医疗器... 每经AI快讯,6月2日,东方海洋公告,全资子公司艾维可生物科技有限公司自主研发的铁蛋白(Fer)测定...
晶科能源:收到政府补助9800... 晶科能源(688223)公告,5月29日收到政府补助人民币9800万元,属于与收益相关的政府补助款项...
北汽蓝谷:子公司5月销量同比增... 6月2日,北汽蓝谷公告称,子公司北京新能源汽车股份有限公司5月份产量为13,433辆,同比增长216...
采访体育记者可以问什么问题 采访体育记者可以问什么问题要做一个体育记者的人物专访,请问有什么问题可以问啊?求助啊.....为什么...
高凌信息:终止发行股份及支付现... 高凌信息(688175.SH)公告称,公司决定终止发行股份及支付现金购买资产并募集配套资金事项,主要...
为了培养学生吃苦耐劳、坚强自立... 为了培养学生吃苦耐劳、坚强自立的精神,教师给学生们讲了“卧薪尝胆”的故事。这体现了哪项德育方法?()...
送你一片浪漫花海 和薰衣草一起... 位于新疆伊犁河谷中部的伊宁县天山花海景区是国内薰衣草连片种植面积最大的薰衣草基地。这两天,当地2.2...
奇瑞集团5月销售汽车20.57... 人民财讯6月2日电,奇瑞集团消息,奇瑞集团2025年5月销售汽车20.57万辆,同比增长9.1%。其...
【特稿】一堂课、一座桥、一程游... “天津的企业给我们出资建设温室大棚,又手把手地教我们种植技术,还主动为我们的农产品找销路,实在太感谢...
一堂课、一座桥、一程游、一束菇... 转自:津云庆阳与天津相隔千山万水,但“对口帮扶”让两座城市亲如兄弟。海河之水悄然润泽着董志塬的沟壑,...
华仁药业:持股5%以上股东华仁... 华仁药业6月2日公告,公司持股5%以上股东华仁世纪集团计划自2025年6月24日至2025年9月23...
“苏超”火了!网友:没有人情世... 转自:宁波晚报足球世界里,太多夹杂着底蕴比拼与恩怨情仇的高手过招,被冠以“德比”之名而享誉全球——意...
A股千亿级研发投入行业:建筑行...   在科技自立自强与产业链升级的双重驱动下,A股上市公司的研发投入正成为观察中国经济动能转换的关键窗...
适合一个人干的小生意,夫妻店创...   嗨,我的朋友们。夫妻可以做生意吗      一起?对于做小生意,没问题。      但是做大生意...