产品文档 回放技术文档 Android 回放core 2.0

Android回放Core SDK2.0集成文档

changeLog

简介

百家云Android点播回放core sdk2.0是一个集点播和回放于一体的无UI纯实现的代码集,点播功能包括在线视频、离线下载、离线播放, 底层采用ijkplayer。回放功能依赖点播播放器之外还包含PPT、聊天消息等模块,百分百还原直播场景,同时也支持离线下载和播放。您可以方便地添加到您自己的app当中。推荐使用Android Studio集成。

2.0将点播和回放SDK合并,如果需要1.x版本的文档请前往以下页面

1.x版本回放Core文档链接

功能描述

SDK支持Android4.1(api level 16)及以上

功能 描述
在线播放 支持百家云后台配置视频播放
离线播放 支持本地视频绝对路径,加密和不加密详见视频缓存模块
自定义界面 sdk仅提供原始界面,用户需参考UI SDK自定义实现
视频缓存 支持百家云后台配置视频的缓存功能

示例工程

竖屏
github链接:http://git.baijiashilian.com/open-android/VideoPlayer2.0Demo(apk在apk_bin目录下)

快速集成

参考点播集成

说明

回放模板依赖前述点播播放器,同时包含一套信令处理逻辑,通过暴露特定接口实现PPT翻页、聊天信息、画笔绘制、在线人员等模块。简言之,回放=点播播放器+信令逻辑=点播+ppt+聊天信息+在线人员信息。 回放的快速集成包含以下几个步骤:

初始化播放器

//创建默认播放器实例
IBJYVideoPlayer bjyVideoPlayer = VideoPlayerFactory.createDefaultVideoPlayer();
//播放器实例绑定BJYPlayerView
bjyVideoPlayer.bindPlayerView(playerView);

这部分可参看上述点播部分介绍,电梯直达

初始化回放房间信息

PBRoom是对回放房间的抽象接口,包含进房间、绑定播放器、暴露信令处理后的各种信息接口。
BJYPlayerSDK.newPlayBackRoom()提供了多个重载的实现,轻松获取多个场景下的回放房间PBRoom实例。
长期课的概念,长期课是拥有相同教室id的回放集合,长期课以sessioId来区分各个子课程。

  • 创建在线回放PBRoom

1、非长期课回放

PBRoom mRoom = BJYPlayerSDK.newPlayBackRoom(this, classId, classToken);

参数说明如下:

/**
  * 创建录播回放房间    在线回放
  * @param context    上下文
  * @param classId    教室id
  * @param token      token
  * @return
  */
public static PBRoom newPlayBackRoom(Context context, long classId, String token){
    return new PBRoomImpl(context, classId, token);
}

2、长期课回放

PBRoom mRoom = BJYPlayerSDK.newPlayBackRoom(this, classId, sessionId, classToken);

参数说明如下:

/**
  * 创建录播回放房间 -- 在线回放[长期房间,分段]
  * @param context   上下文
  * @param classId   教室 ID
  * @param sessionId 分段id
  * @param token     token
  * @return
  */
public static PBRoom newPlayBackRoom(Context context, long classId, long sessionId, String token) {
        return new PBRoomImpl(context, classId, sessionId, token);
    }
  • 创建离线回放PBRoom
/**
  * 创建回放房间 -- 离线回放, 直接传未解压的文件
  *
  * @param context        上下文
  * @param videoFilePath  视频文件
  * @param signalFilePath 离线信令包文件
  * @return
  */
public static PBRoom newPlayBackRoom(Context context, String videoFilePath, String signalFilePath) {
        return new PBRoomImpl(context, videoFilePath, signalFilePath);
    }

注册播放器状态回调

注册播放器回调同点播部分,可参考上述介绍,自行添加监听器,下面仅注册播放时间变化监听和播放器状态改变监听。

bjyVideoPlayer.addOnPlayingTimeChangeListener(new OnPlayingTimeChangeListener() {
            @Override
            public void onPlayingTimeChange(int currentTime, int duration) {
                debugFragment.setPlayerTime("当前时间:" + currentTime + ", 总时间:" + duration);
            }
        });
bjyVideoPlayer.addOnPlayerStatusChangeListener(new OnPlayerStatusChangeListener() {
            @Override
            public void onStatusChange(PlayerStatus status) {
                debugFragment.setPlayerStatus(status.name());
            }
        });

PBRoom绑定播放器实例

PBRoom通过持有IBJYVideoPlayer实例才能获取到播放器的各种状态回调

mRoom.bindPlayer(bjyVideoPlayer);

进房间并注册enterRoom回调

mRoom.enterRoom(new LPLaunchListener() {
                @Override
                public void onLaunchSteps(int step, int totalStep) {
                    // step:当前处于第几步  totalStep:总步数  step/totalStep即进房间进度百分比
                }

                @Override
                public void onLaunchError(LPError error) {
                    //进房间出错回调
                }

                @Override
                public void onLaunchSuccess(PBRoom room) {
                    //进房间成功回调
                }
            });

至此,回放流程已经全部完成

回放相关信令监听

绑定PPT

1)WhitebaordView简介
WhitebaordView继承自ImageView,实现PPT显示、画笔绘制、手势缩放。

