Mac全量编译ijkplayer生成Android库

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. 设置环境

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

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文件夹的内容会变化。

如果视频播放需要支持Https协议,还需要执行如下命令:

./init-android-openssl.sh

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

# 打开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.编译

cd android/contrib

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

编译openssl

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

编译ffmpeg

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

在编译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"

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

‼️ 提示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库。

Pangu-Immortal (Pangu-Immortal) · GitHub

cd ..
退到上一级目录,看一眼,有个compile-ijk.sh文件。

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

全版本
./compile-ijk.sh all

7.到此就算编译完成了。然后找到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’ 几个版本必须要统一,如果不统一会出现各种问题。

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

猜你喜欢

转载自blog.csdn.net/gfg156196/article/details/115496387
今日推荐