ijkplayer编译教程
前言
ijkplayer作为一个流行的移动端的开源的播放软件,基于ffplay,对于入门音视频领域来说是必须要经历的。以下是我在公司实习期间所完成的ijkplayer编译,仅供大家参考
本文参考ijkplayer官方readme文档,详情请见:https://github.com/bilibili/ijkplayer
大致流程
- 首先下载ijkplayer的源代码,我们就是要编译它
- 因为ijkplayer是依赖于ffmpeg的,所以我们需要先编译ffmpeg,生成so动态链接文件
- 接着再编译ijkplayer,同样生成so文件
- 利用gradle工具将整个项目构建起来
编译前准备
- 首先,我们需要一个linux环境(以Ubuntu16为例)
- 安装必要的软件,这些软件在shell脚本中都会有所涉及,所以必须提前安装
sudo apt-get install git
sudo apt-get install yasm
sudo apt-get install make
- 其次,我们需要安卓的ndk和sdk资源包(从公司内网下载,注意ndk版本选择14,我用的是android-ndk-r14b),或从互联网下载(请自行查找资料)
- 配置linux的环境变量,具体可参考https://blog.csdn.net/daydayupchen/article/details/126158229?spm=1001.2014.3001.5501
# add these lines to your ~/.bash_profile or ~/.profile
# export ANDROID_SDK=<your sdk path>
# export ANDROID_NDK=<your ndk path>
- 配置完sdk和ndk的环境变量后,我们需要拿到ijkplayer的源码,也就是编译原材料
git clone xxxxxxxxxxxxx #建议使用码云地址,以免网络问题
接下来看看按照官方文档继续前进
- If you prefer more codec/format
#第一步
cd config
rm module.sh
ln -s module-default.sh module.sh
在3个版本中,我们选择最全的一个,拥有最全的编码和格式支持
- 先让我们来看看这个module.sh到底是啥
-
其实就是就三个.sh脚本文件,module.sh就是根据情况软连接到一个.sh文件,这可以由我们自由更改
-
这里我们链接到module-default.sh文件,打开这个.sh文件发现里面其实就是一些配置的环境变量
#第二步
cd android/contrib
sh compile-ffmpeg.sh clean
- 接着我们进入项目的android/contrib目录下,这个目录下放的是第三方工具
- 看看compile-ffmpeg.sh里写的是些啥
#----------
case "$FF_TARGET" in
"")
echo_archs armv7a
sh tools/do-compile-ffmpeg.sh armv7a
;;
armv5|armv7a|arm64|x86|x86_64)
echo_archs $FF_TARGET $FF_TARGET_EXTRA
sh tools/do-compile-ffmpeg.sh $FF_TARGET $FF_TARGET_EXTRA
echo_nextstep_help
;;
all32)
echo_archs $FF_ACT_ARCHS_32
for ARCH in $FF_ACT_ARCHS_32
do
sh tools/do-compile-ffmpeg.sh $ARCH $FF_TARGET_EXTRA
done
echo_nextstep_help
;;
all|all64)
echo_archs $FF_ACT_ARCHS_64
for ARCH in $FF_ACT_ARCHS_64
do
sh tools/do-compile-ffmpeg.sh $ARCH $FF_TARGET_EXTRA
done
echo_nextstep_help
;;
clean)
echo_archs FF_ACT_ARCHS_64
for ARCH in $FF_ACT_ARCHS_ALL
do
if [ -d ffmpeg-$ARCH ]; then
cd ffmpeg-$ARCH && git clean -xdf && cd -
fi
done
rm -rf ./build/ffmpeg-*
;;
check)
echo_archs FF_ACT_ARCHS_ALL
;;
*)
echo_usage
exit 1
;;
esac
-
我们来看主体这段,当我们输入命令
-
sh compile-ffmpeg.sh clean
clean就会当做一个参数($1)传给FF_TARGET,源码如下
UNI_BUILD_ROOT=`pwd`
FF_TARGET=$1
FF_TARGET_EXTRA=$2
- 我们先来看看实际这样执行的结果
- 大概就是如果某些目录存在那么就做一些删除的操作,初始化环境
继续前进!!!
- For Ubuntu/Debian users.
# choose [No] to use bash
sudo dpkg-reconfigure dash
- 可以参考https://blog.csdn.net/weixin_39212776/article/details/81097990
开始编译
cd到ijkplayer的目录下
git checkout -B latest k0.8.8
./init-android.sh
- 这个init-android.sh会拉取FFmpeg的GitHub源码
-
当你执行这个init-android时,可能因为网路问题需要换源,换成自己gitee
-
在执行时,也许还会碰到需要换源的时候,这时你需要根据脚本再去其他脚本文件里找,继续换源,如下
请注意,这里需要注意的是,你必须使用bilibili的GitHub仓库中自带的FFmpeg的源代码,而不能使用FFmpeg官方的GitHub地址,否则会发现这个分支(标签)不存在
且当你重新拉取时,你需要把所有文件删干净,否则可能会出错!
- 继续往下走,开始编译
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all #编译ffmpeg
cd ..
./compile-ijk.sh all #编辑ijkplayer
- 当编译FFmpeg时,你可能会遇到问题如下
- fatal:linux/perf_event.h: No such file or directory
- 请参考如下文章:https://blog.csdn.net/wusejiege6/article/details/108310915?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-108310915-blog-125591523.pc_relevant_sortByStrongTime&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-108310915-blog-125591523.pc_relevant_sortByStrongTime&utm_relevant_index=1
- 修改完module.sh后,我们就可以继续执行如下操作
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
-
进入项目构建,这里我们使用gradle进行构建
-
# Gradle # cd ijkplayer # gradle
-
首先你当然得下载Gradle,请访问gradle官网下载
-
配置gradle环境变量
export GRADLE_HOME=/xxxxxx/xxxxx/gradle-2.0
export PATH=$GRADLE_HOME/bin:$PATH
- 验证gradle环境是否配置成功,显示出信息则视为成功
gradle -v
- 进入目录为xxxx/ijkplayer/android/ijkplayer,在这个路径下编译安卓项目
gradlew -assembleDebug
-
使用上面这个命令进行编译,gradle会自行安装一些需要的组件
- 可能会遇到没有配置sdk_dir的情况,也就是没有配置环境变量$ANDROID_HOME,这是因为之前配置的环境变量是$ANDROID_SDK,所以你需要重新配置环境变量,且不要忘记source哦!!
-
会在不同架构,例如armv7a下生成aar文件,但只有一个目录下存在apk文件(ijkplayer-example),可以直接使用手机安装
- 安装后可以在菜单栏sample里播放样例,但其来自于apple公司,所以可能需要科学上网!
大功告成!完结撒花!
Tips
-
如果你发现你的linux里ll命令不好用了,可能是因为你环境变量配置的问题
-
ll的命令写在~/.bashrc文件下,一般都是写好的,但你现在要不每次去source它,ll就不会生效,非常麻烦
-
解决办法如下
-
cd vim .bash_profile #输入以下内容 # .bash_profile if [ -f ~/.bashrc ]; then . ~/.bashrc fi
-
这样系统就会自动执行了
-
详细请参考https://blog.csdn.net/lei_qi/article/details/121694489
总结
- 真的会遇到各种各样的问题,是一个复杂的过程,全部都是用脚本完成
- 算是个人第一次编译开源项目,尤其是不熟悉安卓、gradle和git,真的一步步都还挺艰难的
- 从一开始完全懵逼到现在逐渐理解,大约需要4~5天时间
- 后期还需要进入细节继续学习