ijkplayer的编译和使用
前言
ijkplayer是一个基于FFmpeg的轻量级Android/iOS视频播放器。是一个很优秀的库,但是如果要使用它并不是那么的简单。首先要对ijkplayer进行编译后才能使用。因此下面将分享自己从编译到使用的整个过程,如果有错误欢迎在评论区指出!
一、下载并配置Ubuntu虚拟机
-
根据下面的安装教程,安装Ubuntu虚拟机
温馨提示:在安装过程中为虚拟机分配磁盘大小时,最好选择40GB,自己刚开始选择了20GB,后来发现内存不够,然后对内存进行了扩容
-
如果幸运的话,按照教程就能打开虚拟机,但是我在最后却一直显示黑屏
解决方法:搜索cmd命令,然后以管理员方式打开,输入netsh winsock reset(这个命令是重置网络规范,黑屏的原因很可能就是VMware软件跟本地网络规范有冲突),回车之后提示成功重置winsock目录,您必须重新启动计算机才能重新完成配置,重启后打开即可。
-
打开后发现屏幕不能全屏,解决方法就是安装VMware tools
-
安装VMware tools,实现全屏。
当安装VMware tools后还可以进行Windows和Ubuntu进行文本的复制粘贴,这样对后续操作还是挺方便的
这里参考了网上的解决方法Ubuntu 16.04下安装VMware Tools(三行命令搞定)。具体做法:就是打开终端(在桌面鼠标右键就可以看到),然后依次输入下面的命令:
第一步的操作可能需要很久
- sudo apt-get upgrade
- sudo apt-get install open-vm-tools-desktop -y
- sudo reboot
输入后点击虚拟机的选项,如果变成了重新安装就表示安装成功了,如果不行的话就参考这个教程:Ubuntu下安装VMware Tools的详细过程
成功后点击查看,然后点击适应客户机或者全屏就可以实现全屏了
二、在Ubuntu上安装必要的东西
1.打开终端,在终端下载git和yasm
sudo apt-get install git
sudo apt-get install yasm
2.配置 SDK + NDK
-
下载
- SDK:直接在android studio中文社区下载的,SDK下载传送门
- NDK:NDK我试过下载了r21的,结果配置不成功,最后下载了android-ndk-r10e这一个版本(如果不是64位或者要其它版本的可以看文末的参考博客)。android-ndk-r10e传送门(Linux64位)
-
解压
当下载之后,两个文件都位于Downloads文件夹下,我把他们都解压到了Home的新建文件夹setup中。
-
SDK:可以直接提取,因为是zip格式
-
NDK:由于是bin模式,所以需要首先对android-ndk-r10e-linux-x86_64.bin文件进行权限设置。设置权限设置可以直接对这个文件进行:右键->属性->允许作为程序可执行文件(打勾)。如下图所示:
-
接着执行终端命令:
./android-ndk-r10e-linux-x86_64.bin
-
配置
首先得打开配置文件
sudo gedit /etc/profile
然后在profile文件的末尾加上下面的路径配置
jay是用户名,因为我这些解压文件都放到了Home的setup中,setup是我自己新建的文件夹
export ANDROID_NDK="/home/jay/setup/android-ndk-r10e/" export ANDROID_SDK="/home/jay/setup/android-sdk-linux/" export PATH=$PATH:$ANDROID_NDK
保存后使用
source /etc/profile
使其生效。然后可以用ndk-build -v
来检验NDK是否配置成功,出现下图则说明配置成功。接着开始进行编译
三、编译
-
首先从github中下载ijkplayer,并拉取到ijkplayer-android的文件中。
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
-
首先选择ijkplayer-android文件在终端打开,然后进行在终端中输入./init-android.sh初始化,包括了把ffmpeg的代码拉取到本地等操作。
友情提示:初始化的过程需要很久的时间
./init-android.sh
我在初始化中途中遇到了如下图的问题:
原因其实就是git默认的缓存不足,因此需要通过下面的命令来扩大缓存
git config --global http.postBuffer 200000000
- 如果要支持HTTPS,还得进行HTTPS的初始化
./init-android-openssl.sh
- 清除一波
cd android/contrib
./compile-openssl.sh clean
./compile-ffmpeg.sh clean
友情提示:下面的编译过程都很久,这时候可以去干点别的事
- 编译openssl
./compile-openssl.sh all
- 编译ffmpeg
./compile-ffmpeg.sh all
- 编译ijkplayer,这个编译需要回到上一级android文件上进行编译
cd android
./compile-ijk.sh all
经过一段时间等待后,当编译成功后就会在ijkplayer-android中/android/ijkplayer的目录,如下:
四、移植到Windows中
-
确定你的虚拟机是否开启了文件共享,设置路径:虚拟机->设置->选项->共享文件夹,然后选择总是启用的按钮,最后需要重启虚拟机。
-
接着对编译好的文件进行压缩,不然在复制文件的时候会弹出错误的弹窗。我是对整个ijkplayer-android进行了zip压缩。
-
接着就是复制粘贴,可以选择拖拽或者是ctrl+c,ctrl+v。
-
解压,得到ijkplayer-android文件
五、播放ijkplayer的sample
-
在Android Studio中打开ijkplayer-android\android\ijkplayer项目
-
首先更改项目中的build.gradle,可以根据自己AS的版本来进行更改
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { google() jcenter() } dependencies { //根据自己的具体情况更改 classpath 'com.android.tools.build:gradle:3.5.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() } } ext { compileSdkVersion = 28 //根据自己的具体情况更改 buildToolsVersion = "28.0.3" //根据自己的具体情况更改 targetSdkVersion = 28 //根据自己的具体情况更改 versionCode = 800800 versionName = "0.8.8" } wrapper { gradleVersion = '3.5.0' //根据自己的具体情况更改 }
-
然后更改ijkplayer-example中的build.gradle,主要讲complie修改成implementation,并且修改了下面重点关注注释的地方。这里需要重点关注下添加依赖的地方,如果是在电脑的模拟器运行的话需要ijkplayer-x86,如果是真机运行的话,就需要添加ijkplayer-armv7a。
apply plugin: 'com.android.application' android { ....... defaultConfig { applicationId "tv.danmaku.ijk.media.example" minSdkVersion 9 targetSdkVersion rootProject.ext.targetSdkVersion versionCode rootProject.ext.versionCode versionName rootProject.ext.versionName //重点关注 flavorDimensions "default" } ...... productFlavors { //重点关注 all32 { minSdkVersion 21 } all64 { minSdkVersion 21 } // armv5 {} // armv7a {} // arm64 { minSdkVersion 21 } // x86 {} } splits { abi { enable true reset() include 'x86', 'x86_64', 'armeabi-v7a', 'armeabi' universalApk false } } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:23.0.1' implementation 'com.android.support:preference-v7:23.0.1' implementation 'com.android.support:support-annotations:23.0.1' implementation 'com.squareup:otto:1.3.8' implementation project(':ijkplayer-java') implementation project(':ijkplayer-exo') //重点关注 //虚拟机 api project(':ijkplayer-x86') //真机 api project(':ijkplayer-armv7a') // compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8' // compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8' // all32Compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8' // all32Compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' // all32Compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8' // all64Compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8' // all64Compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' // all64Compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8' // all64Compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8' // all64Compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8' // armv5Compile project(':player-armv5') // armv7aCompile project(':player-armv7a') // arm64Compile project(':player-arm64') // x86Compile project(':player-x86') // x86_64Compile project(':player-x86_64') }
-
这时候你可以试着运行下,根据AS的报错信息进行修改,修改的地方其实就是每个模块下的build.gradle,需要将complie修改成implementation,下面只举一个ijkplayer-java的build.gradle
apply plugin: 'com.android.library' ....... dependencies { //只需修改这个地方 implementation fileTree(dir: 'libs', include: ['*.jar']) } apply from: new File(rootProject.projectDir, "tools/gradle-on-demand.gradle")
-
-
编译成功后,运行例子,例子如下(模拟器):
-
点击Sample,然后点击其中一个例子
六、项目中使用ijkplayer
直接按照下面的文章步骤走,这里我就不再多说了
总结
整个过程下来花费了几天的时间,收获也很多,也很感谢前人的经验,让我少走了很多弯路。“世上无难事,只怕有心人”,自己真正尝试后也并没有想象中的那么难,最重要的就是勇敢的踏出第一步!
最后附上编译后的ijkplayer代码ijkplayer传送门
参考博客: