前言

ijkplayer是一个基于FFmpeg的轻量级Android/iOS视频播放器。是一个很优秀的库,但是如果要使用它并不是那么的简单。首先要对ijkplayer进行编译后才能使用。因此下面将分享自己从编译到使用的整个过程,如果有错误欢迎在评论区指出!

一、下载并配置Ubuntu虚拟机

  1. 根据下面的安装教程,安装Ubuntu虚拟机

    温馨提示:在安装过程中为虚拟机分配磁盘大小时,最好选择40GB,自己刚开始选择了20GB,后来发现内存不够,然后对内存进行了扩容

    虚拟机安装Ubuntu 16.04.5 图解

  2. 如果幸运的话,按照教程就能打开虚拟机,但是我在最后却一直显示黑屏

    解决方法:搜索cmd命令,然后以管理员方式打开,输入netsh winsock reset(这个命令是重置网络规范,黑屏的原因很可能就是VMware软件跟本地网络规范有冲突),回车之后提示成功重置winsock目录,您必须重新启动计算机才能重新完成配置,重启后打开即可。

  3. 打开后发现屏幕不能全屏,解决方法就是安装VMware tools

在这里插入图片描述

  1. 安装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

  1. 下载

    • SDK:直接在android studio中文社区下载的,SDK下载传送门
    • NDK:NDK我试过下载了r21的,结果配置不成功,最后下载了android-ndk-r10e这一个版本(如果不是64位或者要其它版本的可以看文末的参考博客)。android-ndk-r10e传送门(Linux64位)
  2. 解压

    当下载之后,两个文件都位于Downloads文件夹下,我把他们都解压到了Home的新建文件夹setup中。

    • SDK:可以直接提取,因为是zip格式

    • NDK:由于是bin模式,所以需要首先对android-ndk-r10e-linux-x86_64.bin文件进行权限设置。设置权限设置可以直接对这个文件进行:右键->属性->允许作为程序可执行文件(打勾)。如下图所示:

在这里插入图片描述

接着执行终端命令:

./android-ndk-r10e-linux-x86_64.bin 
  1. 配置

    首先得打开配置文件

    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是否配置成功,出现下图则说明配置成功。

    在这里插入图片描述

    接着开始进行编译

三、编译

  1. 首先从github中下载ijkplayer,并拉取到ijkplayer-android的文件中。

    git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
    
  2. 首先选择ijkplayer-android文件在终端打开,然后进行在终端中输入./init-android.sh初始化,包括了把ffmpeg的代码拉取到本地等操作。

    友情提示:初始化的过程需要很久的时间

    在这里插入图片描述

./init-android.sh

​我在初始化中途中遇到了如下图的问题:
在这里插入图片描述

​ 原因其实就是git默认的缓存不足,因此需要通过下面的命令来扩大缓存

	git config --global http.postBuffer 200000000
  1. 如果要支持HTTPS,还得进行HTTPS的初始化
./init-android-openssl.sh
  1. 清除一波
cd android/contrib
./compile-openssl.sh clean
./compile-ffmpeg.sh clean

友情提示:下面的编译过程都很久,这时候可以去干点别的事

  1. 编译openssl
./compile-openssl.sh all
  1. 编译ffmpeg
./compile-ffmpeg.sh all
  1. 编译ijkplayer,这个编译需要回到上一级android文件上进行编译
cd android
./compile-ijk.sh all

​ 经过一段时间等待后,当编译成功后就会在ijkplayer-android中/android/ijkplayer的目录,如下:

在这里插入图片描述

四、移植到Windows中

  1. 确定你的虚拟机是否开启了文件共享,设置路径:虚拟机->设置->选项->共享文件夹,然后选择总是启用的按钮,最后需要重启虚拟机。
    在这里插入图片描述

  2. 接着对编译好的文件进行压缩,不然在复制文件的时候会弹出错误的弹窗。我是对整个ijkplayer-android进行了zip压缩。

  3. 接着就是复制粘贴,可以选择拖拽或者是ctrl+c,ctrl+v。

  4. 解压,得到ijkplayer-android文件

五、播放ijkplayer的sample

  1. 在Android Studio中打开ijkplayer-android\android\ijkplayer项目

  2. 首先更改项目中的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'    //根据自己的具体情况更改
    }
    
  3. 然后更改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')
    }
    
  4. 这时候你可以试着运行下,根据AS的报错信息进行修改,修改的地方其实就是每个模块下的build.gradle,需要将complie修改成implementation,下面只举一个ijkplayer-java的build.gradle

    ```java
    apply plugin: 'com.android.library'
    
    .......
    dependencies {
        //只需修改这个地方
        implementation fileTree(dir: 'libs', include: ['*.jar'])
    }
    
    apply from: new File(rootProject.projectDir, "tools/gradle-on-demand.gradle")
    ```
    
  5. 编译成功后,运行例子,例子如下(模拟器):

    在这里插入图片描述

  6. 点击Sample,然后点击其中一个例子

    在这里插入图片描述

在这里插入图片描述

六、项目中使用ijkplayer

直接按照下面的文章步骤走,这里我就不再多说了

Ijkplayer demo 基本使用

总结

整个过程下来花费了几天的时间,收获也很多,也很感谢前人的经验,让我少走了很多弯路。“世上无难事,只怕有心人”,自己真正尝试后也并没有想象中的那么难,最重要的就是勇敢的踏出第一步!

最后附上编译后的ijkplayer代码ijkplayer传送门

参考博客:

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