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
这里简单说点东西来解除你可能存在的一些疑惑:
armv7a,armv5,arm64,x86,x86_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
转载于:https://www.cnblogs.com/awkflf11/p/9350167.html
ijkplayer之.so文件编译过程相关推荐
- Android P SELinux (二) 开机初始化与策略文件编译过程
Android P SELinux (一) 基础概念 Android P SELinux (二) 开机初始化与策略文件编译过程 Android P SELinux (三) 权限检查原理与调试 Andr ...
- 深入wepy源码:wpy文件编译过程
wepy 是腾讯开源的一款小程序框架,主要通过预编译的手段,让开发者采用类 Vue 风格开发. 让我们一起看看, wepy 是如何实现预编译的.先放上一张官网的流程图,后面的分析可以参考该图. wep ...
- iOS App 的编译过程
在 iOS 开发的过程中,Xcode 为我们提供了非常完善的编译能力,正常情况下,我们只需要 Command + R 就可以将应用运行到设备上,即使打包也是一个相对愉快的过程. 但正如我们写代码无法避 ...
- gcc编译c文件_Linux下C语言程序的编译过程
Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...
- MDK 的编译过程及文件类型全解
出处:MDK 的编译过程及文件类型全解 MDK 的编译过程及文件类型全解 ------(在arm9的开发中,这些东西都是我们自己搞定的,但是在windows上,IDE帮我们做好了,了解这些对深入开发是 ...
- python 利用pyinstaller 编译.exe文件过程中编写完的.exe文件执行过程中闪退
问题描述: python 利用pyinstaller 编译.exe文件过程中编写完的.exe文件执行过程中闪退,并提示no module named 'pyproj.datadir' 解决方法: 闪退 ...
- 编译过程中,termcap.h 文件找不到路径 licli.a终于生成
编译过程中,termcap.h 文件找不到路径 查看是linux 源码下找不到termcap.h文件 安装了所有关于*cap*的源码包也不起作用 今天终于解决了这个问题,搜termca ...
- GCC编译过程以及对应FILE文件表
gcc/g++在执行编译工作的时候,总共需要4步 (1).预处理:生成.i的文件[预处理器cpp] (2).编译:将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] (3).汇编:有汇编变 ...
- Linux系列学习(二) - Vim编辑器的介绍及使用、文件编译的过程、Makefile工具、Gdb调试器
目录 引言: 基本命令补充: cat命令: man命令: head命令: tail命令: find命令: grep命令: grep命令与管道"|" 的结合使用: ta ...
最新文章
- 机器智能公司一览图 | 36氪
- hadoop集群崩溃恢复记录
- spring mvc拦截器HandlerInterceptor
- 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案
- MySQL性能,杀疯了
- 李迟2021年4月知识总结
- 3.netwox网络工具集入门教程
- 验证码功能-简单实现
- 华硕服务器如何重装系统,讲解华硕重装系统教程
- iconfont(图标字体)
- mysql中的不等于
- 一维离散小波变换原理和代码实现
- 用 Python 快速追踪基金的收益情况(2022年4月更新) | Python财经实践
- airpods二代降噪吗_华强北 苹果二代三代 蓝牙耳机airpods。不跳电,真降噪。
- html标签360doc,360doc个人图书馆
- PAT甲级真题 1064 完全二叉搜索树
- 广域网技术——SR技术概括
- Linux查看系统资源信息
- 概率与期望——P1365 WJMZBMR打osu! / Easy
- Spimes x5.0主题模板全开源源码/Typecho主题模板
热门文章
- 【王道计组笔记】总线(4):总线操作和定时
- java jhap_Java-Live与JVAP工具的Max
- 计算机硬件密码,计算机硬件技术基础综合性实验任务书(08)密码门锁的模拟_C
- oracle 函数 结果集,Oracle 中函数如何返回结果集
- 【基础】基础算法学习笔记(状态空间)
- NYOJ113 - 字符串替换
- debian+gnu/linux+9,Steam for Debian GNU/Linux
- Delicious Apples
- 正则表达式(思维导图速查版)
- [leetcode双周赛]5311. 将数字变成 0 的操作次数