Android音视频系列

ijkplayer 开源项目分析(五)ffmpeg升级到4.X版

2020-05-19  本文已影响0人  码上就说

ijkplayer 开源项目分析(一)编译
ijkplayer 开源项目分析(二)播放流程概要
ijkplayer 开源项目分析(三)msg_queue消息机制剖析
ijkplayer 开源项目分析(四)解决video size识别问题
ijkplayer 开源项目分析(五)ffmpeg升级到4.X版本
ijkplayer 开源项目分析(六)视频解析核心流程
ijkplayer 开源项目分析(七)ijkplayer自动旋转功能
ijkplayer 开源项目分析(八)avformat_open_input剖析
ijkplayer 开源项目分析(九)核心option解析
ijkplayer 开源项目分析(十)提升直播画面质量
ijkplayer 开源项目分析(十一)filter过滤器介绍
ijkplayer 开源项目分析(十二)filter改变声音音量

升级ffmpeg的必要性

我们下载ijkplayer项目代码,发现代码很长时间没有更新,在ijkplayer 开源项目分析(一)编译中可以知道ijkplayer各个目录的含义,其实ijkplayer也是在更新的,业务层的代码是很久没有更新了,业务层主要是封装,核心代码还是在ffmpeg项目中,ffmpeg是一个开源库,ffmpeg的更新是非常频繁的,目前ijkplayer最新的分支是:k0.8.8,这个分支下直接编译没有问题。这个分支上默认引用的是ffmpeg 3.4的代码,目前ffmpeg已经升级到4.X了,并且解决了老版本存在的很多问题,还是很有必要升级一波的。

  • ffmpeg 3.4版本遗留很多问题,ffmpeg 4.X都相应解决了这些问题。

升级ffmpeg 4.X

查看bilibili中ffmpeg库的版本升级工作:https://github.com/bilibili/FFmpeg


最新的tag名是:ff4.0--ijk0.8.25--20200221--001
找到ijkplayer项目下的init-android.sh文件,用ff4.0--ijk0.8.25--20200221--001替换下面红框中文件:

openssl库也需要替换一下:openssl最新的tag名为OpenSSL_1_0_2u
找到ijkplayer项目下的init-android-openssl.sh

然后开始编译,编译的时候发生了问题,需要修改一下config/module.sh文件,注释掉下面两句脚本:

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vda"
编译的时候发生了下面的问题: 原来是ffmpeg4.X已经删掉了eac3_core相关的代码,那么在编译的时候需要关掉这个option。
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=eac3_core"

这句编译指令一定要放在--enable-bsfs之后,不然这句话没有效果。

继续编译,最终成功。通过升级ffmpeg版本可以解决ijkplayer播放器的很多问题。

简化的编译脚本

#! /usr/bin/env bash

compile_openssl() {
    cd ./android/contrib
    ./compile-openssl.sh clean
    ./compile-openssl.sh armv5
    ./compile-openssl.sh armv7a
    ./compile-openssl.sh arm64
    ./compile-openssl.sh x86
    ./compile-openssl.sh x86_64
    cd ../..
}

compile_ffmpeg() {
    cd ./android/contrib
    ./compile-ffmpeg.sh clean
    ./compile-ffmpeg.sh armv5
    ./compile-ffmpeg.sh armv7a
    ./compile-ffmpeg.sh arm64
    ./compile-ffmpeg.sh x86
    ./compile-ffmpeg.sh x86_64
    cd ../..
}

compile_ijkplayer() {
    cd ./android
    ./compile-ijk.sh clean
    ./compile-ijk.sh armv5
    ./compile-ijk.sh armv7a
    ./compile-ijk.sh arm64
    ./compile-ijk.sh x86
    ./compile-ijk.sh x86_64
    cd ..
}

copy_function() {
    if [ ! -d "./packages" ]; then
        mkdir ./packages
    fi

    if [ ! -d "./packages/libs" ]; then
        mkdir ./packages/libs
    fi

    if [ ! -d "./packages/obj" ]; then
        mkdir ./packages/obj
    fi

    if [ ! -d "./packages/libs/armeabi" ]; then
        mkdir ./packages/libs/armeabi
    fi

    if [ ! -d "./packages/obj/armeabi" ]; then
        mkdir ./packages/obj/armeabi
    fi

    cp -rf ./android/ijkplayer/ijkplayer-armv5/src/main/obj/local/armeabi/*.so ./packages/obj/armeabi
    cp -rf ./android/ijkplayer/ijkplayer-armv5/src/main/libs/armeabi/*.so ./packages/libs/armeabi

    if [ ! -d "./packages/libs/armeabi-v7a" ]; then
        mkdir ./packages/libs/armeabi-v7a
    fi

    if [ ! -d "./packages/obj/armeabi-v7a" ]; then
        mkdir ./packages/obj/armeabi-v7a
    fi

    cp -rf ./android/ijkplayer/ijkplayer-armv7a/src/main/obj/local/armeabi-v7a/*.so ./packages/obj/armeabi-v7a
    cp -rf ./android/ijkplayer/ijkplayer-armv7a/src/main/libs/armeabi-v7a/*.so ./packages/libs/armeabi-v7a

    if [ ! -d "./packages/libs/arm64-v8a" ]; then
        mkdir ./packages/libs/arm64-v8a
    fi

    if [ ! -d "./packages/obj/arm64-v8a" ]; then
        mkdir ./packages/obj/arm64-v8a
    fi

    cp -rf ./android/ijkplayer/ijkplayer-arm64/src/main/obj/local/arm64-v8a/*.so ./packages/obj/arm64-v8a
    cp -rf ./android/ijkplayer/ijkplayer-arm64/src/main/libs/arm64-v8a/*.so ./packages/libs/arm64-v8a

    if [ ! -d "./packages/libs/x86" ]; then
        mkdir ./packages/libs/x86
    fi

    if [ ! -d "./packages/obj/x86" ]; then
        mkdir ./packages/obj/x86
    fi

    cp -rf ./android/ijkplayer/ijkplayer-x86/src/main/obj/local/x86/*.so ./packages/obj/x86
    cp -rf ./android/ijkplayer/ijkplayer-x86/src/main/libs/x86/*.so ./packages/libs/x86

    if [ ! -d "./packages/libs/x86_64" ]; then
        mkdir ./packages/libs/x86_64
    fi

    if [ ! -d "./packages/obj/x86_64" ]; then
        mkdir ./packages/obj/x86_64
    fi

    cp -rf ./android/ijkplayer/ijkplayer-x86_64/src/main/obj/local/x86_64/*.so ./packages/obj/x86_64
    cp -rf ./android/ijkplayer/ijkplayer-x86_64/src/main/libs/x86_64/*.so ./packages/libs/x86_64
}

compile_openssl
compile_ffmpeg
compile_ijkplayer
copy_function
上一篇下一篇

猜你喜欢

热点阅读