# 播放器 Android SDK

# 简介

SDK 支持播放视频、音频、Word/PDF文档、静态PPT4种类型的资源播放。其中,视频中支持倍速播放、切换清晰度,水印、指纹等基本视频播放功能

# 开发环境要求

  • Java 1.8
  • Android Studio 3.4.2 及以上
  • 最低支持Android 4.3 运行环境

# 快速集成

在工程根目录下build.gradle中添加以下引用地址:

maven {
    url "https://raw.github.com/codeages/maven/master/"
}

在libraray的build.gradle中添加Java 1.8:

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

在libraray的build.gradle中添加gradle依赖:

implementation 'com.edusoho.cloud:player:1.0.4-SNAPSHOT'

# 混淆

-keep class com.edusoho.cloud.** { *; }

-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
    long producerIndex;
    long consumerIndex;
}

# 开发指南

# Layout布局中插入播放器

    <com.edusoho.cloud.player.view.ResourcePlayer
        android:id="@+id/player"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

# 实例化播放器

ResourcePlayer resourcePlayer = findViewById(R.id.player);
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)                 //设置资源
                    .setToken(token)                        //设置token
                    .setRememberLastPos(true)                //设置是否跳转至上次观看位置继续
                    .setInitPos(59)                         //设置资源播放的初始位置
                    .setDefinition(ResourceDefinition.SHD)  //设置播放器初始化清晰度
                    .addPlayerEventListener(mPlayerEventListener)  //设置播放器回调事件
                    .build();
resourcePlayer.load(param);

# PlayerParam 通用参数

# setResNo(String resNo)

  • 类型:String
  • 必填:是
  • 描述:设置云资源唯一编号。
  • 用法:
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .build();
resourcePlayer.load(param);

# setToken(String token)

  • 类型:String
  • 必填:否,1.在线播放必须;2.离线播放可不设置。
  • 描述:设置云资源播放令牌。
  • 用法:
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .build();
resourcePlayer.load(param);

# setRememberLastPos(boolean rememberLastPos)

  • 类型:boolean
  • 必填:否
  • 描述:设置是否跳转至上次观看位置继续。
  • 用法:
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .setRememberLastPos(rememberLastPos)
                           .build();
resourcePlayer.load(param);

# setInitPos(int initPos)

  • 类型:int
  • 必填:否
  • 描述:设置资源播放的初始位置,如:ppt 的第三页,云文档的第 3 页,云视频的第 3 秒。
  • 备注:如setRememberLastPos和setInitPos同时设置,此时setRememberLastPos无效。
  • 用法:
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .setInitPos(initPos)
                           .build();
resourcePlayer.load(param);

# PlayerParam 视频参数

# setDefinition(ResourceDefinition resourceDefinition)

  • 参数:ResourceDefinition,详见参数说明
  • 必填:否
  • 描述:设置默认视频播放时的清晰度,如未找到指定清晰度,则按低一级清晰度播放。
  • 用法:
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .setDefinition(ResourceDefinition.SHD)
                           .build();
resourcePlayer.load(param);

# setWatermarkUrl(String url)

  • 参数:url,水印地址
  • 必填:否
  • 描述:设置播放器水印
  • 用法:
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .setWatermarkUrl(url)
                           .build();

# setWatermarkDrawable(Drawable drawable, int width, int height, WatermarkLocation location)

  • 参数:水印Drawable
  • 必填:否
  • 描述:设置播放器水印。
  • 用法:
  • 说明:如果播放器同时设置了setWatermarkDrawable和setWatermarkUrl,则setWatermarkDrawable会失效
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .setWatermark(drawable)
                           .build();

# setWatermarkWidth(int width)

  • 参数:width宽度
  • 必填:否,默认200
  • 描述:设置播放器水印宽度。
  • 用法:
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .setWatermarkWidth(200)
                           .build();

# setWatermarkHeight(int height)

  • 参数:height高度
  • 必填:否,默认80
  • 描述:设置播放器水印高度。
  • 用法:
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .setWatermarkHeight(200)
                           .build();