2)初始化WhiteboardView
同样,这里有Java代码创建和xml声明两种方式,下面介绍xml的方式。

 <com.baijiayun.playback.ppt.WhiteboardView
            android:id="@+id/big_container"
            android:layout_width="match_parent"
            android:layout_height="200dp" />
WhiteboardView whiteboardView = findViewById(R.id.big_container);
//设置ppt背景色
whiteboardView.setBackgroundColor(ContextCompat.getColor(this, R.color.lp_ppt_bg));

3)绑定PBRoom

whiteboardView.attachPBRoom(mRoom);

获取聊天消息

disposable = mRoom.getChatVM().getObservableOfNotifyDataChange()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe((List<IMessageModel> iMessageModels) -> {
                        //返回当前时刻的聊天消息集合
                    messageAdapter.notifyDataSetChanged();
                });

获取在线人员

 onlineUserDisposable = mRoom.getOnlineUserVM().getObservableOfOnlineUser()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe((List<IUserModel> iUserModels) -> {
                        //这里返回当前在线人员集合
                    userAdapter.notifyDataSetChanged();
                });

退出房间

关闭回放页面,需要退出房间并释放资源

//回收PPT相关资源
whiteboardView.destroy();
if(mRoom != null){
    //退出房间
   mRoom.quitRoom();
}

下载

注意,点播和回放共用同个下载模块,请不要重复初始化DownloadMananger。

下载初始化

下载记录迁移Android 8.0兼容获取DownloadMananger设置缓存路径加载缓存记录设置下载清晰度匹配规则部分同点播,请直接参考点播

回放下载

playbackDisposable = downloadManager.newPlaybackDownloadTask("playback", roomId, sessionId, token, "extraInfo")
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(downloadTask -> adapter.notifyDataSetChanged(), throwable -> {
            throwable.printStackTrace();
            Toast.makeText(SimpleVideoDownloadActivity.this, throwable.getMessage(), Toast.LENGTH_LONG).show();
        });

参数说明:

 /**
     * @param fileName    文件名称
     * @param roomId      房间id
     * @param sessionId   长期房间id,如果不是长期房间传0即可
     * @param token       房间token
     * @param extraInfo   额外信息,客户自己存储的字符串信息,sdk只是转存
     * @param
     */
    public Observable<DownloadTask> newPlaybackDownloadTask(final String fileName, final long roomId, final long sessionId, final String token, final String extraInfo)

其它重装方法的参数说明如下:

/**
     * 创建回放下载任务
     * @param fileName    文件名称
     * @param roomId      房间id
     * @param sessionId   长期房间id,如果不是长期房间传0的值即可
     * @param token       房间token
     * @param extraInfo   额外信息,客户自己存储的字符串信息,sdk只是转存
     * @param isEncrypt   加密参数,true为加密 (仅对当前下载有效)
     * @return
     */
    public Observable<DownloadTask> newPlaybackDownloadTask(String fileName, long roomId, long sessionId, String token, String extraInfo, boolean isEncrypt){
        return newPlaybackDownloadTask(fileName, roomId, sessionId, token, extraInfo, isEncrypt, preferredDefinitionList);
    }
 /**
     * 创建回放下载任务
     * @param fileName        文件名称
     * @param roomId          房间id
     * @param sessionId       长期房间id,如果不是长期房间传0的值即可
     * @param token           房间token
     * @param extraInfo       额外信息,客户自己存储的字符串信息,sdk只是转存
     * @param isEncrypt       加密参数,true为加密(仅对当前下载有效)
     * @param definitionList  清晰度优先列表,从前往后匹配(仅对当前下载有效)
     * @return
     */
    public Observable<DownloadTask> newPlaybackDownloadTask(final String fileName, final long roomId, final long sessionId, final String token,
                                                            final String extraInfo, boolean isEncrypt, List<VideoDefinition> definitionList)

下载状态回调

直接参考点播

DownloadTask接口清单

直接参考点播

DownloadModel字段说明

直接参考点播

错误码

错误码 说明
-10000 ijkplayer内部错误,比如文件异常
-1 无网络连接
-2 移动网络播放
5101、5102、5103 token异常
403 视频地址过期

注:ijkplayer没有给出具体错误码,详见源码的头文件ijkplayer_ android_def.h
其余错误码可参考AndroidSDK的MediaPlayer(需科学上网)

常见问题

1)为什么播本地视频总是提示-10000错误?
-10000错误码为ijkplayer底层报出的错误,请检查本地文件是否为合法视频文件,尝试使用系统播放器能不能正常播放。
2)为什么我集成之后播放视频一直在loading,没有播放出来?
首先检查网络连接是否正常,再者视频渲染采用surfaceview,初始化需要一定的时间,可在调用播放视频方法的时候尝试加入500ms左右延时。
3)为什么一直提示我token解析失败?
一个视频id对应一个token,token是百家云后台生成的,您可以联系后台开发人员确定token是否是正确的,再者查看初始化播放器的时候部署环境是否为在线环境。
4)播放器提示-10000,什么原因导致?
播放器报-10000错误码,可能出现的原因比较多,比如connect timeout IO Error等都会导致播放器提示-10000。这种情况下重试播放即可恢复正常。
5)为什么某些机器上音视频不同步?
请确认同时引入armeabi-v7a和armeabi两种so库。