侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 290 篇文章
  • 累计创建 57 个标签
  • 累计收到 98 条评论

ijkplayer SDK 播放器集成,了解远程maven依赖时支持的解码格式。

Z同学
2022-01-25 / 0 评论 / 1 点赞 / 418 阅读 / 2,630 字
温馨提示:
本文最后更新于 2022-01-25,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

在维护一个老项目的过程中,由于该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'
}

image-20220125164826250

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

image-20220125172201491

说明我们依赖的库,它的编码支持是依靠module-lite.sh文件中定义的配置决定的,我们通过查询该文件可以看到它所支持的协议: ./configure --list-protocols

image-20220125174913229

在该文件中 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的一些知识吧。

(如果觉得我写的内容稍微帮到了你,希望能关注一下我的公众号。谢谢!)

1

评论区