ijkplayer编译
Pangu-Immortal (Pangu-Immortal) · GitHub
最近做新人培训,讲了下编译过程,发现很多人拉不下代码,也编译不过去。我用一台新电脑重新梳理了一个新环境会遇到哪些坑,这里简单记录一下完整的内容和踩过的坑。
1. 环境准备
# install homebrew, git, yasm
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install git
brew install yasm
- Android SDK(官网下)
- 不受支持的 NDK 下载(android-ndk-r14b,官方使用的r10。这里不能高于r14b,否则编译不过)
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')
}
注意:
- apply plugin: ‘com.android.application’要改为apply plugin: ‘com.android.library’
- applicationId “tv.danmaku.ijk.media.example”这句要去掉
- 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’
这几个修改为自己安装的版本。
- 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’ 几个版本必须要统一,如果不统一会出现各种问题。
以上就是本文的全部内容,希望对大家的学习有所帮助。