7 视频投屏
视频投屏功能用于将点播视频投放到大屏设备播放。旧点播 Android SDK 的投屏能力由 Demo 层提供,开发者可参考 Demo 中的投屏模块源码集成到自己的项目中。
7.1 适用版本与限制
- 点播 Android SDK 自
2.15.0起,投屏 SDK 转移到 Demo 层,开发者需要自行引入 Demo 中的投屏模块源码。 - Demo 自
2.24.2起,投屏功能服务替换为自研投屏服务。 - 本文示例以非加密视频投屏为主,旧版投屏文档中的加密视频投屏能力不在本文示例范围内。
- 开启防录屏能力后,投屏功能不可用。
- 投屏发送端和接收端需处于可互通的网络环境,接收端需支持对应的投屏能力。
7.2 集成投屏依赖
在项目的 build.gradle 中加入投屏依赖:
// 投屏 SDK
implementation "net.polyv.android:media-cast-adapter-rx:1.0.5"
7.3 引入 Demo 投屏源码
将 Demo 中 com/easefun/polyvsdk/cast 目录下的投屏相关源码引入项目。
// com/easefun/polyvsdk/cast
├── IPLVScreencastListener.java // 投屏播放状态监听器
├── PolyvAllCast.java // 自研投屏能力封装类
├── PolyvIUIUpdateListener.java // UI 状态回调监听器
├── PolyvScreencastManager.java // 投屏功能管理类
└── widget
├── PolyvScreencastSearchLayout.java // 搜索投屏设备的视图
└── PolyvScreencastStatusLayout.java // 投屏状态管理视图
其中,PolyvScreencastManager 是业务侧主要使用的投屏管理类,封装了设备搜索、投屏播放、播放控制和状态回调。
7.4 初始化投屏管理器
在播放页面中获取 PolyvScreencastManager 实例,并设置状态回调。
private PolyvScreencastManager screencastManager;
private void initScreencastManager() {
screencastManager = PolyvScreencastManager.getInstance(this);
screencastManager.setUIUpdateListener(new PolyvIUIUpdateListener() {
@Override
public void onUpdateState(int state, Object object) {
// 根据 state 更新设备搜索、播放状态、播放进度或错误提示
}
@Override
public void onUpdateText(String msg) {
// 展示投屏提示文案或错误信息
}
});
screencastManager.initService();
}
7.5 搜索投屏设备
调用 browse() 开始搜索设备。搜索结束后,可通过 getInfos() 获取当前扫描到的设备列表。
// 开始搜索设备
screencastManager.browse();
// 获取搜索到的设备列表
List<PLVMediaCastDevice> devices = screencastManager.getInfos();
搜索结果会通过 PolyvIUIUpdateListener#onUpdateState 回调返回。常用状态包括:
| 状态 | 说明 |
|---|---|
STATE_SEARCH_SUCCESS |
设备搜索成功 |
STATE_SEARCH_ERROR |
设备搜索失败 |
STATE_SEARCH_NO_RESULT |
未搜索到可用设备 |
7.6 发起投屏播放
从搜索结果中选择目标设备后,调用 playNetMedia(device, resource, startSeconds) 发起投屏播放。
// device:从 getInfos() 获取的投屏设备
// mediaResource:投屏播放资源,请按 Demo 中当前视频信息构建
// startSeconds:起播位置,单位为秒
screencastManager.playNetMedia(device, mediaResource, startSeconds);
发起投屏后,可通过 getConnectInfos() 获取当前连接中的投屏设备。
PLVMediaCastDevice currentDevice = screencastManager.getConnectInfos();
7.7 播放控制
投屏播放开始后,可在发送端控制接收端播放状态。
// 暂停
screencastManager.pause();
// 恢复播放
screencastManager.resume();
// 跳转到指定进度,单位为秒
screencastManager.seekTo(progress);
// 设置音量,范围 0~100
screencastManager.setVolume(percent);
// 增加音量
screencastManager.volumeUp();
// 减少音量
screencastManager.volumeDown();
// 停止投屏播放
screencastManager.stopPlay();
7.8 监听播放状态
投屏播放状态、播放进度和异常信息会通过 PolyvIUIUpdateListener#onUpdateState 返回。常用状态包括:
| 状态 | 说明 |
|---|---|
STATE_PLAY |
投屏播放中 |
STATE_PAUSE |
投屏已暂停 |
STATE_STOP |
投屏已停止 |
STATE_COMPLETION |
投屏播放完成 |
STATE_POSITION_UPDATE |
投屏播放进度更新,object 为当前进度 |
STATE_PLAY_ERROR |
投屏播放异常,object 为错误信息 |
STATE_LOADING |
投屏加载中 |
7.9 释放投屏资源
播放页面退出或不再使用投屏功能时,调用 release() 释放投屏资源。
@Override
protected void onDestroy() {
if (screencastManager != null) {
screencastManager.release();
}
super.onDestroy();
}
7.10 常见问题
开启防录屏后为什么不能投屏?
防录屏能力与投屏能力存在冲突。开启防录屏后,投屏功能不可用。
搜索不到投屏设备怎么办?
请确认发送端和接收端处于可互通的网络环境,并确认接收端支持对应投屏能力。若仍无法搜索到设备,可参考 Demo 中 PolyvScreencastSearchLayout 的设备搜索逻辑排查。
是否必须使用 Demo 的投屏 UI?
不是。Demo 提供了搜索设备视图和投屏状态视图,开发者可以直接复用,也可以根据业务 UI 自行实现。若自行实现 UI,建议保留 PolyvScreencastManager 的搜索、播放控制和状态回调逻辑。
