> For the complete documentation index, see [llms.txt](https://polyv.gitbook.io/document/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://polyv.gitbook.io/document/docs/vod/ios/7.-shi-pin-tou-ping.md).

# 7 视频投屏

## 7.1 概述

点播投屏功能，支持使用 [乐播SDK](https://www.lebo.cn/index) 或 [慕享SDK](https://letsview.cn/) 将视频（加密/非加密），投至大屏设备中进行观看（大屏设备需支持安卓系统，且需下载 “乐播投屏”App 或 慕享SDK配套的“傲软投屏接收端”App）。

其中，加密视频只能通过保利威的投屏模块进行投屏，不支持其他投屏模块（如iPhone自带的AirPlay）**进行投屏**。

目前暂时不支持AirPlay投屏。

保利威点播已封装好投屏UI、交互及功能，且代码开源。本篇目将介绍投屏模块如何使用。

**注：乐播投屏自2022年5月31日起开始收费，幕享投屏自2022年11月24日开始收费**

## 7.2 集成

### 7.2.1 源码引入

使用点播投屏，需将投屏模块的开源代码文件拖入工程。

开源代码在 [Github iOS点播Demo](https://github.com/polyv/polyv-ios-vod-sdk)或[Gitee iOS点播Demo](https://gitee.com/polyv_ef/polyv-ios-vod-sdk)已包含，可下载 Demo。文件路径为/PolyvVodSDKDemo/Classes/Cast，其中PLVCastManager类在2.17.0版本之前封装的是乐播SDK，而在2.17.0版本之后封装的是慕享投屏SDK，可根据项目情况自由选择。

投屏部分UI代码（横竖屏投屏按钮），位于 PolyvVodSDKDemo/PolyvOpenSourceModule 该目录下。若本身已使用保利威点播播放器皮肤 `PLVVodSkinPlayerController`，则无需再次引入。若本身 UI 是自定义，未使用`PLVVodSkinPlayerController`，则可参照其中的投屏相关代码，自行创建横竖屏投屏按钮。

### 7.2.2 Pod 投屏 SDK

投屏模块依赖投屏 SDK，可以使用 Cocoapods 进行快速集成。

```ruby
# 集成乐播投屏SDK
pod 'LBLelinkKit', '~> 30201'
# 或者
# 集成慕享投屏SDK
pod 'PLVDLNASender', '~>1.4.0'
```

### 7.2.3 获取 AppId、AppSecret

集成投屏模块，需具备与自家项目 BundleID 匹配的 AppId、AppSecret，请咨询 Polyv 技术支持进行获取。

### 7.2.4 提交AppStore审核时勾选说明

乐播LBLelinkKit投屏库，默认采集IDFA标识。

对于应用本身没有获取IDFA的情况，建议将应用提交至AppStore时按如下方式配置：（以避免被苹果以“应用不含广告功能，但获取了广告标识符IDFA”的理由而拒绝其上架。）

![提交选项配置](http://cdn.hpplay.com.cn/doc/sdk/source/iOS/_book/assets/import_07.png)

慕享投屏SDK，没有采集IDFA标识，无需特殊配置。

## 7.3 快速使用

### 7.3.1 填写 AppId、AppSecret

在 `PLVCastManager.h` 中填写 `AppId`、`AppSecre`：

```objective-c
// 乐播投屏SDK APPID 和 APPSECRET 需与包名绑定，获取方式请咨询Polyv技术支持
static NSString * const LBAPPID = @""; // APP id
static NSString * const LBSECRETKEY = @""; // 密钥

// 或者
// 慕享投屏SDK APPID 和 APPSECRET 需与包名绑定，获取方式请咨询Polyv技术支持
static NSString * const DLAPPID = @"";
static NSString * const DLSECRETKEY = @"";
```

### 7.3.2 在 AppDelegate 中获取授权

```objective-c
// 引用投屏类
#import "PLVCastBusinessManager.h"
 
// 请求投屏权限
[PLVCastBusinessManager getCastAuthorization];
```

### 7.3.3 在播放页面初始化

```objective-c
// 引用投屏类
#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` 是播放页面控制器的 view，`self.player` 是保利威点播播放器 `PLVVodPlayerViewController`。

### 7.3.4 显示投屏按钮

该小节默认用户使用保利威点播播放器皮肤 `PLVVodSkinPlayerController`。

在该控制器中搜索 “投屏”，并解开相关的注释代码即可。

若 `PLVVodSkinPlayerController` 中没有相关投屏代码，请下载最新 iOS 保利威点播 Demo，并进行源码更新。

### 7.3.5 销毁投屏模块

```objective-c
- (void)dealloc {
   [self.castBM quitAllFuntionc];
}
```

### 7.3.6 调试

（1）安装接收端

调试过程，一般需要找个接收端，来测试投屏功能是否正常。可以在安卓手机上下载、安装[乐播接收端App](https://www.lebo.cn/mobile/Download.html) 或者 [慕享配套的傲软投屏接收端App](https://download.apowersoft.com/down.php?softid=apowermirror-tvpolyv)

（2）切换 WIFI

接收端需要和发送端在同一WIFI网络下。

（3）确认 BundleID

若需安装到自己的真机，进行真机调试。

则需联系技术支持，提供自家的 BundleID，来获得投屏所需的 APPID、SECRETKEY。并填写在`PLVCastManager.h` 中。

（4）选择投屏设备

打开接收端 App后，接收端 App 会显示当前接收端名字，如“乐播投屏 N1”。

则在发送端 Demo 的播放页面，弹出的设备选择列表中，选中要投屏的设备，即可测试是否能正常投屏。

（5）打印调试

`PLVCastManager.m` 中，搜索

```objective-c
// 仅乐播sdk支持
[LBLelinkKit enableLog:NO];
```

并改写成 YES，即可打开投屏调试打印。

## 7.4 其他说明

上述三小节可帮助开发者快速集成及投入使用投屏模块。

具体 API 方法的说明，在源码中已有详细的注释，参考对应头文件即可了解。

若需自定义，或修改部分逻辑、交互，可参考此小节说明。

### 7.4.1 文件结构

```
Cast
 
├── PLVCastBusinessManager.h // 投屏业务管理器，主要封装对 PLVCastManager、PLVCastControllView、PLVCastServiceListView 的使用
├── PLVCastBusinessManager.m
├── PLVCastManager.h // 投屏管理器，主要封装投屏SDK的使用。2.17.0版本以前该文件封装的是乐播SDK，2.17.0版本之后该文件封装的是慕享投屏SDK
├── PLVCastManager.m
├── PLVCastControllView.h // 投屏控制视图，投屏开始后，显示在播放器上的控制界面
├── PLVCastControllView.m
├── PLVCastServiceListView.h // 投屏设备选择列表视图，在搜索设备过程，显示设备并供以用户选择
└── PLVCastServiceListView.m
```

### 7.4.2 开启投屏 SDK 打印

若需调试投屏 SDK，可在 `getCastAuthorization` 方法中，调用以下方法打开打印

```objective-c
// 仅乐播sdk支持
[LBLelinkKit enableLog:YES];
```

### 7.4.3 防录屏开关影响

当前默认逻辑，若播放器 `PLVVodPlayerViewController` 启用了防录屏 `videoCaptureProtect=YES` ，则投屏按钮默认不显示、初始化投屏无效。若希望不受防录屏开关影响，可调整以下两处：

（1）`PLVVodSkinPlayerController.m` 中，搜索并移除该判断条件：

```objective-c
self.videoCaptureProtect == NO
```

（2）`PLVCastBusinessManager.m` 的 `setup`方法，注释以下判断：

```objective-c
if (self.player.videoCaptureProtect) {
     NSLog(@"PLVCastBusinessManager - 警告：播放器防录屏功能已开启，保利威投屏模块将不可用");
     return;
}
```

### 7.4.4 报错 “PLVVodPlayerSkin.h not found”

若没有使用保利威点播播放器皮肤 `PLVVodSkinPlayerController`（没拖入 Demo 源码中的 PolyvOpenSourceModule 文件夹）。则集成投屏模块时，可能会出现此报错。此时可将涉及 `PLVVodPlayerSkin` 的地方注释或移除，并参考 7.4.5 进行投屏按钮的自行创建及对接。

### 7.4.5 自定义投屏按钮

若没有使用保利威点播播放器皮肤 `PLVVodSkinPlayerController`，则使用投屏模块，需要自行创建投屏按钮。按钮的创建本小节不阐述，主要说明如何对接到投屏模块。

（1）`PLVCastBusinessManager.h` 新增方法

```objective-c
- (void)castButtonTouchHandler:(UIButton *)button;
```

（2）`PLVCastBusinessManager.m` 新增方法实现

```objective-c
- (void)castButtonTouchHandler:(UIButton *)button{
   [self.castListV show];
    if ([PLVCastManager wifiCanUse]) {
        self.castListV.showAirPlayOption = YES;
       [self.castListV refreshBtnClickToSelected:YES];
   }else{
       [self.castListV refreshBtnClickToSelected:NO];
   }
}
```

（3）移除原按钮逻辑

搜 `PLVVodPlayerSkin`，并注释相应的类引用、对象的使用（`castButtonTouchHandler` 的实现、`skin` 的属性调用）

（4）对接自定义投屏按钮事件

* `PLVCastBusinessManager.m` 中，搜 `listViewShowOrHideEvent` 实现。可在 `isShow` 的 `else` 判断结果处，将自定义按钮的 `selected` 状态改为 No。（此处代表设备选择列表已隐藏，投屏按钮不应处于选中状态）
* 自定义按钮被触发时，使用 `PLVCastBusinessManager` 对象调用刚创建的 `castButtonTouchHandler` 方法
