7 视频投屏
视频投屏功能用于将点播视频投放到大屏设备播放。旧点播 iOS SDK 的投屏能力由 Demo 层提供,开发者可参考 Demo 中的投屏模块源码集成到自己的项目中。
7.1 适用版本与限制
- 当前 Demo 已接入自研投屏 SDK,投屏依赖为
PLVDLNA。 - 投屏模块源码位于 Demo 的
PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/Cast目录。 - 当前 Demo 的投屏示例不支持加密视频投屏。播放加密视频时,投屏入口会提示加密视频不支持投屏。
- 开启防录屏
videoCaptureProtect=YES后,投屏模块默认不可用。 - 投屏发送端和接收端需处于可互通的网络环境,接收端需支持对应的投屏能力。
7.2 集成投屏依赖
在 Podfile 中加入投屏依赖:
# 投屏 SDK
pod 'PLVDLNA'
执行 pod install 后,重新打开工程。
7.3 引入 Demo 投屏源码
将 Demo 中 Classes/Cast 目录下的投屏相关源码引入项目。
Cast
├── PLVCastBusinessManager.h // 投屏业务管理器,封装投屏 UI 与 PLVCastManager 的调用
├── PLVCastBusinessManager.m
├── PLVCastManager.h // 投屏管理器,封装设备搜索、连接、播放控制和状态回调
├── PLVCastManager.m
├── PLVCastControllView.h // 投屏控制视图
├── PLVCastControllView.m
├── PLVCastServiceListView.h // 投屏设备选择列表视图
└── PLVCastServiceListView.m
若项目使用 Demo 中的播放器皮肤 PLVVodSkinPlayerController,可复用 Demo 内已封装的投屏按钮和交互逻辑。若项目使用自定义播放器 UI,可参考 PLVCastBusinessManager 和 PLVCastManager 自行对接投屏入口。
7.4 初始化投屏模块
在播放页面中引入投屏业务管理器:
#import "PLVCastBusinessManager.h"
声明投屏业务管理器:
@property (nonatomic, strong) PLVCastBusinessManager *castBM;
在播放器初始化完成后,初始化并启用投屏模块:
if ([PLVCastBusinessManager authorizationInfoIsLegal]) {
self.castBM = [[PLVCastBusinessManager alloc] initCastBusinessWithListPlaceholderView:self.view
player:self.player];
[self.castBM setup];
}
其中:
self.view为设备列表视图的父视图。self.player为点播播放器PLVVodPlayerViewController实例。authorizationInfoIsLegal当前用于兼容旧调用,PLVDLNA不需要额外配置 AppId 或 AppSecret。
7.5 显示投屏入口
若项目使用 PLVVodSkinPlayerController,可参考 Demo 中播放器皮肤的投屏按钮逻辑。PLVCastBusinessManager 会在 setup 中为播放器皮肤设置投屏按钮点击事件。
点击投屏按钮后,投屏模块会:
- 判断当前视频是否支持投屏。
- 展示设备列表视图。
- 在 Wi-Fi 可用时搜索投屏设备。
- 选择设备后发起投屏播放。
若项目使用自定义播放器 UI,可自行创建投屏按钮,并参考 PLVCastBusinessManager 中的按钮点击逻辑调用设备列表展示和设备搜索能力。
7.6 搜索并连接投屏设备
如需直接使用 PLVCastManager 对接自定义 UI,可通过以下方法搜索和连接设备。
// 开始搜索设备
[[PLVCastManager shareManager] startSearchService];
// 停止搜索设备
[[PLVCastManager shareManager] stopSearchService];
// 根据设备列表下标连接设备
PLVCastServiceModel *serviceModel = [[PLVCastManager shareManager] connectServiceWithIndex:index];
// 根据设备模型连接设备
[[PLVCastManager shareManager] connectServiceWithModel:serviceModel];
// 断开当前连接
[[PLVCastManager shareManager] disconnect];
设备搜索、连接结果会通过 PLVCastManagerDelegate 回调返回。
// 发现投屏设备
- (void)plvCastManager_findServices:(NSArray<PLVCastServiceModel *> *)servicesArray;
// 设备搜索状态变化
- (void)plvCastManager_searchStateHadChanged:(BOOL)searchIsStart;
// 设备连接结果
- (void)plvCastManager_connectServicesResult:(BOOL)isConnected
serviceModel:(PLVCastServiceModel *)serviceModel
passiveDisconnect:(BOOL)isPassiveDisconnect;
// 投屏错误
- (void)plvCastManager_castError:(NSError *)error;
7.7 发起投屏播放
连接设备后,可调用 startPlayWithVideo:quality:startPosition: 发起投屏播放。
[[PLVCastManager shareManager] startPlayWithVideo:self.player.video
quality:self.player.quality
startPosition:self.player.currentPlaybackTime];
参数说明:
| 参数 | 说明 |
|---|---|
video |
当前播放视频模型 |
quality |
投屏使用的清晰度 |
startPosition |
投屏起播位置,单位为秒 |
7.8 播放控制
投屏播放开始后,可通过 PLVCastManager 控制接收端播放。
// 暂停播放
[[PLVCastManager shareManager] pause];
// 恢复播放
[[PLVCastManager shareManager] resume];
// 停止播放
[[PLVCastManager shareManager] stop];
// 跳转到指定进度,单位为秒
[[PLVCastManager shareManager] seekTo:seekTime];
// 增加音量
[[PLVCastManager shareManager] addVolume];
// 减少音量
[[PLVCastManager shareManager] reduceVolume];
// 设置音量,范围 0~100
[[PLVCastManager shareManager] setVolume:volume];
播放状态和播放进度可通过以下代理方法获取:
// 播放状态变化
- (void)plvCastManager_playStatusChangedWithStatus:(PLVCastPlayStatus)status;
// 播放进度变化
- (void)plvCastManager_playTimeChangedWithCurrentTime:(NSInteger)currentTime
duration:(NSInteger)duration;
常用播放状态如下:
| 状态 | 说明 |
|---|---|
PLVCastPlayStatusLoading |
投屏加载中 |
PLVCastPlayStatusPlaying |
投屏播放中 |
PLVCastPlayStatusPause |
投屏已暂停 |
PLVCastPlayStatusStopped |
投屏已停止 |
PLVCastPlayStatusCommpleted |
投屏播放完成 |
PLVCastPlayStatusError |
投屏播放异常 |
7.9 销毁投屏模块
播放页面退出时,调用 quitAllFuntionc 停止投屏相关功能。
- (void)dealloc {
[self.castBM quitAllFuntionc];
}
7.10 常见问题
是否还需要配置乐播或慕享的 AppId、AppSecret?
不需要。当前 Demo 使用 PLVDLNA,不再需要配置乐播或慕享的 AppId、AppSecret。
加密视频是否支持投屏?
当前 Demo 的投屏示例不支持加密视频投屏。播放加密视频时,投屏入口会提示加密视频不支持投屏。
开启防录屏后为什么不能投屏?
开启防录屏 videoCaptureProtect=YES 后,PLVCastBusinessManager 默认不会继续初始化投屏模块,投屏入口不可用。
没有使用 Demo 播放器皮肤,能否接入投屏?
可以。若项目使用自定义播放器 UI,可自行创建投屏按钮,并参考 PLVCastBusinessManager 对接 PLVCastManager 的设备搜索、设备连接、投屏播放和播放控制方法。
