保利威文档中心

幫助中心

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

联系客服,在线咨询