Mac m2芯片 全量编译ijkplayer生成Android库

20 篇文章 4 订阅
3 篇文章 0 订阅

ijkplayer编译

Pangu-Immortal (Pangu-Immortal) · GitHub

GitHub地址:GitHub - bilibili/ijkplayer: Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support.

最近做新人培训,讲了下编译过程,发现很多人拉不下代码,也编译不过去。我用一台新电脑重新梳理了一个新环境会遇到哪些坑,这里简单记录一下完整的内容和踩过的坑。

1. 环境准备

# install homebrew, git, yasm
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install git
brew install yasm

2. 设置环境

在你的环境变量里面加入路径

# NDK
export ANDROID_NDK=/Users/qihao/android-ndk-r14b/
# SDK
ANDROID_HOME=/Users/qihao/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/tools
export ANDROID_SDK=/Users/qihao/Library/Android/sdk
open .bash_profile

# 编辑好了保存,生效用下面命令,这里针对的当前窗口的上下文
source .bash_profile

环境变量很简单,如果不会可以随意搜索就能找到答案。

3.下载ijk代码

       这个需要安装git,可以参考网上各种教程,比较简单。我的mac因为之前安装了git的桌面客户端,所以就有了git环境,不需要额外配置。

# 克隆到ijkplayer-android目录
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android

# 进入ijkplayer-android目录
cd ijkplayer-android
# 检出最新版本
git checkout -B latest k0.8.8

4.编译前选择你的配置,就是自动化编译时的一些配置选项,比如支持什么协议啊,支持什么音视频类型等,

官方提供了三个模板给我们使用:

  • module-default.sh:默认,如果你喜欢更多类型可以用这个;
  • module-lite-hevc.sh:如果您更喜欢较小的二进制大小的编解码器/格式(包括hevc功能)
  • module-lite.sh:如果您更喜欢较小的二进制大小的编解码器/格式(默认情况下)

使用的时候如下:

cd config
rm module.sh
ln -s module-default.sh module.sh

5.初始化FFMPEG(最好用梯子)

./init-android.sh

这个是下载FFMPEG的源码,下载过程会很慢。下载过程中extra\ffmpeg文件夹的内容会变化。

5.1 如果视频播放需要支持Https协议,还需要执行如下命令:(最好用梯子)
./init-android-openssl.sh

终端如果不配置代理会很慢,电脑开了梯子和终端是两回事,终端依然不走代理流量,除非是代理全部流量。

# 打开terminal,使用代理。例如,这里只是举个例子,IP和端口用自己的。

export http_proxy=http://127.0.0.1:50122
export https_proxy=http://127.0.0.1:50122 
export ALL_PROXY=socks5://127.0.0.1:50121

6. 编译

6.1 去除恶意软件检测(M1、M2芯片需要这一步)
sudo spctl --master-disable
6.2 开始编译。
cd android/contrib

执行清除命令,然后编译需要的so,这里的all是生成所有版本的,如果只需要对应版本的,可以把all替换成armv7a等你需要的版本。编译需要很长时间。

在编译ffmpeg的时候出现Unknown option "--disable-ffserver"错误.

因为:ffmpeg4.0删了ffserver

-----------------------------------------------------------------

将 config/module.sh 中的

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

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

注释了就可以了......

------------------------------------------------------------

在 module.sh  最底部 增加以下两行:

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bzlib"

编译openssl

./compile-openssl.sh clean
./compile-openssl.sh all

编译ffmpeg

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

‼️ 提示NDK环境问题时请注意:(ijk只认 ANDROID_NDK,ANDROID_SDK 两个字段)

You must define ANDROID_NDK, ANDROID_SDK before starting.
They must point to your NDK and SDK directories.

需要特殊的配置,并非环境配置不对。。

需要额外增加一个:

在原来环境变量的基础上,必须增加这两行。因为ijk比较老了,识别老的方式。
# export ANDROID_SDK=<your sdk path>
# export ANDROID_NDK=<your ndk path>

# NDK
export ANDROID_NDK=/Users/qihao/android-ndk-r14b/

# SDK
ANDROID_HOME=/Users/qihao/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/tools
export ANDROID_SDK=/Users/qihao/Library/Android/sdk

编译0.8.8版本的ijk,./compile-ffmpeg.sh all,出现了linux/perf_event.h: No such file or directory

# 在moule.sh文件加入如下两句即可:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bzlib"

# 然后clean一下再编译。
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

看最后一行,有一句提示:运行如下脚本编译成so库。

7. 最后开始编译 ijkplayer​​​​​​​​​​​​​​

 需要把 ndk-build 用文本打开,按如下方式修改:

原文件内容:
#!/bin/sh
DIR="$(cd "$(dirname "$0")" && pwd)"
$DIR/build/ndk-build "$@"

修改为:
#!/bin/sh
DIR="$(cd "$(dirname "$0")" && pwd)"
arch -x86_64 /bin/bash $DIR/build/ndk-build "$@"
# 退到上一级目录,看一眼,有个 compile-ijk.sh 文件。

# to continue to build ijkplayer, run script below,
# sh compile-ijk.sh
# 不带all只有v7a