# setWatermarkLocation(WatermarkLocation location)

  • 参数:location,详见参数说明。
  • 必填:否,默认左下
  • 描述:设置播放器水印位置。
  • 用法:
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .setWatermarkLocation(WatermarkLocation.TOP_RIGHT)
                           .build();

# setFingerprint(String fingerprint, int showUpTimes)

  • 类型:String fingerprint,int showUpTimes(毫秒)。
  • 必填:否
  • 描述:设置播放器指纹,播放器指纹是随机显示在播放器上的一段文字fingerprint,间隔是10s~20s随机,开发者可以设置每次停留在播放器的时间showUpTimes(毫秒)。
  • 用法:
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .setFingerprint("your fingerprint", 2*1000)
                           .build();

# 播放器基本方法

基本方法是所有资源类型通用的方法。

# load(PlayerParam param)

  • 类型:PlayerParam,详见参数说明。
  • 描述:播放器加载资源。
  • 用法:
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .build();
resourcePlayer.load(param);

# 按时间单位播放的资源方法

以下方法适用于视频、音频等按时间单位播放的资源类型。

# play()

  • 描述:开始播放,一般用于pause之后。
  • 用法:
resourcePlayer.play();

# pause()

  • 描述:音视频暂停。
  • 用法:
resourcePlayer.pause();

# isPlaying()

  • 描述:播放器是否正在播放。
  • 用法:
resourcePlayer.isPlaying();

# seekTo(int position)

  • 参数:position,秒。
  • 描述:音视频跳转到 XX 时间点。
  • 用法:
// 跳转到播放器的第10秒时间点
resourcePlayer.seekTo(10);

# setSpeed(float speed)

  • 参数:speed,播放倍数。
  • 描述:音视频跳转到 XX 时间点。
  • 用法:
//设置播放器1.5倍速度播放
resourcePlayer.setSpeed(1.5f));

# getCurrentPosition

  • 描述:获取音视频当前时间点。
  • 返回:当前播放时间点,单位:秒。
  • 用法:
resourcePlayer.getCurrentPosition();

# getBufferedPosition

  • 描述:获取音视频获取缓冲位置。
  • 返回:播放缓冲时间点,单位:秒。
  • 用法:
resourcePlayer.getBufferedPosition();

# getDuration

  • 描述:获取音视频时间总长度。
  • 返回:总时长,单位:秒。
  • 用法:
resourcePlayer.getDuration();

# switchPlaylist

  • 描述:支持视频资源切换音频,音频切回视频。
  • 返回:void
  • 用法:
resourcePlayer.switchPlaylist();

# switchDefinition

  • 参数:ResourceDefinition,详见参数说明。
  • 描述:视频清晰度切换,如未找到指定清晰度,则按低一级清晰度播放。
  • 返回:void
  • 用法:
resourcePlayer.switchDefinition(ResourceDefinition.SHD);

# 按页播放的资源方法

以下方法适用于Word/PDF文档、静态PPT、动画PPT等以页为单位播放的资源类型。

# prevPage()

  • 描述:下一页
  • 用法:
resourcePlayer.prevPage();

# nextPage()

  • 描述:上一页
  • 用法:
resourcePlayer.nextPage();

# setCurrentPage(int page)

  • 参数:page
  • 描述:设置当前播放页
  • 用法:
resourcePlayer.setCurrentPage(5);

# 4.8 播放器通用回调事件

# onPrepared

通用回调,适用于所有资源类型。

  • 参数:metas,所有资源相关的数据
  • 描述:播放器加载资源完成,回调事件。
  • 用法:
PlayerEventListener mPlayerEventListener = new PlayerEventListener() {

    @Override
    public void onPrepared(String metas) {
        // do something
    }
};
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .addPlayerEventListener(mPlayerEventListener)
                           .build();
resourcePlayer.load(param);

# onError

