保利威文档中心

帮助中心

7 视频投屏

更新时间:2026-05-21 18:34:06

视频投屏功能用于将点播视频投放到大屏设备播放。旧点播 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,可参考 PLVCastBusinessManagerPLVCastManager 自行对接投屏入口。

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 中为播放器皮肤设置投屏按钮点击事件。

点击投屏按钮后,投屏模块会:

  1. 判断当前视频是否支持投屏。
  2. 展示设备列表视图。
  3. 在 Wi-Fi 可用时搜索投屏设备。
  4. 选择设备后发起投屏播放。

若项目使用自定义播放器 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 的设备搜索、设备连接、投屏播放和播放控制方法。

联系客服,在线咨询