# 全版本编译:
cd ..   

ls # 查看是否有 compile-ijk.sh 文件

./compile-ijk.sh all

附:如果使用的是较 r10e 高的ndk版本,可能会遇到 Host 'awk' tool is outdated :

% ./compile-ijk.sh all
profiler build: NO
Android NDK: Host 'awk' tool is outdated. Please define NDK_HOST_AWK to point to Gawk or Nawk !    
/Users/wwf/Desktop/env/android-sdk/ndk/android-ndk-r14b/build/core/init.mk:391: *** Android NDK: Aborting.    .  Stop.

这种情况就需要删除 ndk/prebuilt 下平台指令集中的 awk 程序。
示例路径:/Users/xxx/env/android-sdk/ndk/android-ndk-r14b/prebuilt/darwin-x86_64/bin/awk
找到文件,把它删除或改个名字都行。

so的输出路径:源码根目录/android/ijkplayer/ijkplayer-arm64/src/main/libs/arm64-v8a
其他指令集同理。

8.到此就算编译完成了。然后找到ijkplayer目录使用Android studio打开即可。


关于如何运行android studio集成ijkplayer

Pangu-Immortal (Pangu-Immortal) · GitHub

  • 1.导入到你的项目中

android studio打开你的项目,File- Import Module…选择ijkplayer的anroid/ijkplayer目录,ijk-example依赖所有库,所以导入后所有项目都会导入到你的项目中。

  • 2.将android/ijkplayer目录下的tools文件夹也拷贝到自己项目的根目录下。
  • 3. 在ijkplayer-java\src\main\目录下新建一个名为jniLibs的文件夹,将各个ijkplayer-xxx目录中的\src\main\libs目录下的文件夹拷贝到jniLibs文件夹中,如:ijkplayer–armv7a的该目录下包含armeabi-v7a这个文件夹,其中包含了该平台对应的.so文件,如果希望包含所有平台的,就将所有ijkplayer-xxx下的全部拷过来,如果只希望某几个平台的,就只拷贝它们的。
  • 4.将ijkplayer-xxx的目录全部从项目中删除掉,只保留ijkplayer-example、ijkplayer-java、ijkplayer-exo以及tools文件夹,其中ijkplayer-example依赖于后面几个。

  • 5.将ijkplayer-example修改为Module的形式,因为ijkplayer-example本身是一个application工程,默认不生成aar文件,且里面的资源互相依赖,难以像旧版本通过复制所需的几个java文件到自己工程中的方式来使用,所以不如将整个ijkplayer-example转换为我们工程的一个Module。具体方法是:
先修改ijkplayer-example目录下的build.gradle文件,如下:


apply plugin: 'com.android.library'


android {

  // http://tools.android.com/tech-docs/new-build-system/tips

  //noinspection GroovyAssignabilityCheck

  compileSdkVersion rootProject.ext.compileSdkVersion

  //noinspection GroovyAssignabilityCheck

  buildToolsVersion rootProject.ext.buildToolsVersion

  buildToolsVersion '25.0.0'


  lintOptions {

    abortOnError false

  }

  defaultConfig {

    minSdkVersion 9

    targetSdkVersion rootProject.ext.targetSdkVersion

    versionCode rootProject.ext.versionCode

    versionName rootProject.ext.versionName

  }

  buildTypes {

    release {

      minifyEnabled false

      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }

  }

}


dependencies {

  compile fileTree(include: ['*.jar'], dir: 'libs')

  compile 'com.android.support:appcompat-v7:25.0.0'

  compile 'com.android.support:preference-v7:23.0.1'

  compile 'com.android.support:support-annotations:23.0.1'


  compile 'com.squareup:otto:1.3.8'


  compile project(':ijkplayer-java')

  compile project(':ijkplayer-exo')

}

注意:

  1. apply plugin: ‘com.android.application’要改为apply plugin: ‘com.android.library’
  2. applicationId “tv.danmaku.ijk.media.example”这句要去掉
  3. compile ‘com.android.support:appcompat-v7:25.0.0’
    1. compile ‘com.android.support:preference-v7:23.0.1’
    2. compile ‘com.android.support:support-annotations:23.0.1’
    3. compile ‘com.squareup:otto:1.3.8’

这几个修改为自己安装的版本。

  • 6.在ijkplayer-example根目录下增加一个gradle.properties文件,内容如下:
POM_NAME=ijkplayer-example

POM_ARTIFACT_ID=ijkplayer-example

POM_PACKAGING=aar
  • 7.在自己的项目中添加依赖项,完成上述操作,点击async gradle即可。

其他错误:

如果出现

Error:(3) Error retrieving parent for item: No resource found that matches the given name ‘android:TextAppearance.Material.Widget.Button.Borderless.Colored’.

如上类似错误,那是几个项目的sdk版本不同引起的,四个项目包含你自己的项目的compileSdkVersion 、

buildToolsVersion、targetSdkVersion和compile ‘com.android.support:appcompat-v7:25.0.0’ 几个版本必须要统一,如果不统一会出现各种问题。

以上就是本文的全部内容,希望对大家的学习有所帮助。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值