bilibili大名鼎鼎的ijkplayer开源播放器,有支持ffmpeg拓展,可拓展性高,体积小的优点,成为很多公司的首选播放器,但官方给的demo只支持mp4格式,想要支持横多的视频格式需要自己修改配置文件并重新编译出so文件才能实现,之前折腾了很久,一直是循环编译,最后编译失败。周末闲来下了,继续折腾终于编译成功,下面对ijkplayer的配置修改和编译做一个详细记录,方便以后查阅。
编译前提:在linux或者mac开发环境下,配置好JDK,SDK,NDK的环境变量
编译步骤:
- git clone ijkplayer的源码
- 通过init-android.sh脚本把ijkplayer的jni源码和ffmepg的源码拉下来
- 如果要支持https,通过init-android-openssl.sh把openssl的代码拉下来
- 用脚本compile-openssl.sh编译openssl
- 选择编译配置文件,修改配置
- 用脚本compile-ffmpeg.sh编译ffmpeg
- 用脚本compile-ijk.sh编译ijkplayer的jni源码
下面是具体的操作过程:
拉ijkplayer的源码
git clone https://github.com/bilibili/ijkplayer
切换目录,把ijkplayer的jni源码和ffmepg的源码拉下来
cd ijkplayer
./init-android.sh
把openssl的代码拉下来
./init-android-openssl.sh
切换目录,编译openssl
cd android/contrib
./compile-openssl.sh clean
./compile-openssl.sh all
切换目录,修改配置文件,删除之前的配置文件软链接,并重新设置一个配置文件的软链接
cd ../../
cd config
rm module.sh
ln -s module-default.sh module.sh
注意module-lite.sh是精简了支持格式的配置文件,module-default.sh这个是支持格式较多的配置文件
这一步,遇到了一个错误
linux/perf_event.h: No such file
,当执行ffmpeg的编译操作,./compile-ffmpeg.sh all
才会提示。解决方案:
先删除之前的软链接文件
rm module.sh
改一下module-default.sh配置文件,在末尾添加2行代码:
1
2export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bzlib"再创建软链接
ln -s module-default.sh module.sh
切换目录,编译ffmpeg
cd ..
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
这一步,遇到了一个错误
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build
提示汇编工具没有安装。
解决方案:
可以安装yasm,或者按照提示执行./configure –disable-x86asm,由于yasm暂时用不上,那么就执行./configure –disable-x86asm来解决,但是这里我们编译ffmpeg是通过shell脚本,所以只能去改脚本。
我们打开compile-ffmpeg.sh这个脚本发现它其实是在执行tools/do-compile-ffmpeg.sh这个脚本,再打开do-compile-ffmpeg.sh,搜索是否有
./configure
这个命令,果然在305行,我们找到了相关代码:1
2
3./configure $FF_CFG_FLAGS \
--extra-cflags="$FF_CFLAGS $FF_EXTRA_CFLAGS" \
--extra-ldflags="$FF_DEP_LIBS $FF_EXTRA_LDFLAGS"这里关注一下FF_CFG_FLAGS这个变量,我们可以在它后面追加
--disable-x86asm
这个参数命令修改FF_CFG_FLAGS变量应该在调用
./configure
命令之前,所以我们添加一句代码在294行:FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-x86asm"
,先清除之前编译的文件./compile-ffmpeg.sh clean
,再编译一次./compile-ffmpeg.sh all
这个错误就解决了。切换目录,编译ijkplayer的jni源码
cd ..
./compile-ijk.sh all
编译完成,so文件一般保留arm-v7a的就可以了,路径是
/ijkplayer/android/ijkplayer/ijkplayer-armv7a/src/main/libs/armeabi-v7a
比较module-default.sh和module-lite.sh编译出来的so文件,前面一个明显大一些。