zoukankan      html  css  js  c++  java
  • ijkplayer之.so文件编译过程

    本文转载:ijkplayer编译so库真没那么难

     

    1.如何使用ijkplayer

    官方https://github.com/Bilibili/ijkplayer

    build.gradle添加下述依赖引用即可:

    dependencies {     # 对于大部分的设备来说已经够用了     compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4'     compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'      # Other ABIs: 可选     compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.4'     compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.4'     compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.4'     compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.4'      # ExoPlayer as IMediaPlayer: optional, experimental     compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.4' }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这里简单说点东西来解除你可能存在的一些疑惑:

    armv7aarmv5arm64x86x86_64 这些是对应的CPU架构, 
    一般来说准备一个armv7a就基本够了,如果系统找不到CPU架构 
    对应的so库会去找armeabi,多依赖一些架构只是稍微会快一点, 
    但是这样也伴随着apk体积的增大,这个需要你自行去权衡!!! 
    反正笔者就只有一个:armv7a,暂时没发现什么不服!

    然后使用方法和MediaPlayer大同小异,这就不另外讲述怎么 
    使用了,网上一搜也很多。接下来要说下笔者遇到的一个问题:

    ijkplayer默认不支持HTTPS

    是的,不支持,如果你尝试使用ijkplayer播放Https开头的音频,会报这样的错误:

    除了去编译ijkplayer的源码,没有其他选择,编译这玩意可把我 
    坑惨了,各种不懂,碰壁,不过最后所幸还是捣鼓成功了,顺道 
    记录下,方便后来者(顺道吐槽下网上各种抄的文章,搜到的基本 
    都是一样的…)


    2.编译支持Https的ijkplayer

    不要问我Windows上怎么编译,反正我只会Ubuntu和MAC上编译! 
    笔者在Ubuntu 14.04 和 MAC OS 10.13 上都编译成功了, 
    在使用Ubuntu编译的时候有个坑要注意:

    不要把项目克隆到外部硬盘,比如我电脑120G的SSD 
    还挂了一个1T的机械硬盘,一开始就clone到机械硬盘上了,然后编译 
    一堆问题,什么ln无法建立链接,chmod命令无效之类的,没把我给毒死, 
    后面clone到SSD 上一点毛病也没有,全程绿灯!


    • Step 1安装Git与yasm
    sudo apt-get install git sudo apt-get install yasm
    • 1
    • 2

    • Step 2:下载,配置SDK与NDK

    sdk就不说了,你开发安卓肯定会有的,NDK一般是不默认下载的, 
    这里也不建议你使用SDK Manager下载的NDK,之前试过有些许问题, 
    建议去官网下载:https://developer.android.google.cn/ndk/downloads/index.html 
    NDK的最小版本支持是10e,目前不支持NDK 15!

    接着是配置环境变量:

    Ubuntu

    设置修改下:.bashrc文件,把SDK和NDK配置上:

    然后source .bashrc,键入ndk-build -v 看有没有东西输出 
    验证配置是否生效。

    MAC

    打开终端,cd到根目录(cd ~),然后新建一个.bash_profile的文件: 
    进行如下配置

    然后输入source .bash_profile,键入ndk-build -v 验证:


    • Step 3:拉取ijkplayer源码
    git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android cd ijkplayer-android git checkout -B latest k0.8.4
    • 1
    • 2
    • 3

    • Step 4:初始化android
    ./init-android.sh
    • 1

    • Step 5:编译脚本配置

    就是自动化编译时的一些配置选项,比如支持什么协议啊,支持什么音视频类型等, 
    这个配置文件是:config/module.sh,你喜欢可以打开看看这个文件: 
    比如这里是配置处理什么类型的数据的,enable启用,disable禁用。

    另外官方给我们提供了三个模板给我们使用:

    module-default.sh:默认,如果你喜欢更多类型可以用这个; 
    module-lite-hevc.sh:如果您更喜欢较小的二进制大小的编解码器/格式(包括hevc功能) 
    module-lite.sh:如果您更喜欢较小的二进制大小的编解码器/格式(默认情况下)

    反正体积最小,就用module-lite.sh这个就行了,使用也很简单:

    rm module.sh ln -s module-lite.sh module.sh source module.sh
    • 1
    • 2
    • 3

    到此你还可以打开module.sh自行进行修改,比如我只想它支持mp3, 
    其他格式都不支持,那么可以把不想支持的格式的enable改成disable。


    • Step 6:初始化android支持Https
    cd .. ./init-android-openssl.sh
    • 1
    • 2

    注:如果出现NDK或者SDK找不到,可以执行一下source ~/.bash_profile


    • Step 7:清除一波
    cd android/contrib ./compile-openssl.sh clean ./compile-ffmpeg.sh clean
    • 1
    • 2
    • 3

    • Step 8:编译openssl
    ./compile-openssl.sh all
    • 1

    • Step 9:编译ffmpeg

    这里的话看你需要,如果想编译所有版本的so库,就跟all,如果是特定 
    CPU架构就跟cpu架构,比如:./compile-ffmpeg.sh armv7a 
    编译特定需要的肯定是比全部耗时短~

    ./compile-ffmpeg.sh all
    • 1

    • Step 10:编译ijkplayer

    加all默认编译所有架构的so库,不加默认只编译armv7a架构

    ./compile-ijk.sh all
    • 1

    编译需要漫长的等待,编译成功后,会在目录下生成一个ijkplayer的工程:

    到此,编译一个支持HTTPS的ijkplayer就完成了,接着是怎么用这个东西啦:

    再吐槽一句:网上很多教编译的,到此就完了,完全不跟别人说怎么用, 
    我一开始以为只要把so库放到自己项目的libs下就可以了,结果各种编译 
    报错,我真服了,大佬们写文章别虎头蛇尾啊!!!

    最简单的使用方法,就是把这个项目当成一个library导入到项目中, 
    就是build.gradle里多一个compile project(‘:ijkplayer’), 
    然后你就可以用了,记得把你之前写的:

    compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4' compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
    • 1
    • 2

    这些依赖删掉,不然还是会报不支持HTTPS的! 
    一般到这里引用到项目里就够了,但是小猪不是个容易满足的人! 
    所以有了下面的折腾!


    3.删减无关东西,生成aar依赖库

    觉得又很多无关的东西,说下小猪的期望吧:

    • 1.只是用来播放音乐(exo和example部分可以去掉);
    • 2.只需要armv7a架构的(删除其他架构,并把armv7a的so库放到ijkplayer-java);
    • 3.最后只保留一个ijkplayer-java,导出成ijkplayer.aar文件供自己的项目使用;

    接着一步步来把实现小猪的期望吧:


    • Step 1:右键项目 Open Module Settings,点击减号把除了ijkplayer-example 
      和ijkplayer-java的依赖都删除:

    接着打开ijkplayer-java/src/main/,新建一个libs文件夹, 
    同时打开ijkplayer-armv7a/main/libs,把里面的armeabi-v7a文件 
    夹整个拷到ijkplayer-java的libs文件夹下。

    然后可以把除了ijkplayer-example和ijkplayer-java的其他都删掉了, 
    接着修改下ijkplayer-java的build.gradle文件,删掉最后一句,以及 
    修改下版本信息。

    接着编译一波整个工程,运行下,点开simple,随便点首歌看看能否播放, 
    如果可以正常播放,那么就进入下一步了,导出aar库。


    • Step 2:编译aar库

    这个倒是简单,点击右侧gradle,依次打开,右键run就好

    执行完毕,会在build/outputs/aar目录下生成aar文件。


    • Step 3:把aar文件添加到项目中

    这个也很简单,直接丢到app的libs文件夹下,然后build.gradle 
    下添加依赖,(笔者直接把ijkplayer-java-release.aar改名成 
    ijkplayer.aar)

    implementation(name: 'ijkplayer', ext: 'aar')
    • 1

    接着,项目里写个简单的播放音乐的代码试试水,按钮点击播放一个音乐:

    public class MusicPlayActivity extends AppCompatActivity {     @Override     protected void onCreate(@Nullable Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_music_play);         Button btn = findViewById(R.id.button);         btn.setOnClickListener(v -> {             IjkMediaPlayer player = new IjkMediaPlayer();             player.setAudioStreamType(AudioManager.STREAM_MUSIC);             player.setScreenOnWhilePlaying(true);             player.setOnPreparedListener(IMediaPlayer::start);             try {                 player.setDataSource("https:xxxx.mp3");                 player.prepareAsync();             } catch (IOException e) {                 e.printStackTrace();             }         });     } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    如果播放正常的话,说明我们的移植非常成功,如果你没有用模块化, 
    到此就可以结束了,如果你像我一样用了模块化,而且还把音频播放 
    独立成了一个模块,app -> 音频播放模块 -> ijkplayer.aar, 
    恭喜你,编译直接报错,找不到aar,2333!解决方法的话,你要 
    接着看下面的啦~


    4.模块化,模块使用aar找不到问题解决

    需要修改三个build.gradle文件,依次是音频播放模块,app,以及application层级

    音频播放模块的build.gradle

    app层级的build.gradle:

    application层级的build.gradle

    接着build一波项目,就可以啦~


    小结

    耗时几天,总算是编译成功,而且收获颇多了,也懂了了一个道理: 
    人难免有畏难情绪,对于学习新的东西总会下意识的抗拒,觉得难, 
    但是大部分时候只是看上去难,当你去学了,并坚持一段时间,你 
    会发现,其实并没有你想象中那么难~

    最后附上缩减后的ijk-player和aar包,有需要的自取: 

    https://github.com/coder-pig/ijkplayer

  • 相关阅读:
    协程,纤程(Fiber),或者绿色线程(GreenThread)
    好用的 Chrome 插件
    内存泄露
    Serilog 是 ASP.NET Core 的一个插件,可以简化日志记录
    ES6-类(Class)
    规范-Git打标签与版本控制
    必会必知git
    Ubuntu 16.04安装CrossOver容器来安装QQ(终极解决办法,亲测有效)
    Ubuntu 16.04安装UML工具StarUML 2
    Ubuntu 16.04升级4.7.0内核后导致Compiz奔溃,问题:compiz[4852]: segfault at 48 ip 00007f88cae087f0 sp 00007ffce354c268 error 4 in libscale.so
  • 原文地址:https://www.cnblogs.com/awkflf11/p/9350167.html
Copyright © 2011-2022 走看看