在通过多次的尝试和多方查资料后,最终成功的编译了ijkplayer,并且添加了自己想要的mp2的音频编码。一开始的时候以为是一件比较难的事情,最后编译成功后,还是觉得比较的简单。
编译环境: 系统 ubuntu ,ndk 14 ,sdk ,git , yasm
我只在ubuntu的环境下编译,并没有在其他的环境下进行尝试,在环境中,最重要的是ndk的版本,需要在10 -14之间,我用了18 ,19 ,都失败,并且最低的ndk版本也是需要10以上。
这里是ndk旧版的下载地址,可以下载ndk14的版本:ndk旧版下载地址
将下载后的ndk解压到某个路径下,可以选择配置sdk和ndk的环境变量,也可以选择在我们编译ijkplayer的时候,需要用到的init-android.sh ,compile-ffmpeg.sh ,compile-ijk.sh ,的头部添加sdk和ndk的环境配置。
例如我们的sdk和ndk的环境变量配置为如下:
export ANDROID_SDK=/***/***/***/android/sdk
export PATH=$ANDROID_SDK/platform-tools:$PATH
export PATH=$ANDROID_SDK/tools:$PATH
export ANDROID_NDK=/***/***/***/android/ndk14/android-ndk-r14b
export PATH=$ANDROID_NDK:$PATH
然后可以在compile-ffmpeg.sh中做如下的添加
这样在编译的时候,就会自动的找到sdk和ndk的位置。
git 和 yasm的安装可以通过如下方式
sudo apt-get install git
sudo apt-get install yasm
接下来是正题。这里是github中的ijkplayer的项目的地址 ijkplayer项目地址,在编译或是使用的过程中遇到的问题,都可以在这项目中的issues中查询。
以下是官方提供的编译的流程,我也是通过这个流程并且编译成功。
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
cd ijkplayer-android
git checkout -B latest k0.8.8
./init-android.sh
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
cd ..
./compile-ijk.sh all
通常这样编译就已经可以了,但是当我们想要兼容更多的视频格式或是音频的格式的时候,我们就需要修改 ijkplayer-android/config 下的文件。在这个路径下有4个文件。一下是官方提供的。
#如果想要最多的类型,用module-default.sh,生成module.sh
cd config
rm module.sh
ln -s module-default.sh module.sh
cd ..
cd android/contrib
sh compile-ffmpeg.sh clean
#如果你不想要编译出来的文件太大,想要兼容少的播放格式,可以用module-lite-hevc.sh生成module.sh
cd config
rm module.sh
ln -s module-lite-hevc.sh module.sh
cd ..
cd android/contrib
sh compile-ffmpeg.sh clean
#如果你想要最少的兼容,可以用module-lite.sh生成module.sh(默认的编译使用方式)
cd config
rm module.sh
ln -s module-lite.sh module.sh
cd ..
cd android/contrib
sh compile-ffmpeg.sh clean
需要注意的是module-default.sh ,和module-lite-hevc.sh 如果你要使用这两种方式,需要在这两个文件的最后面加入以下内容,否则会报错
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"
如果,我们想要加入更多的编码的格式,就需要在生成module.sh文件后,在module.sh 文件中添加相应格式配置,如我想要的是 mp2和mpeg4和ac3,我需要在module.sh中添加如下配置。
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mpeg4"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mp2*"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=ac3"
所以,总的编译的流程是
1: git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
2: cd ijkplayer-android
3: git checkout -B latest k0.8.8
4: (如果要添加新的编码,在这个步骤生成并修改module.sh文件)
5: ./init-android.sh
6: cd android/contrib
7: ./compile-ffmpeg.sh clean
8: ./compile-ffmpeg.sh all
9: cd ..
10: ./compile-ijk.sh all
在编译成功后的项目打开,还是需要修改一些问题,才能运行起来,如下是我总结的几个问题。
1.build.gradle 文件中的 compile 改为api all32Compile 改为 all32Implementation
2.demo中有个xml文件有问题多了一个@,编译的时候会报错,修改下就可以了
3项目中的build.gradle的 google() 方法要考到allprojects-》repositories中
4.项目中的 compileSdkVersion = 27
buildToolsVersion = "27.0.3" 25.0.3 要改成27.0.3版本
5.在项目ijkplayer-example的build.gradle 的 defaultConfig 中添加flavorDimensions "versionCode"
最后,如果你想要导入一整个自己编译后的项目,可以将你想要用到的so库如ijkplayer-armv7a libs中的文件拷到ijkplayer-java下新建的libs中,然后通过下面的步骤生成aar,集成到自己的项目中。
第二种方式是:
在你的项目中引入
api 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
然后把你编译的项目中的ijkplayer-arm64 和ijkplayer-armv7a 中的lib中的so库拷到你的项目中即可。到此就结束了。