通用回调,适用于所有资源类型。

  • 参数:ResourceError,错误类型,详见参数说明。
  • 描述:请求资源出错
  • 用法:
PlayerEventListener mPlayerEventListener = new PlayerEventListener() {

    @Override
    public void onError(ResourceError error) {
        Log.e("qiqiuyun-player", "Error Code: " + error.getCode());
        Log.e("qiqiuyun-player", "Error Message: " + error.getMessage());
        Log.e("qiqiuyun-player", "Error TraceId: " + error.getTraceId());
    }
};
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .addPlayerEventListener(mPlayerEventListener)
                           .build();
resourcePlayer.load(param);

# 按时间播放资源类型回调事件

# #onVideoPrepared

仅用于视频资源

  • 参数:List<ResourceDefinition>,清晰度列表。
  • 描述:视频资源加载成功以后,回调返回resources为视频清晰度列表。获取资源的清晰度。
  • 用法:
PlayerEventListener mPlayerEventListener = new PlayerEventListener() {

    @Override
    public void onVideoPrepared(List<ResourceDefinition> resources) {
        // do something
    }
};
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .addPlayerEventListener(mPlayerEventListener)
                           .build();
resourcePlayer.load(param);

# onSwitchPlaylistPrepared

仅用于视频资源,视频转音频功能中使用

  • 参数:playlistType, 当前切换的音视频类型。
  • 描述:视频转音频以后,回调返回参数:playlistType,切换后的音视频类型。
  • 用法:
PlayerEventListener mPlayerEventListener = new PlayerEventListener() {

    @Override
    public void onSwitchPlaylistPrepared(String playlistType) {
        // do something
    }
};
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .addPlayerEventListener(mPlayerEventListener)
                           .build();
resourcePlayer.load(param);

# onPlayerStateChanged

仅用于音、视频资源

  • 参数playWhenReady:true 表示播放器准初始化完成,反之亦然

  • 参数playbackState:播放器播放状态,目前支持4种状态:

    • STATE_IDLE:播放器空闲。
    • STATE_BUFFERING:播放器缓冲。
    • STATE_READY:播放器准备播放,如果设置了position就从设置的开始播放。
    • STATE_ENDED:播放结束。
  • 描述:播放音、视频资源时,播放器状态改变回调,开发者可以针对这些播放器状态处理自己的业务。

  • 用法:

PlayerEventListener mPlayerEventListener = new PlayerEventListener() {

    @Override
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
        switch (playbackState) {
            case PlayerState.STATE_IDLE:
                // do something
                break;
            case PlayerState.STATE_BUFFERING:
                // do something
                break;
            case PlayerState.STATE_READY:
                // do something
                break;
            case PlayerState.STATE_ENDED:
                // do something
                break;
        }
    }
};
PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .addPlayerEventListener(mPlayerEventListener)
                           .build();
resourcePlayer.load(param);

# 按页播放资源类型回调事件

# onPageChanged(int page, int total)

仅用于按页播放的资源事件

  • 参数:page,当前页;total,总页数。
  • 描述:资源页面改变时回调。
  • 用法:
PlayerEventListener mPlayerEventListener = new PlayerEventListener() {

    @Override
    public void onPageChanged(int page, int total) {
        // do something
    }
};

PlayerParam.Builder builder = new PlayerParam.Builder();
PlayerParam param = builder.setResNo(resNo)
                           .setToken(token)
                           .addPlayerEventListener(mPlayerEventListener)
                           .build();
resourcePlayer.load(param);

# 参数说明

# WatermarkLocation 水印位置

public enum WatermarkLocation {
    TOP_LEFT,     //左上
    TOP_RIGHT,    //右上
    BOTTOM_LEFT,  //左下
    BOTTOM_RIGHT//右下
}

# ResourceDefinition 视频清晰度

public enum ResourceDefinition {
    SHD,  //标清
    HD,   //高清
    SD    //超清
}

# ResourceError 错误信息

public class ResourceError {
    int    code;
    String message;
    String traceId;
}