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 的裝置搜尋、裝置連線、投射播放與播放控制方法。
