0%

ijkplayer编译so文件支持更多格式


bilibili大名鼎鼎的ijkplayer开源播放器,有支持ffmpeg拓展,可拓展性高,体积小的优点,成为很多公司的首选播放器,但官方给的demo只支持mp4格式,想要支持横多的视频格式需要自己修改配置文件并重新编译出so文件才能实现,之前折腾了很久,一直是循环编译,最后编译失败。周末闲来下了,继续折腾终于编译成功,下面对ijkplayer的配置修改和编译做一个详细记录,方便以后查阅。

编译前提:在linux或者mac开发环境下,配置好JDK,SDK,NDK的环境变量

编译步骤:

  1. git clone ijkplayer的源码
  2. 通过init-android.sh脚本把ijkplayer的jni源码和ffmepg的源码拉下来
  3. 如果要支持https,通过init-android-openssl.sh把openssl的代码拉下来
  4. 用脚本compile-openssl.sh编译openssl
  5. 选择编译配置文件,修改配置
  6. 用脚本compile-ffmpeg.sh编译ffmpeg
  7. 用脚本compile-ijk.sh编译ijkplayer的jni源码

下面是具体的操作过程:

  1. 拉ijkplayer的源码

    git clone https://github.com/bilibili/ijkplayer

  2. 切换目录,把ijkplayer的jni源码和ffmepg的源码拉下来

    cd ijkplayer

    ./init-android.sh

  3. 把openssl的代码拉下来

    ./init-android-openssl.sh

  4. 切换目录,编译openssl

    cd android/contrib

    ./compile-openssl.sh clean

    ./compile-openssl.sh all

  5. 切换目录,修改配置文件,删除之前的配置文件软链接,并重新设置一个配置文件的软链接

    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
    2
    export 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

  6. 切换目录,编译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这个错误就解决了。

  7. 切换目录,编译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文件,前面一个明显大一些。