1. 配置sdk、ndk环境变量
终端输入open .bash_profile回车,.bash_profile文件末尾添加以下配置(路径根据实际情况修改)
sdk、ndk:
NDK_HOME=/Users/admin/Library/Android/android-ndk-r10e
export PATH=$PATH:$NDK_HOME
export ANDROID_SDK=/Users/admin/Library/Android/sdk
export ANDROID_NDK=/Users/admin/Library/Android/android-ndk-r10e
export PATH=$PATH:$ANDROID_SDK/tools
export PATH=$PATH:$ANDROID_SDK/platform-tools
export PATH=$PATH:$ANDROID_NDK
2. 下载ijkplayer源码,切换到最新分支。
./git clone https://github.com/Bilibili/ijkplayer.git ijkplayer**
./cd ijkplayer**
./git checkout -B latest k0.8.8
3.修改 ijkplayer 依赖的 FFmpeg 的版本(改成 4.0 版本)。
在 init-android.sh 脚本中,搜索 IJK_FFMPEG_COMMIT=ff3.4--ijk0.8.7--20180103--001,修改为 IJK_FFMPEG_COMMIT=ff4.0--ijk0.8.8--20210426--001
4.修改编译的版本类型(精简版/完整版)
可以看到config路径下的module.sh即为软连接,默认是精简版。
-
4.1、进入到config路径
./cd config
-
4.2、先删除module.sh文件,输入命令:
rm module.sh
-
4.3、通过ln -s 命令来标识软连接(任选其一):
./ln -s module-default.sh module.sh # 标识为完整版
./ln -s module-lite.sh module.sh # 标识为精简版
./ln -s module-lite-hevc.sh module.sh # 标识为 包含 HEVC 的精简版
5.初始化项目(下载依赖的代码,注意cd ..回退到 ..ijkplayer/路径下进行)
-
5.1、下载指定的 ffmpeg 源码 ff4.0--ijk0.8.8--20210426--001
./init-android.sh
拉取成功后,会在…/ijkplayer/extra路径下看到ffmpeng文件夹
-
5.2、下载 openssl 源码,用于支持 https
./init-android-openssl.sh
- 拉取成功后,会在…/ijkplayer/extra路径下看到openssl文件夹
6.编译so文件
进入到指定目录下
./cd android/contrib
遇到这个弹窗
终端输入:sudo spctl --master-disable
-
6.1、编译 openssl (all 标识编译所有架构的 so,想编译x86架构则将 all 替换成x86)
./compile-openssl.sh clean
./compile-openssl.sh all
编译报错:error: undefined reference to 'OBJ_create'。
失败原因:多线程编译导致,改成单线程编译,修改脚本: ./android/contrib/tools/do-detect-env.sh 的#91行:
export IJK_MAKE_FLAG=-j`sysctl -n machdep.cpu.thread_count`
#修改为:
export IJK_MAKE_FLAG=-j1
-
编译成功
-
6.2、编译 FFmpeg (编译openssl成功之后,可以再把do-detect-env.sh多线程改回去,要不然编译巨慢) (all 标识编译所有架构的 so,想编译x86架构则将 all 替换成x86)
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
编译出错:Unknown option "--disable-ffserver".
出错原因: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"
编译出错:make: [libavcodec/hevc_mvs.o] Error 1
原因是:
libavcodec/hevc_mvs.c最终会include libavutil/timer.h文件#if CONFIG_LINUX_PERF #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include // read(3) #include #include #include #endif
在sys/ioctl.h中最终会include asm/termbits .h文件
#define B0 0000000
所以在用B0作为变量或参数的地方,一般都会报错。
解决方案:
打开..config/module.sh,增加:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"
-
ffmpeg编译成功
-
编译成功后,会在../ijkplayer/android/contrib/build 下,看到编译生成的文件
6.3、编译 ijkplayer,注意回到android 路径下
./cd ..
./compile-ijk.sh all
编译报错:
原因:指令不兼容
解决方案,修改ndk目录下的 ndk-build 文件:
找到ndk路径(/Users/../android-ndk-r10e)下的ndk-build 文件,使用文本编辑器打开,144行左右把 x86_64|amd64) 这里加一个,改成 x86_64|amd64|arm64)
- 再次执行./compile-ijk.sh all,编译成功,最终生成的路径示例:ijkplayer-android/android/ijkplayer/ijkplayer-armv7a/src/main/libs/armeabi-v7a