一、编译缘由:
公司业务需要集成播放器,市面上用的比较多的是B端的ijkplayer播放器,使用方便,功能也比较强大,所在就采用了ijkplayer。项目的要求支持的mp4,3gp,rmvp,rm,avi,mov,mpg,flv封装格式和https协议,而且ijkplayer默认的编译的格式比较少,所以要重新编译,不过在编译的过程出现了各种问题,各种坑,所以记录一下,省得后人来踩。
二、编译历程
编译ijkplayer播放器要在linux环境下生成so,小编之前都是在windows上进行开发,没有在linux上开发过,对linux指令不是很熟悉,所以就想在简单的在windows配置环境,采用了Cygwin,后来我发现在我错了,装了Cygwin后,出错了这么多软件和环境的问题。后来放弃了,采用虚拟机,VMware+Ubuntu,其实这个方式更简单,只需要在官网下载安装即可,安装的时候给ubuntu的空间可以大一点,我的是60G,小的话可能会提示空间不足。于是就兴高采烈在开始编译了。按照着https://github.com/Bilibili/ijkplayer官网上的步骤来,卧槽,不行啊。后来通过不断的尝试和查找,终于编译成功了,下面的我尝试的正确步骤。
1、配置环境
install homebrew, git, yasm
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install git
brew install yasm
去官网下载解压jdk,sdk,ndk,ndk版本用的是r10e的
$sudo gedit ~/.bashrc
将一下内容粘贴到文档最底部(具体路径以自己的机器为准)
export JAVA_HOME=/home/tan/Android/jdk1.7.0_79
export JRE_HOME=/home/tan/android/jdk1.7.0_79/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export ANDROID_SDK=/home/tan/android/android-sdk-linux
export PATH=$PATH:$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools
export ANDROID_NDK=/home/tan/android/android-ndk-r13b
export ANDROID_NDK
保存,输入命令:source ~/.bashrc 使环境生效
2、编译之前
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
cd ijkplayer-android
git checkout -B latest k0.8.8
配置编译支持所有格式
cd config
先打开module-default.sh,在尾部添加下面代码,要不然会编译失败,这里是一个大坑
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bzlib"
rm module.sh
ln -s module-default.sh module.sh
cd android/contrib
sh compile-ffmpeg.sh clean
ok,真正要开始编译了
回到项目根目录
cd ijkplayer-android
./init-android-openssl.sh //这里是配置ssl,https协议
./init-android.sh
这里下载ffmpeg和预编译内容,比较耗时,可以喝一杯咖啡先,
完成后接着
cd android/contrib
./compile-openssl.sh clean
./compile-ffmpeg.sh clean
./compile-openssl.sh all
./compile-ffmpeg.sh all
这里的编译也比较耗时,不过等待的就是成功的喜悦啦
结束后,编译就完成了,接下来就是生成so文件
cd ..
./compile-ijk.sh all
生成过程还不太久,会在/ijkplayer-android/android/ijkplayer目录下生成我们所想要的包,生成的包还挺大的。每一个步骤都是比较重要的,落掉某个步骤可能就会导入生成失败,每次的编译生成过程也是比较耗时的,所以少踩点坑就可以节约很多时间。