Android ijkplayer 编译详细流程

2023年 10月 10日 54.5k 0

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

Pasted Graphic.png

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

Pasted Graphic 1.png

可以看到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文件夹
    image.png

6.编译so文件

进入到指定目录下

./cd android/contrib

遇到这个弹窗

Pasted Graphic 8.png
终端输入:

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
Pasted Graphic 2.png

  • 编译成功
    Pasted Graphic.png

  • 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".
Pasted Graphic 1.png
出错原因: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
Pasted Graphic 3.png
原因是:
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"
Pasted Graphic 4.png

  • ffmpeg编译成功
    Pasted Graphic 5.png

  • 编译成功后,会在../ijkplayer/android/contrib/build 下,看到编译生成的文件
    Pasted Graphic 6.png

6.3、编译 ijkplayer,注意回到android 路径下
./cd ..
./compile-ijk.sh all

编译报错:
Pasted Graphic 9.png
原因:指令不兼容
解决方案,修改ndk目录下的 ndk-build 文件:
找到ndk路径(/Users/../android-ndk-r10e)下的ndk-build 文件,使用文本编辑器打开,144行左右把 x86_64|amd64) 这里加一个,改成 x86_64|amd64|arm64)
Pasted Graphic 10.png

  • 再次执行./compile-ijk.sh all,编译成功,最终生成的路径示例:ijkplayer-android/android/ijkplayer/ijkplayer-armv7a/src/main/libs/armeabi-v7a
    Pasted Graphic 7.png

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论