IjkPlayer 构建记录

2023/04/18 Android 共 4196 字,约 12 分钟

最近在研究Android上播放视频,自然是绕不过 ijkplayer。 其中在编译 ijkplayer 的过程中学习到很多概念,也踩了很多坑。 在此记录一下。

run-samples-video

主要问题来自几个方面:

  1. Gradle 版本 2.1.4 不支持最新版本的AS编译, 需要更新Gradle版本。
  2. Window上MingW不支持Homwbrew,需要手动安装,所以放弃在Win上编译,转战到Ubuntu上编译so,在Window下引用so来编译应用。
  3. 需要使用已不受支持的NDK版本(NDK14)才能编译。
  4. 对于适配多种CPU架构,编译多个ABI版本 lib。

以下编译过程按照官方默认的方式编译,即不支持https以及ffmpeg为3.4版本。 如果后续需要适配https编译,也会同步更新到此博文。

现在开始。

安装环境

  • Oracle Java 11
  • Android NDK 14
  • Android SDK 33
  • Android Studio 4.2.2
  • Gradle Plugin 4.2.2
  • Gradle 6.7.1

构建过程

编译过程中Ijkplayer的编译说明有些已经无法使用了, 已做了相应更新,编译过程已经能够成功编译。

安装之前

在bash下执行以下命令:

# install homebrew
# 这个已经不支持了 
# ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# install git, yasm
brew install git
brew install yasm

# 设置 SDK 以及 NDK (超过14则需要改代码,所以目前最好用14)
# add these lines to your ~/.bash_profile or ~/.profile
export ANDROID_SDK=<your sdk path>
export ANDROID_NDK=<your ndk path>      

# For Ubuntu/Debian users.
# choose [No] to use bash
sudo dpkg-reconfigure dash

开始编译 ijkPlayer

1. 克隆 ijkplayer 并切换到 k0.8.8

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

2. 初始化

./init-android.sh

3. 编译ffmpeg

在这里卡了很久,一直提示 ERROR: Failed to create toolchain., 解决方法参考文章最后。

./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

编译完成

4. 编译 ijkplayer

./compile-ijk.sh all 

build-ijkplayer

编译完成后,lib会生成到对应 ijkplayer-XXXX/src/main/libs 目录下

运行Example

Tisp: 操作过程中,修改build.gradle都需要sync。 中间遇到问题可以参考文章底下的疑难解决。

1. 更新 Gradle

默认 ijkplayer 的 Gradle版本如下

  • Gradle 2.1.4
  • Gradle Plugin 2.1.3

但是在新版的Android-Studio上不支持, 所以需要更新Gradle版本

将 Gradle 改为如下

  • Gradle 6.7.1
  • Gradle Plugin 4.2.2

2. 更新 Repository

打开 project 下的 build.gradle, 添加 repo


buildscript {
    repositories {
        jcenter()
        google()        # add
    }

    // ...
}

allprojects {
    repositories {
        jcenter()
        mavenCentral()  # add
        google()        # add
    }

    // ...
}

3. 更新 compileSdkVersion

ext {
    compileSdkVersion = 30          
    buildToolsVersion = "30.0.3"

    targetSdkVersion = 30
}

4. 更新所有模块引用方式

每个模块中使用的方式 compile 改为 implementation

5. 添加FlavorDimensions

新版的Gradle要求每个Flavor必须要添加 FlavorDimension

6. 引用lib并运行 example

  1. 拷贝 ijkplayer-XXXX/src/main/libs 下的文件目录,到Win上的Android-Studio上, 如下。 copy-libs

  2. 模块 ijkplayer-arm64, armv5, armv7, x86, x86_64下的 build.Gradle下修改 jniLibs.srcDirs 改为 libs

  1. 根据你的模拟器, 选择对用的Variant

  1. 运行 example

Run examples

疑难解决

创建 toolchain 失败

Error: Failed to create toolchain

有很多错误会导致出现这个问题,如没有安装python, 或者NDK > 14等。。

目前我遇到的情况时NDK下载成了Window版本的NDK。 按照下面的提示,在NDK里边没有找到linux-x86_64, 打开目录定睛一看,目录下是window-x86_64

可以再这里 Unsupported NDK Download 找到 NDK14 版本的NDK。

程序包android.test不存在

打开 项目 build.gradle 修改 targetSdkVersion 以及 compileSdkVersion 为 27

找不到构建工具版本 33.0.0

Failed to find Build Tools revision 33.0.0

打开 项目 build.gradle 修改 buildToolsVersion 为 "30.0.3"

NDK 版本问题

You need the NDKr10e or later

NDK版本太高了,配置环境变量 ANDROID_NDK 指向 NDK14b 版本 目录

找不到 libijkffmpeg.so 文件

library “libijkffmpeg.so” not found

1. 没有CPU架构对应的ABI

这里卡了很久。默认编译ijkplayer只编译了armv7a, 然后我用的模拟器是CPU架构是x86_64,所以一直提示没有发现 libijkffmpeg.so。

Can't find the library "libijkffmpeg.so"

2. Ubuntu上编译,然后在Window上引用so

这边出现的问题是当 将编译好的 so 文件拷贝到Window项目如下


# copy these so files into `ijkplayer-x86_64/src/main/libs`
# ijkplayer-x86_64/src/main/libs/libijkffmpeg.so
# ijkplayer-x86_64/src/main/libs/libijkplayer.so
# ijkplayer-x86_64/src/main/libs/libijksdl.so

# Module build.Gradle
sourceSets.main {
        jniLibs.srcDirs 'src/main/libs'
        // ...
    }

以上的路径都是按照Ubuntu上编译生成出来的so目录下拷贝的,但结果是在 Android Pane 上没有显示 jnilibs

Failed to reference libs

解决如下:

拷贝相应的so文件放到模块的根目录的libs下,并修改 build.gradle 执行 libs

# copy these so files into `ijkplayer-x86_64/src/main/libs`
# ijkplayer-x86_64/libs/libijkffmpeg.so
# ijkplayer-x86_64/libs/libijkplayer.so
# ijkplayer-x86_64/libs/libijksdl.so

# Module build.Gradle
sourceSets.main {
        jniLibs.srcDirs 'libs'
        // ...
    }

3. 没有选择正确的Variant

如果你运行基于x86_64架构上运行,而你使用的32位的编译的,也会存在找不到 so 文件, 就像我遇到的一样!

编译 ffmpeg 4.0 出错

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"

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"
  • 作者:星海流萤
  • 链接:https://juejin.cn/post/7213307533279182908
  • 来源:稀土掘金
  • 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考

Android ijkplayer 编译踩坑与记录(ijk0.8.8–ffmpeg4.0) [https://juejin.cn/post/7213307533279182908]

android NDK - make standalone toolchain fail [https://stackoverflow.com/questions/19142886/android-ndk-make-standalone-toolchain-fails]

文档信息

Search

    Table of Contents