介绍
在维护一个老项目的过程中,由于该app里面集成的
ksvc/KSYMediaPlayer_Android: 金山云Android播放SDK
该项目,由于所有的源码并没有开源。都是封装之后的成品开源。
已经很多年没有更新维护了,使用的部分API已经被Android官方废弃了。
我们又无法修改代码,java都只是开源了个jar,并没有源码。
最终决定放弃改为ijkplayer
bilibili/ijkplayer: Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support. (github.com)
很多年以前弄过一次ijkplayer SDK, 这次是多年之后再次使用。我从头开始介绍一次自己的使用吧。
(PS:GitHub上 集成和使用文档比较少,也许是我没有找到吧。)
1. 直接依赖
如果希望尽快实现播放器功能,我们可以直接依赖ijkplayer提供的maven进行。
示例:
# 我们要依赖下面的库,需要先在Project 的build.gradle中添加 jcenter() 这个是仓库地址
allprojects {
repositories {
jcenter()
}
}
dependencies {
# 基本情况下,我们依赖java库和armv7a库就可以实现播放了
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
# 我们如果还依赖其他的库
compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'
# 这个是一个测试功能,用来对比exo播放器的。我们可以不用
compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'
}
如果出现jcenter() 访问过慢等问题。我们可以使用maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
替代jcenter()
.
详细的可以参考:Android Studio Maven 仓库切换到阿里云 (zinyan.com)
示例:
buildscript {
repositories {
// 添加阿里云 maven 地址
maven { url 'https://maven.aliyun.com/repository/public'}
// jcenter()
...
}
例如我们只需要arm64 和armv7a 平台的。
实际依赖效果如下。
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public'}
}
}
dependencies {
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
}
1.1 ijkplayer 默认编译支持哪些库?
我们如果直接使用ijkplayer自己编译的so文件,那么我们如何知道他们编译的版本支持什么格式呢?
当我们通过git拉取指定版本的标签的代码后:
例如我上面的0.8.8版本:
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
cd ijkplayer-android
git checkout -B latest k0.8.8 //切换到标签 k0.8.8目录下。
我们通过git代码,下载指定版本的分支后。访问config
文件夹下的module.sh
。可以看见它指向了module-lite.sh
说明我们依赖的库,它的编码支持是依靠module-lite.sh
文件中定义的配置决定的,我们通过查询该文件可以看到它所支持的协议: ./configure --list-protocols
在该文件中 disable 表示关闭,enable 表示开启。例如上面的例子中:
disable-protocol=rtp
:表示关闭rtp协议支持。
enable-protocol =rtmp
: 表示开启rtmp协议支持。
我们可以通过这个进行判断你所以依赖的库,支持什么样的版本信息。
2. 使用 ijkPlayer
在github中,并没有ijkplayer的使用Demo了。但是实际使用其实比较简单。
IjkMediaPlayer ijkMediaPlayer = new IjkMediaPlayer(); //创建一个播放器
ijkMediaPlayer.setSurface(this.surface); // 给它绑定一个surface 输出窗口
ijkMediaPlayer.setOnPreparedListener(onPreparedListener); //可选项- 播放器初始化状态
ijkMediaPlayer.setOnInfoListener(onInfoListener); //播放数据加载过程中的监听
ijkMediaPlayer.setOnErrorListener(onErrorListener); //错误状态的监听
ijkMediaPlayer.setDataSource(mVideoUrl); //提供数据
ijkMediaPlayer.prepareAsync(); //加载视频进行播放
我们如果是使用ijkplayer 提供的so 那么到这里就差不多了。
而如果我们自己编译就要自己填写依赖的so名称了。(如果你没有修改的话就可以不用)
今天的这个介绍比较简单,后面将会填充更多的关于ijkplayer SDK的一些知识吧。
(如果觉得我写的内容稍微帮到了你,希望能关注一下我的公众号。谢谢!)
评论区