Brightcove 在以下 iOS 版本的最新公開版本上提供對最新 iOS SDK 的主動支援:
Brightcove 為以下 iOS 版本提供被動支援:
核心SDK 已在地化為阿拉伯語(ar)、英語(en)、法語(fr)、德語(de)、日語(ja)、韓語(ko)、西班牙語(es)、簡體中文(zh-Hans)和繁體中文中文(zh-Hant)。為了獲得本地化的好處,您的應用程式還必須針對相同的語言和區域設定進行本地化。有關更多信息,請參閱自訂本地化部分。
所有 SDK 元件(核心框架和外掛程式框架)均以相同的版本號發布。升級任何單一元件時,請將所有元件升級到同一版本。
對於在 Apple Silicon M1 和通用框架 (.framework) 上使用 Xcode 12 的項目,在為 arm64 模擬器建立項目時會傳回建置錯誤。
*ld: building for iOS Simulator, but linking in dylib built for iOS, file for architecture arm64*
若要建置arm64模擬器,請確保arm64
已新增至應用程式目標的「建置設定」標籤中Any iOS Simulator SDK
的「排除架構」建置設定中。
Brightcove Player SDK 6.10.0 版新增了核心子規格和每個插件以支援 XCFrameworks。每個子規範的預設值為/XCFramework
。
Podspec 名稱 | 亞種名稱 |
---|---|
Brightcove-玩家核心 | Brightcove-播放器-核心/框架 Brightcove-Player-Core/XCFramework |
Brightcove-玩家-DAI | Brightcove-播放器-DAI/框架 Brightcove-播放器-DAI/XCFramework |
Brightcove-Player-FreeWheel | Brightcove-玩家自由輪/框架 Brightcove-Player-FreeWheel/XCFramework |
Brightcove-播放器-GoogleCast | Brightcove-播放器-GoogleCast/框架 Brightcove-播放器-GoogleCast/XCFramework |
Brightcove-播放器-IMA | Brightcove-播放器-IMA/框架 Brightcove-播放器-IMA/XCFramework |
Brightcove-玩家-Omniture | Brightcove-播放器-Omniture/框架 Brightcove-Player-Omniture/XCFramework |
Brightcove-玩家脈衝 | Brightcove-玩家脈衝/框架 Brightcove-玩家-Pulse/XCFramework |
Brightcove-播放器-SSAI | Brightcove-播放器-SSAI/框架 Brightcove-播放器-SSAI/XCFramework |
Brightcove-播放器-OpenMeasurement | - |
Brightcove Player SDK 版本 6.12.0 更新了Brightcove-Player-FreeWheel
和Brightcove-Player-Omniture
podspec 以安裝動態版本的BrightcovePlayerSDK
。
Podspec 名稱 | 框架類型 | 依賴性 |
---|---|---|
Brightcove-玩家核心 | 動態的 | - |
Brightcove-Player-DAI(自 6.12.7 起可用) | 動態的 | Brightcove-玩家核心 |
Brightcove-Player-FreeWheel | 動態的 | iOS 版 Brightcove-Player-Core, 適用於 tvOS 的 Brightcove-Player-Core |
Brightcove-播放器-GoogleCast | 靜止的 | Brightcove-玩家核心 |
Brightcove-播放器-IMA | 動態的 | Brightcove-玩家核心 |
Brightcove-玩家-Omniture | 動態的 | Brightcove-玩家核心 |
Brightcove-玩家脈衝 | 動態的 | Brightcove-玩家核心 |
Brightcove-播放器-SSAI | 動態的 | Brightcove-玩家核心, Brightcove-Player-OpenMeasurement(僅適用於開放測量) |
Brightcove-Player-OpenMeasurement(自 6.10.0 起可用) | 動態的 | - |
對受 FairPlay 保護的影片的支援已整合到核心BrightcovePlayerSDK框架中。有關將 FairPlay 與 Brightcove Native Player SDK 結合使用的完整詳細信息,請參閱 FairPlay 指南。
對 Sidecar 字幕的支援已整合到核心BrightcovePlayerSDK框架中。有關將 Sidecar Subtitles 與 Brightcove Native Player SDK 結合使用的完整詳細信息,請參閱 Sidecar Subtitles 指南。
自版本 6.0.0 起,Brightcove Native Player SDK 允許您下載 HLS 視頻,包括受 FairPlay 加密保護的視頻,以便稍後在線或離線播放。有關完整詳細信息,請參閱應用程式開發人員指南:
iOS 應用程式開發人員使用 FairPlay 進行影片下載和離線播放的指南
Brightcove Player SDK 提供 iOS 和 tvOS 的安裝包,作為打包為 Frameworks 和 XCFrameworks 的動態庫。 iOS 12.0 及更高版本支援部署。
您可以使用 CocoaPods 將 Brightcove Player SDK 加入您的專案。您可以在此處找到最新的Brightcove-Player-Core
podspec。 podspec 同時支援 iOS 和 tvOS。
在專案中使用 Brightcove CocoaPods 時,請將source 'https://github.com/brightcove/BrightcoveSpecs.git'
新增至 Podfile 的開頭。
姓名。
source ' https://github.com/CocoaPods/Specs '
source ' https://github.com/brightcove/BrightcoveSpecs.git '
platform :ios, ' 12.0 '
use_frameworks !
target ' MyVideoPlayer ' do
pod ' Brightcove-Player-Core '
end
可以透過將/Framework
規範附加到 pod 來安裝框架。
source ' https://github.com/CocoaPods/Specs '
source ' https://github.com/brightcove/BrightcoveSpecs.git '
platform :ios, ' 12.0 '
use_frameworks !
target ' MyVideoPlayer ' do
pod ' Brightcove-Player-Core/Framework '
end
更新安裝時,最好刷新 BrightcoveSpecs 儲存庫的本機副本,以便您在本機上擁有最新的 podspec,就像更新 CococaPods 主儲存庫一樣。通常,如果您在終端機中執行pod update
這將自動發生,或者您可以使用pod repo update
明確更新。
要將 Brightcove Player SDK 手動新增到您的專案中:
BrightcovePlayerSDK.framework
或BrightcovePlayerSDK.xcframework
加入您的專案。請務必使用與您的目標、iOS 或 tvOS 相對應的版本。BrightcovePlayerSDK.framework
/ BrightcovePlayerSDK.xcframework
bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
新增「執行腳本」階段。選取“僅在安裝時運行腳本”。這將從建置中刪除不需要的架構,這對於 App Store 提交非常重要。使用 XCFramework 時不再需要此步驟。bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
新增「執行腳本」階段。選取“僅在安裝時運行腳本”。這將從建置中刪除不需要的架構,這對於 App Store 提交非常重要。arm64
已新增到Any iOS Simulator SDK
的「排除架構」建置設定中。作為參考,以下是所有 SDK 元件和對應的 URL,可協助您尋找和下載最新版本:
成分 | 網址 |
---|---|
Brightcove-玩家核心 | https://github.com/brightcove/brightcove-player-sdk-ios/tags |
Brightcove-玩家-DAI | https://github.com/brightcove/brightcove-player-sdk-ios-dai/tags |
Brightcove-Player-FreeWheel | https://github.com/brightcove/brightcove-player-sdk-ios-fw/tags |
Brightcove-播放器-GoogleCast | https://github.com/brightcove/brightcove-player-sdk-ios-googlecast/tags |
Brightcove-播放器-IMA | https://github.com/brightcove/brightcove-player-sdk-ios-ima/tags |
Brightcove-玩家-Omniture | https://github.com/brightcove/brightcove-player-sdk-ios-omniture/tags |
Brightcove-玩家脈衝 | https://github.com/brightcove/brightcove-player-sdk-ios-pulse/tags |
Brightcove-播放器-SSAI | https://github.com/brightcove/brightcove-player-sdk-ios-ssai/tags |
若要使用 Swift Package Manager 將 Brightcove Player SDK 新增至您的專案:
https://github.com/brightcove/brightcove-player-sdk-ios.git
注意:Swift Package Manager 僅支援動態 XCFramework。
適用於 iOS 的 Brightcove Player SDK 可以使用以下方式匯入:
import BrightcovePlayerSDK;
使用 iOS 的 Brightcove Player SDK 播放影片:
// ** Customize these values with your own account information **
let kAccountId = " ... "
let kPolicyKey = " ... "
let kVideoId = " ... "
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = sdkManager . createPlaybackController ( )
self . playbackController = playbackController // store this to a strong property
view . addSubview ( playbackController . view )
let playbackService = BCOVPlaybackService ( withAccountId : kAccountId ,
policyKey : kPolicyKey )
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : kVideoId
]
playbackService . findVideo ( withConfiguration : configuration ,
queryParameters : nil ) { ( video : BCOVVideo ? ,
jsonResponse : Any ? ,
error : Error ? ) in
if let video {
self . playbackController ? . setVideos ( [ video ] )
self . playbackController ? . play ( )
}
}
您需要防止控制器在方法結束時自動釋放。執行此操作的常見方法是將控制器的參考儲存在強實例變數中。
從5.1.0版本開始,Brightcove PlayerUI完全整合到Core SDK框架中。 PlayerUI 提供了一套功能齊全的播放和廣告控件,開箱即用。
PlayerUI 可以快速設置,顯示 SSAI、Pulse 和 FreeWheel 的廣告控制項,並且可以透過建立自己的版面進行自訂。
請遵循以下指南來設定 PlayerUI 控制項。
在 UIViewController 中建立一個屬性來追蹤 BCOVPUIPlayerView。 BCOVPUIPlayerView 將包含播放控制器的視圖和控制視圖。
// PlayerUI's Player View
var playerView : BCOVPUIPlayerView ?
建立 BCOVPUIBasicControlView,然後建立 BCOVPUIBasicControlView。這是我們將播放控制器(以及它播放的所有影片)與控制項關聯起來的地方。
// Create and configure Control View.
let controlView = BCOVPUIBasicControlView . withVODLayout ( )
playerView = BCOVPUIPlayerView ( playbackController : self . playbackController , options : nil )
// Add BCOVPUIPlayerView to your video view.
if let playerView {
videoView . addSubview ( playerView )
}
您需要設定播放器視圖的佈局,可以使用自動佈局或舊的 Springs & Struts 方法來完成此操作。
設定播放器視圖,使其在調整大小時與佈局 ( videoView
) 中的影片容器相符。
playerView . frame = videoView . bounds
playerView . autoresizingMask = [ . flexibleHeight , . flexibleWidth ]
將 BCOVPUIPlayerView 上的translatesAutoresizingMaskIntoConstraints
設定為false
。
playerView . translatesAutoresizingMaskIntoConstraints = false
然後加入佈局的約束;將 BCOVPUIPlayerView 的頂部、右側、左側和底部錨點設定為等於videoView
的錨點
NSLayoutConstraint . activate ( [
playerView . topAnchor . constraint ( equalTo : videoView . topAnchor ) ,
playerView . rightAnchor . constraint ( equalTo : videoView . rightAnchor ) ,
playerView . bottomAnchor . constraint ( equalTo : videoView . bottomAnchor ) ,
playerView . leftAnchor . constraint ( equalTo : videoView . leftAnchor )
] )
BCOVPUIPlayerViewOptions
類別可讓您在初始化時自訂一些 BCOVPlayerUI 行為。您可以自訂以下內容:
jumpBackInterval
按下跳回按鈕時播放器將向後尋找的時間(以秒為單位)。
hideControlsInterval
最後一次觸碰事件之後、隱藏控制項之前的時間(以秒為單位)。
hideControlsAnimationDuration
控制項以動畫方式隱藏所需的時間(以秒為單位)。
showControlsAnimationDuration
控制項動畫顯示所需的時間(以秒為單位)。
learnMoreButtonBrowserStyle
用於確定點擊廣告上的「了解更多」按鈕是否會在外部瀏覽器(預設值)或內部瀏覽器中顯示點擊連結的設定。
presentingViewController
用於呈現其他視圖控制器(如隱藏式字幕選擇視圖控制器)的 UIViewController 子類別。
automaticControlTypeSelection
是否希望BCOVPUIPlayerView
根據媒體類型自動選擇BCOVPUIBasicControlView
類型。當此值設為true
時,傳遞到BCOVPUIBasicControlView
初始值設定項目的BCOVPUIPlayerView
屬性將被忽略。
視訊+音訊串流
basicControlViewWithVODLayout
basicControlViewWithLiveLayout
basicControlViewWithLiveDVRLayout
純音訊串流
basicControlViewWithAODLayout
basicControlViewWithLiveAudioLayout
basicControlViewWithLiveDVRAudioLayout
注意: automaticControlTypeSelection
從 BCOVPlayerUI 提供的佈局中選擇佈局,因此自訂控制項和佈局將被覆蓋; automaticControlTypeSelection
和播放器 UI 自訂不相容。
可以使用以下方法設定選項:
let manager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = manager . createPlaybackController ( )
let options = BCOVPUIPlayerViewOptions ( )
options . jumpBackInterval = 5
let playerView = BCOVPUIPlayerView ( playbackController : playbackController ,
options : options )
提供三種佈局來支援不同類型的影片:
BCOVPUIControlLayout basicVODControlLayout
是一般點播視訊串流的基本版面。
BCOVPUIControlLayout basicLiveControlLayout
是直播影片的版面。
BCOVPUIControlLayout basicLiveDVRControlLayout
是帶有 DVR 控制項的即時視訊串流的佈局。
您通常在建立BCOVPUIPlayerView
後立即設定新佈局,但也可以隨時設定新佈局。例如,您可以像這樣設定新的 VOD 佈局:
playerView ? . controlsView . layout = BCOVPUIControlLayout . basicVOD ( )
除了預設佈局之外,您還可以透過使用自己的設計實例化新的BCOVPUIControlLayout
來建立自己的高度自訂佈局。但請注意, automaticControlTypeSelection
從 BCOVPlayerUI 提供的佈局中選擇佈局,因此自訂控制項和佈局將被覆蓋; automaticControlTypeSelection
和播放器 UI 自訂不相容。
首先,使用BCOVPUIBasicControlView layoutViewWithControlFromTag:width:elasticity:
建立將進入佈局的控制項。每個控制項都封裝在BCOVPUILayoutView
中,該視圖決定控制項間距。
您可以將每個佈局視圖的width
設定為預設寬度(基於控制項的類型),也可以指定您自己的寬度。
使用elasticity
參數來決定包含控制項的佈局視圖調整其寬度以填滿控制欄的程度。
以下是建立各種基本控制項的範例。
// Create various standard layout views
// Standard play/pause button
let playbackLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonPlayback ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Standard jump back button
let jumpBackButtonLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonJumpBack ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Current time indicator
let currentTimeLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelCurrentTime ,
width : kBCOVPUILayoutUseDefaultValue
elasticity : 0.0 )
// Time separator - typically the '/' character
let timeSeparatorLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelTimeSeparator ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Video duration label
let durationLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelDuration ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Slider bar used for seeking through the video
// The elasticity is set to 1 so that it can resize to fill available space
let progressLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . sliderProgress ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 1.0 )
// Closed caption button
// This button is initially hidden ('removed'), and will be shown
// if closed captions or audio tracks are available.
let closedCaptionLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonClosedCaption ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
closedCaptionLayoutView ? . isRemoved = true
// The full-screen button
let screenModeLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonScreenMode ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// AirPlay button
// This button is initially hidden ('removed'), and will be shown
// if AirPlay devices are available.
let externalRouteLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewExternalRoute ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
externalRouteLayoutView ? . isRemoved = true
// Empty view - used as a spacer
let spacerLayoutView1 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 1.0 ,
elasticity : 1.0 )
// Empty view - used as a spacer
let spacerLayoutView2 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 1.0 ,
elasticity : 1.0 )
// Empty view - will have a custom UIImageView added as a subview
let logoLayoutView1 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 88.0 ,
elasticity : 1.0 )
// Empty view - will have a custom UIImageView added as a subview
let logoLayoutView2 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 36.0 ,
elasticity : 1.0 )
請注意,您還可以建立一個空白佈局視圖,在其中可以放置您自己的視圖(徽標、控制項、無內容等)。此程式碼展示如何將UIImage
徽標放置在我們上面創建的 logoLayoutView1 中。
// Create logo image inside an image view for display in control bar.
let logoImage1 = UIImage ( named : " myLogo " )
let logoImageView1 = UIImageView ( image : logoImage1 )
logoImageView1 . autoresizingMask = [ . flexibleWidth , . flexibleHeight ]
logoImageView1 . contentMode = . scaleAspectFit
logoImageView1 . frame = logoLayoutView1 . frame
// Add image view to our empty layout view.
logoLayoutView1 . addSubview ( logoImageView1 )
現在佈局視圖中封裝了各種控件,它們被排序成數組,每個數組代表一行控件,即一個控件欄。請注意,縱向和橫向可以有不同的佈局,因此您通常會設定兩個不同的控制欄陣列。
在橫向的標準佈局中,控制項排列在單一數組中,然後該數組儲存在表示整個控制項集的另一個數組中。
let standardLayoutLine1 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
currentTimeLayoutView ,
timeSeparatorLayoutView ,
durationLayoutView ,
progressLayoutView ,
spacerLayoutView1 ,
logoLayoutView1 ,
spacerLayoutView2 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView
]
let standardLayoutLines = [ standardLayoutLine1 ]
在縱向的緊湊佈局中,創建了兩個控制項數組,每一行一個。這些陣列被打包到另一個表示緊湊佈局的陣列中。
請注意,每個佈局中的大多數控制項都使用完全相同的物件。完成此操作後,當您在縱向和橫向方向之間切換時,物件將使用平滑的動畫移動到新位置。
let compactLayoutLine1 = [
currentTimeLayoutView ,
progressLayoutView ,
durationLayoutView
]
let compactLayoutLine2 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
spacerLayoutView1 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView ,
logoLayoutView2
]
let compactLayoutLines = [
compactLayoutLine1 ,
compactLayoutLine2
]
最後,現在有兩種佈局配置(一種用於全寬度,一種用於緊湊寬度),您可以建立新的BCOVPUIControlLayout
對象,並將其設定在播放器的控制視圖中。
let customLayout = BCOVPUIControlLayout . init ( standardControls : standardLayoutLines ,
compactControls : compactLayoutLines )
playerView ? . controlsView . layout = customLayout
如果您有需要頻繁顯示或隱藏的控件,則可以在該控件的佈局視圖上設定removed
屬性。當你改變了你的控制項後,在playerView的controlView上呼叫setNeedsLayout
:
logoLayoutView1 ? . isRemoved = true
playerView ? . controlsView . setNeedsLayout ( )
您也可以自訂幾個常規BCOVPUIControlLayout
屬性:
controlBarHeight
設定每行控制項的大小。horizontalItemSpacing
設定每個控制列中每個BCOVPUILayoutView
之間的間距。compactLayoutMaximumWidth
決定使用哪一組控制項。如果控制項檢視小於compactLayoutMaximumWidth
,則將使用緊湊控制項集,否則將使用標準控制項。若要變更顯示的控制項集,您必須建立並安裝新的BCOVPUIControlLayout
。可以隨時安裝新的控制項。
有關 PlayerUI 自訂的更多範例,您可以查看 BrightcoveOS GitHub 儲存庫的 PlayerUI 資料夾中的範例程式碼:
https://github.com/BrightcoveOS/ios-player-samples
Brightcove Native Player SDK 包括用於在 Apple TV 上的 tvOS 中播放的內建控制。有關將內建電視播放器 UI 與 Brightcove Native Player SDK 結合使用的完整詳細信息,請參閱我們的電視播放器指南。
透過將BCOVPlaybackController
上的setAllowsExternalPlayback
屬性設為true
來啟用 AirPlay 功能。如果在網路上找到 AirPlay 設備,則播放控制中將顯示 AirPlay 按鈕。
目前,IMA 是唯一支援 AirPlay 的廣告插件,並且僅在使用前貼片和/或後貼片廣告時才支援。將 AirPlay 與 Pulse、SSAI 或 FreeWheel 廣告插件一起使用可能會導致意外行為。
如果您還想支援 AirPlay 2 並允許選擇多個裝置進行音訊輸出,您將需要做一些額外的事情。首先,您需要設定 AVAudioSession ,以便可以設定routeSharingPolicy
。例如:
do {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , mode : . moviePlayback , policy : . longFormVideo )
} catch {
print ( " Error setting AVAudioSession category " )
}
您還需要透過MPRemoteCommandCenter
配置至少一個播放命令。至少您需要配置pauseCommand
和playCommand
。例如:
let center = MPRemoteCommandCenter . shared ( )
center . pauseCommand . addTarget { _ in
playbackController . pause ( )
return . success
}
center . playCommand . addTarget { _ in
playbackController . play ( )
return . success
}
設備將利用AVRoutePickerView
,它有兩個委託方法。這些委託方法傳遞給BCOVPUIPlayerViewDelegate
。方法有:
func routePickerViewDidEndPresentingRoutes ( _ routePickerView : AVRoutePickerView )
func routePickerViewWillBeginPresentingRoutes ( _ routePickerView : AVRoutePickerView )
用於發現 AirPlay 路由的AVRouteDetector
在BCOVPUIBasicControlView
物件上可用,因此您可以根據需要啟用或停用其routeDetectionEnabled
屬性。
根據蘋果的文檔:“路由檢測會顯著增加功耗,當不再需要時必須將其關閉。 ”
playerView ? . controlsView . routeDetector . isRouteDetectionEnabled = false
有關將 AirPlay 2 整合到您的應用程式中的更多信息,請參閱將 Airplay 2 整合到您的應用程式中文件。
Native Player SDK 支援互動式顯示 360 度球形影片。 360 度影片應使用包含值「equisquare」的「projection」欄位屬性進行標記。這些影片將以與其他影片相同的方式載入和播放,但它們將顯示在 CAMetalLayer 而不是 AVPlayerLayer 中。
注意:「等距矩形」是目前 360 度來源影片支援的唯一投影格式。
PlayerUI 還內建了對 Video 360 的支持,提供預設平移手勢、視圖的陀螺儀運動偵測以及在播放 Video 360 資源時出現的新 Video 360 按鈕。此按鈕僅出現在 iPhone 上,可讓您在普通視圖和「VR 護目鏡」視圖之間切換,其中螢幕分為兩部分,為每隻眼睛渲染相同的場景,以便該裝置可以在頭部使用。安裝配置。在 iPad 上,不需要 Video 360 按鈕,因為只有一種操作模式:支援平移手勢的運動偵測。
支援 Video 360 就像播放影片一樣簡單。當偵測到「投影」欄位屬性時,Native Player SDK 將自動處理在 Metal 中設定和顯示視頻,並在適當時安裝 Video 360 按鈕。
如果您在 Video Cloud 外部播放 360 度視頻,請務必將“投影”屬性添加到BCOVVideo
對象,其值為“equirectangular”。
為了透過 VR Goggles 模式提供最佳的使用者體驗,您應該使用BCOVPUIPlayerViewDelegate
方法來偵測何時啟用此模式。這允許您強制設備進入橫向(因為這是對 VR 護目鏡視圖有意義的唯一方向)。
以下程式碼顯示了在正常 360 度視圖和 VR 護目鏡模式之間來回切換時如何處理強制方向變更。
// Set this to YES when displaying a VR goggles video
var landscapeOnly = false
// UIViewController override:
// Lets us control the orientation of the device
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
get {
if landscapeOnly {
return . landscape
}
return . all
}
}
// BCOVPUIPlayerViewDelegate method
func didSetVideo360NavigationMethod ( _ navigationMethod : BCOVPUIVideo360NavigationMethod ,
projectionStyle : BCOVVideo360ProjectionStyle ) {
switch projectionStyle {
case . normal :
print ( " BCOVVideo360ProjectionStyleNormal " )
landscapeOnly = false
case . vrGoggles :
print ( " BCOVPUIVideo360NavigationDeviceMotionTracking " )
landscapeOnly = true
let currentDeviceOrientation = UIDevice . current . orientation
switch currentDeviceOrientation {
case . landscapeLeft ,
. landscapeRight :
// all good
break
default :
// switch orientation
UIDevice . current . setValue ( UIInterfaceOrientation . landscapeLeft . rawValue , forKey : " orientation " )
break
}
break
default :
break
}
UIViewController . attemptRotationToDeviceOrientation ( )
}
PlayerUI 將安裝手勢來處理 360 度影片周圍的導航,但如果您使用自己的控件,則可以自行設定虛擬攝影機的視圖參數。 BCOVPlaybackController
協定的viewProjection
屬性可讓您設定這些參數。此屬性是一個BCOVVideo360ViewProjection
類,具有基本的虛擬攝影機設置,如pan
、 tilt
和zoom
。若要變更設置,請複製目前實例,變更新實例上的設置,然後將其指派回viewProjection
屬性。
iOS 版 Brightcove Player SDK 的入口點是BCOVPlayerSDKManager
單例物件。此管理器處理插件元件的註冊和一些其他內務任務,但它主要充當物件工廠。您的應用程式的視圖控制器會取得對 Manager 的引用,並使用它來建立BCOVPlaybackController
。播放控制器的view
屬性公開一個包含 AVPlayerLayer 物件的 UIView,該物件最終在螢幕上呈現影片內容。播放控制器也接受BCOVPlaybackControllerDelegate
,您可以實現它來回應各種視訊播放事件。
播放控制器提供影響目前影片播放的方法和屬性。但是,在內部,播放控制器委託給BCOVPlaybackSession
物件。播放會話執行準備和播放影片內容的實際工作,並包含影片的元資料和AVPlayer
。播放控制器具有從目前播放會話前進到下一個播放會話的機制,可以在影片結束時自動進行,也可以透過方法呼叫手動進行。一旦播放控制器前進到新會話,先前的會話將被丟棄並且不能再次使用。
播放控制器還有另外兩個元素: BCOVPlaybackSessionProvider
和BCOVPlaybackSessionConsumer
清單。顧名思義,播放會話提供者負責建立播放會話並將它們傳遞給播放控制器。然後,回放控制器將會話傳送給清單中的每個回放會話消費者。會話提供者和會話使用者 API 都是為插件開發人員使用而設計的,本文檔中沒有詳細說明。
除了上述類別提供的播放功能之外,還有一些值類別。它們用於保存特定於 iOS 版 Player SDK 的資料。其中每一個都在下面其各自的部分中進行了更詳細的描述。
適用於 iOS 的 Brightcove Player SDK 在BCOVPlaybackController
上提供播放、暫停和搜尋方法。使用這些方法而不是使用 AVPlayer 等效方法非常重要。在它們的預設實作中,這些物件將呼叫直接轉送到 AVPlayer 上的對應方法。但是,如果您使用插件,它們可能會覆蓋預設行為以添加功能。例如,如果使用廣告插件,第一次呼叫playbackController.play()
可能會導致在開始內容之前播放預先捲動。要了解有關插件如何覆蓋預設行為的更多信息,請參閱每個插件 README.md 或檢查插件可能添加的BCOVSessionProviderExtension
上的類別擴充。
直接在 AVPlayer 上呼叫播放、暫停或搜尋可能會導致未定義的行為。
若要為 AVPlayer 設定自訂播放速率,您可以使用BCOVPlaybackController
上的playbackRate
屬性。使用此屬性設定播放速率而不是直接在 AVPlayer 上設定它很重要。
嘗試將playbackRate
設為0 或更低的值將導致該值被設定為1.0。如果 AVPlayer 的currentItem
不支援canPlaySlowForward
(對於小於 1 的值)或canPlayFastForward
(對於大於 1 的值),則會使用預設播放速率 1.0。廣告播放不會受到影響。
如果為playbackRate
設定了自訂值,則每個AVPlayerItem
的audioTimePitchAlgorithm
將設定為AVAudioTimePitchAlgorithmTimeDomain
。或者,您可以為audioTimePitchAlgorithm
設定自己的值,如下所示:
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didReceive lifecycleEvent : BCOVPlaybackSessionLifecycleEvent ) {
if lifecycleEvent . eventType == kBCOVPlaybackSessionLifecycleEventReady {
session . player . currentItem ? . audioTimePitchAlgorithm = . varispeed
}
}
您可以在此處閱讀有關audioTimePitchAlgorithm
的更多資訊。
自 6.12.0 版本以來,iOS SDK 使用了 AVQueuePlayer 來處理佇列中下一個影片的預先載入。
但是,您可能希望更好地控制在播放清單中預先載入即將播放的影片。一種可能的方法是使用兩個播放控制器對影片清單進行雙重緩衝,例如:
playbackController1.setVideos([videos.firstObject])
)playbackController:didProgressTo:
委託方法確定目前影片是否已經進展到您想要開始預先載入下一個影片的位置對於工作範例,您可以從我們的播放器範例儲存庫下載我們的 VideoPreloading 範例應用程式。
注意:您可能需要考慮客戶端裝置上的可用記憶體量及其連線速度。如果不在 Wifi 上,預先載入影片可能會影響目前影片的網路資源。
適用於 iOS 的 Brightcove Player SDK 使用戶端能夠將多個 url 和傳輸類型 ( BCOVSource
) 附加到單一影片 ( BCOVVideo
)。例如,如果播放服務正在檢索您的視頻,則單一視訊可能會混合使用 HLS 或 MP4 版本以及 HTTP 和 HTTPS 版本。 選擇這些來源中的哪一個是由來源選擇策略區塊決定的。預設來源選擇策略將選擇每個BCOVVideo
上的第一個 HLS BCOVSource
,其中 HTTPS 來源優先於 HTTP。
可以透過建立BCOVBasicSessionProviderOptions
並使用它來建立BCOVBasicSessionProvider
來覆蓋來源選擇。例如:
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let options = BCOVBasicSessionProviderOptions ( )
options . sourceSelectionPolicy = < policy >
let provider = sdkManager . createBasicSessionProvider ( withOptions : options )
let playbackController = sdkManager . createPlaybackController ( withSessionProvider : provider , viewStrategy : nil )
如果此預設選擇策略不適合您,則有幾種選擇來源的替代方法:
如果透過播放服務從視頻雲檢索視頻,請在調用playbackController.setVideos()
之前,使用BCOVVideo
上的更新方法僅包含所需的來源(有關更多信息,請參閱“值”部分)。
您可以使用幫助器方法[BCOVBasicSourceSelectionPolicy sourceSelectionHLSWithScheme:scheme]
建立首選特定方案的策略。這是用於建立首選 HTTPS 的預設來源選擇策略的方法。
與更新視訊物件類似,您也可以實現自己的來源選擇區塊。
options . sourceSelectionPolicy = { ( video : BCOVVideo ? ) -> BCOVSource ? in
< Check video . sources for source >
< Return source >
}
請注意,App Store 對 MP4 影片的使用有限制。查看最新的 Apple 開發者資訊以了解詳細資訊。
適用於 iOS 的 Brightcove Player SDK 提供了一種設定視訊首選位元率的方法。您可以建立一個 BCOVPreferredBitrateConfig 對象,其中包含所需的位元率選項,以及為顯示選項而建立的視圖控制器的一些配置。
菜單的標題是可選的。位元率選項是 NSDictionary 的數組,每個字典都有一個鍵:值對。鍵將用作選項名稱,值是一個 NSNumber,其中該選項的位元率以 bps(每秒位數)為單位。您輸入的比特率是可以對應到視訊資源演繹的比特率的值。您可以在攝取設定檔最佳實踐中了解有關演繹的更多資訊。
這是一個例子:
let bitrates = [
[ " Auto " : NSNumber ( 0 ) ] ,
[ " Setting 1 " : NSNumber ( 518100 ) ] ,
[ " Setting 2 " : NSNumber ( 2596000 ) ]
]
let options = BCOVPUIPlayerViewOptions ( )
options . preferredBitrateConfig = BCOVPreferredBitrateConfig ( menuTitle : " Select an Option " ,
andBitrateOptions : bitrates )
當最終使用者選擇其中一個選項時,目前 AVPlayerItem 的 PreferredPeakBitRate 屬性將設定為該選項的值。如果影片位於播放清單中,則播放的下一個影片也將設定 PreferredPeakBitRate 值。
為 PreferredPeakBitRate 設定非零值後,您可能不會注意到品質差異,直到 AVPlayer 到達其目前緩衝快取的末端。
您也可以使用configWithMenuTitle:bitrateOptions:andIndexofInitialSelection:
初始值設定項,它提供了設定首選初始值索引的功能。此索引應與bitrateOptions
數組中所需選項的索引相關。
您也可以在BCOVPlaybackController
物件上使用setPreferredPeakBitRate:
方法以程式設計方式設定目前和未來會話的首選位元率。
注意:必須為最終使用者提供返回 PreferredPeakBitRate 預設值 (0) 的方法。您可以透過提供比特率值為 0 的選項來完成此操作。
請參閱 Apple 關於 PreferredPeakBitRate 的文檔以了解更多資訊。
適用於 iOS 的 Brightcove Player SDK 提供了兩種取得播放資訊的機制。播放控制器提供了一個實作BCOVPlaybackControllerDelegate
的委託屬性。委託可以實作這些可選方法來取得播放元資料(例如進度、持續時間變更和其他事件)的通知。如果安裝了廣告插件,它也可以使用此委託來提供有關廣告播放的資訊。生命週期事件委託方法提供事件來指示播放狀態的變更。例如,當播放器從暫停狀態進入播放狀態時,將透過kBCOVPlaybackSessionLifecycleEventPlay
事件呼叫生命週期事件委託方法。預設生命週期事件在BCOVPlaybackSession
中聲明。 Brightcove 提供的插件增加了每個插件中定義的附加生命週期事件。
播放控制器允許單一委託。在許多情況下,這足以檢索資訊;委託實作可以根據需要將值和事件傳播到應用程式的不同部分。在需要多個委託的情況下(如開發外掛程式時的情況), BCOVPlaybackSessionConsumer
委託提供與BCOVPlaybackControllerDelegate
方法等效的功能,包括廣告資料。
以下是如何使用BCOVPlaybackSessionConsumer
建立分析外掛程式的範例:
class XYZAnalytics : NSObject , BCOVPlaybackSessionConsumer {
func playbackSession ( _ session : BCOVPlaybackSession , didProgressTo progress : TimeInterval ) {
//react to progress event
}
}
要使用該插件:
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let controller = sdkManager . createPlaybackController ( )
let analytics = XYZAnalytics ( )
controller . add ( analytics )
當應用程式遇到網路中斷時,如果中斷持續時間太長, BCOVPlaybackController
使用的AVPlayer
可能會停止嘗試復原。如果發生這種情況,將使用kBCOVPlaybackSessionLifecycleEventFailedToPlayToEndTime
事件呼叫生命週期委託方法。發生此事件時,播放不會自動恢復。為了從此事件中恢復,您需要在客戶端程式碼中偵測網路何時恢復。
一旦確定網路已恢復,您可以使用playbackController.resumeVideo(at:withAutoPlay:)
重新初始化播放器。您需要記錄要恢復到的位置。播放器將盡最大努力抑制生命週期事件和進度事件,以防止廣告重播或分析受到干擾。
在呼叫playbackController.resumeVideo(at:withAutoPlay:)
時,播放器會傳送類型為kBCOVPlaybackSessionLifecycleEventResumeBegin
的生命週期事件。如果此操作成功,將發送kBCOVPlaybackSessionLifecycleEventResumeComplete
,否則將發送kBCOVPlaybackSessionLifecycleEventResumeFail
。
在第二次呼叫playbackController.resumeVideo(at:withAutoPlay:)
之前,您必須等待,直到收到上次呼叫的kBCOVPlaybackSessionLifecycleEventResumeComplete
或kBCOVPlaybackSessionLifecycleEventResumeFail
。您可能希望在向用戶發出網路太不穩定的訊息之前施加重試限制。
當AVPlayer
仍然能夠存取網絡,但由於網路太慢而導致視訊停頓時,將透過kBCOVPlaybackSessionLifecycleEventPlaybackStalled
事件呼叫生命週期委託方法。當播放能夠復原時,將使用kBCOVPlaybackSessionLifecycleEventPlaybackRecovered
事件呼叫生命週期委託方法。這些事件僅涵蓋正常播放停止的情況,不涵蓋影片查找或初始載入期間發生的緩衝。
當影片最初載入時、發生搜尋時或因網路緩慢而導致播放停止時,將使用kBCOVPlaybackSessionLifecycleEventPlaybackBufferEmpty
事件呼叫生命週期委託方法。當播放能夠復原時,將使用kBCOVPlaybackSessionLifecycleEventPlaybackLikelyToKeepUp
事件呼叫生命週期委託方法。
除非另有明確記錄,否則 iOS 版 Player SDK 中的所有類別均未設計為子類化。創建任何未明確設計為子類別的 SDK 類別的子類別(尤其是任何值類別)可能會導致不可預測的行為。
這些類別( BCOVPlaylist
、 BCOVVideo
、 BCOVSource
、 BCOVCuePoint
、 BCOVCuePointCollection
)也稱為“模型物件”,用於表示適用於 iOS 的 Player SDK 中的資料。重要的是要理解這些資料類型被視為值,而不是身分。我們的意思是,如果一個值類別的兩個實例具有完全相同的數據,那麼它們代表相同的想法或值,即使它們在技術上是位於不同記憶體位址的兩個不同物件。換句話說,SDK 程式碼和客戶端程式碼都不應該使用值物件的身份比較(「指標相等」)。相反,每個值類別都實現-isEqual:
並提供特定於類別的相等方法重載,應該使用其中任何一個。
這很糟糕:
if myVideo == session . video // Could lead to bugs!
這些都很好(並且功能相同):
if myVideo . isEqual ( session . video )
if myVideo . isEqual ( toVideo : session . video )
iOS 版 Player SDK 的內部可能會執行諸如記憶值或製作防禦性副本之類的操作,因此依賴指標位址來檢查相等性最終會給您帶來痛苦。
iOS 版 Player SDK 中值類別的另一個特點是它們是不可變的。一旦有了值的實例,就不應該嘗試以任何方式破壞這種不變性,因為這可能會導致不可預測的行為。如果您希望在程式碼中以某種方式「修改」某個值,那麼您唯一的方法就是建立一個新值。為了方便地幫助客戶端取得「修改後的」值,每個值類別都提供了一個-update:
方法,該方法採用一個區塊,允許您對原始值的可變副本進行操作。
以下是使用此方法建立現有視訊物件的「修改」版本的範例,但具有不同的屬性:
let video1 : BCOVVideo // (properties include a key "foo" whose value is "bar")
let video2 = video1 . update { ( mutableVideo : BCOVMutableVideo ) in
mutableVideo . properties = [ " foo " : " quux " ]
}
if let foo1 = video1 . properties [ " foo " ] ,
let foo2 = video2 . properties [ " foo " ] {
print ( " foo is ( foo1 ) " ) // prints "foo is bar"
print ( " foo is ( foo2 ) " ) // prints "foo is quux"
}
// Both video1 and video2 are still immutable objects:
video1 . properties = [ " foo " : " fail " ] // causes compiler error
video2 . properties = [ " foo " : " fail " ] // causes compiler error
如您在範例中看到的, video1
尚未被-update
方法呼叫更改。相反,此方法傳回video1
的副本,但在區塊主體中進行的修改除外。您永遠不應該允許可變副本轉義區塊(例如將其指派給__block
變數),而應在進行修改後使用-update
方法傳回的不可變物件。
播放服務類BCOVPlaybackService
提供透過 Brightcove Playback API 檢索 Brightcove 視訊資源和播放清單的功能,包括豐富的元數據,例如文字軌道、預覽和縮圖。以下範例顯示如何檢索具有視訊 ID 的影片。也可以使用透過影片的參考 ID 檢索影片或播放清單的方法。
[ 1 ] let kPolicyKey = " ... "
let kAccountId = " ... "
let kVideoId = " ... "
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = sdkManager . createPlaybackController ( )
self . playbackController = playbackController
view . addSubview ( playbackController . view )
let playbackService = BCOVPlaybackService ( withAccountId : kAccountId ,
policyKey : kPolicyKey )
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : kVideoId
]
playbackService . findVideo ( withConfiguration : configuration ,
queryParameters : nil ) { ( video : BCOVVideo ? ,
jsonResponse : Any ? ,
error : Error ? ) in
if let video {
self . playbackController ? . setVideos ( [ video ] )
self . playbackController ? . play ( )
}
}
注意:如果您正在使用播放授權服務,請查看本自述文件中與該功能相關的部分。
對於傳回播放清單的BCOVPlaybackService
方法,您可以透過在參數字典中指定限制和偏移參數來要求部分播放清單或播放清單中的「頁面」。限制指定將傳回的影片的最大數量,偏移量指定將傳回影片的播放清單的索引。
例如,如果您的播放清單包含 100 個視頻,則您只能要求從視頻編號 10 開始的 6 個視頻,如下所示:
let parameters = [
" limit " : 6 ,
" offset " : 10
]
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : kVideoId
]
playbackService . findVideo ( withConfiguration : configuration ,
queryParameters : parameters ) { ( video : BCOVVideo ? ,
jsonResponse : Any ? ,
error : Error ? ) in
if let video {
self . playbackController ? . setVideos ( [ video ] )
self . playbackController ? . play ( )
}
}
BCOVPlaybackController
物件是使用視圖策略建立的,它允許您作為 SDK 的用戶端定義從播放控制器的 view 屬性傳回的確切 UIView 物件。當使用影響播放控制器視圖的插件(例如用廣告視圖覆蓋視訊視圖的廣告插件)時,這一點很重要。許多應用程式不需要建立視圖策略,並且在建立新的播放控制器時只需傳遞nil
即可。這將在播放控制器中建立標準視訊視圖。
BCOVPlaybackControllerViewStrategy
typedef 別名(和文件)是這個更複雜的區塊簽章:
UIView *(^)(UIView *videoView, id playbackController);
此簽章描述了一個 Objective-C 區塊,該區塊傳回 UIView 並採用兩個參數:UIView 和播放控制器。傳回值是播放控制器的 view 屬性將指向的 UIView 物件。第一個參數是包含視訊層的UIView,UIView將顯示影片。第二個參數是已賦予視圖策略的播放控制器對象,播放控制器可用於新增必要的會話消費者,例如視訊控製或廣告控制項。
視圖策略實施範例:
let viewStrategy = { ( videoView : UIView ? , playbackController : BCOVPlaybackController ? ) in
guard let videoView ,
let playbackController else {
return UIView ( )
}
// Create some custom controls for the video view,
// and compose both into a container view.
[ 1 ] let myControlsView = MyControlsView ( ) // Conforms to BCOVPlaybackSessionConsumer
[ 2 ] let controlsAndVideoView = UIView ( )
[ 3 ] controlsAndVideoView . addSubview ( videoView )
controlsAndVideoView . addSubview ( myControlsView )
// Compose the container with an advertising view
// into another container view.
[ 4 ] let adView = SomeAdPluginView ( ) // Conforms to BCOVPlaybackSessionConsumer
[ 5 ] let adAndVideoView = UIView ( )
[ 6 ] adAndVideoView . addSubview ( controlsAndVideoView )
adAndVideoView . addSubview ( adView )
[ 7 ] playbackController . add ( myControlsView )
playbackController . add ( adView )
// This container view will become `playbackController.view`.
return adAndVideoView
}
將程式碼分解為以下步驟: [1] 建立符合BCOVPlaybackSessionConsumer
協定的自訂控制項視圖。 BCOVPlaybackSessionConsumer
協定除了廣告之外還允許接收每個影片的基本播放訊息。 [2] 為視訊視圖和自訂控制項建立容器視圖。 [3] 將視訊容器和自訂控制項新增為子視圖。層次結構的組成順序與新增視圖的順序相同。 [4] 建立符合BCOVPlaybackSessionConsumer
協定的廣告控制項視圖。 [5] 為視訊視圖和控制項以及廣告視圖建立容器視圖。 [6] 將影片容器和廣告控制項視圖新增為子視圖。 [7] 使用區塊傳回的播放控制器物件將自訂控制項檢視和廣告控制項檢視註冊為會話使用者。
使用視圖策略有一個警告:您不能從視圖策略區塊內存取播放控制器的view
屬性。由於第一次存取播放控制器的view
屬性而呼叫該區塊,因此在視圖策略區塊中再次存取view
屬性將導致程式崩潰。
預設情況下,當 iOS 應用程式發送到後台或裝置被鎖定時,iOS 將暫停任何正在播放的影片。若要變更此行為,請將BCOVPlaybackController
物件的allowsBackgroundAudioPlayback
屬性設為true
。 (預設值為false
,表示播放將在背景暫停。)
您還應該遵循 Apple 在技術問答 QA1668 中設定的指南,為您的應用程式設定正確的背景模式和音訊會話類別。
在應用程式切換到背景之前,將AVPlayerLayer
與AVPlayer
分開(並在應用程式返回前台時重新連接)非常重要。當allowsBackgroundAudioPlayback
設定為true
時,Brightcove Player SDK 將為您處理此問題。
最後,在播放背景影片時(特別是使用播放清單時),您應該使用 iOS MPRemoteCommandCenter
API 為使用者提供鎖定螢幕和控制中心上的播放控制。
若要在應用程式中啟用畫中畫功能,請在實例化BCOVPUIPlayerView
物件時將BCOVPUIPlayerViewOptions
物件的showPictureInPictureButton
屬性設為true
。然後,「畫中畫」按鈕將顯示在任何支援該按鈕的裝置的控制列中。
為了讓畫中畫正常運作,您需要確保在專案的目標功能標籤的Background Modes
部分中開啟Audio, AirPlay, and Picture in Picture
模式。您還應該遵循 Apple 在技術問答 QA1668 中設定的指南,為您的應用程式設定正確的背景模式和音訊會話類別。
AVPictureInPictureControllerDelegate
方法透過BCOVPUIPlayerViewDelegate
傳遞。這些方法是:
func pictureInPictureControllerDidStartPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func pictureInPictureControllerDidStopPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func pictureInPictureControllerWillStartPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func pictureInPictureControllerWillStopPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func picture ( _ pictureInPictureController : AVPictureInPictureController , failedToStartPictureInPictureWithError error : Error )
func picture ( _ pictureInPictureController : AVPictureInPictureController , restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler : ( Bool ) -> Void )
有關詳細信息,請參閱 Apple 的 AVPictureInPictureControllerDelegate 文件。
若要實現您自己的畫中畫行為,請將BCOVPlaybackController
的allowsBackgroundAudioPlayback
屬性保留為false
,並保持BCOVPlaybackController
的pictureInPictureActive
屬性隨畫中畫狀態更新。如果您使用AVPictureInPictureController
,則可以使用pictureInPictureControllerDidStartPicture(inPicture:)
和pictureInPictureControllerDidStopPicture(inPicture:)
委託方法來更新此屬性。
您可以在 Apple 的「在自訂播放器中採用畫中畫」文件中閱讀更多關於實現畫中畫的資訊。
將混合格式的影片播放清單與畫中畫結合使用將導致畫中畫視窗在每個影片之間關閉。
iOS 和 iPadOS 14 引入了自動畫中畫行為,可以在Settings > General > Picture in Picture
中開啟/關閉該行為。為了使此功能按預期工作,播放器視圖必須等於螢幕的寬度,並且高度與寬度的比率必須至少為 0.57(16:9 或更大)。如果播放器視圖的寬度或高度小於這些值,當應用程式進入背景時,可能不會自動觸發畫中畫。
重要提示:IMA、FreeWheel、Pulse 和 SSAI 外掛各自處理畫中畫功能的方式不同。查看每個插件自述文件中的畫中畫部分以獲取更多資訊。
縮圖搜尋允許用戶沿著時間軸拖曳播放頭並查看縮圖作為相關內容的預覽。這使用戶能夠快速瀏覽影片檔案並找到他們感興趣的內容。
Apple 也將此功能稱為 Trick Play,並在其 HLS 創作規格中引用。
該功能預設啟用。如果您希望停用縮圖搜索,可以透過將BCOVPlaybackController
上的thumbnailSeekingEnabled
屬性設為false
來實現。
playbackController . thumbnailSeekingEnabled = false
您可以透過使用BCOVPUIPlayerView
或BCOVTVPlayerView
的委託方法來自訂縮圖預覽的佈局。
在 iOS 上,您可以調整高度、寬度和垂直偏移:
func setUpPlayerView ( ) {
let playerView = BCOVPUIPlayerView ( playbackController : nil )
playerView ? . delegate = self
...
}
// MARK: BCOVPUIPlayerViewDelegate
func playerViewShouldDisplayThumbnailPreview ( withRect playerView : BCOVPUIPlayerView ) -> CGRect {
let width : CGFloat = 100
let height : CGFloat = 56
let verticalOffset : CGFloat = - 60
var modifier : CGFloat = 1
if UIDevice . current . userInterfaceIdiom == . pad {
modifier = 2
}
return CGRect ( x : 0 , y : verticalOffset * modifier , width : width * modifier , height : height * modifier )
}
在 tvOS 上,您可以調整高度和寬度:
func setUpPlayerView ( ) {
let playerView = BCOVTVPlayerView ( options : nil )
playerView ? . delegate = self
...
}
// MARK: BCOVTVPlayerViewDelegate
func playerViewShouldDisplayThumbnailPreview ( withSize playerView : BCOVTVPlayerView ) -> CGSize {
var size = self . view . frame . size
size . width = size . width / 6
size . height = size . height / 6
return size
}
如果手動建立BCOVVideo
對象,您可以設定用於縮圖 WebVTT 來源的 URL:
if let url = URL ( string : " https://mydomain.com/master.m3u8 " ) {
var video = BCOVVideo . video ( withURL : url )
video = video . update ( { ( mutableVideo : BCOVMutableVideo ) in
mutableVideo . thumbnailVTTURL = URL ( string : " https://mydomain.com/thumbnail.webvtt " )
} )
}
縮圖搜尋僅適用於線上影片;下載/離線影片不支援此功能。
您可以透過呼叫insertVideo:afterVideoAtIndex:
在佇列中已有的另一個 BCOVVideo 之後將另一個 BCOVVideo 插入到BCOVPlaybackController
。
例如:
// This will insert the new video after the first video in the queue
playbackController . insert ( videoToInsert , afterVideoAt : 0 )
您可以使用兩種委託方法來收到請求成功或失敗的警報。
func playbackController(_ controller: BCOVPlaybackController, didInsert video: BCOVVideo, at index: UInt)
func playbackController(_ controller: BCOVPlaybackController, failedToInsert video: BCOVVideo)
通用串流並發 (GSC) 是一項根據觀眾的活動播放會話和預設並發限制來決定是否允許播放的服務。該服務是透過邊緣播放授權 (EPA) 服務請求的。此處使用用於檢索影片的相同 JWT,並且應包含uid
聲明、 climit
聲明和可選的sid
聲明。您的帳戶必須啟用此功能。
預設情況下,SDK 中未啟用通用流並發。如果您希望啟用它,請將BCOVPlaybackController
的streamConcurrencyEnabled
屬性設為true
。
playbackController . streamConcurrencyEnabled = true
sid
值可以包含在 JWT 中或作為BCOVPlaybackController
選項發送,這兩者都是可選的。 JWT 中的sid
值優先於BCOVPlaybackController
選項。
playbackController . options [ kBCOVAuthHeartbeatPropertyKeySessionId ] = " sessionId "
BCOVPlaybackControllerDelegate
中新增了新的委託方法,用於在達到並發限制時檢索活動會話。
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didReachMaxConcurrency sessions : [ AnyHashable : Any ] ) {
print ( " ( sessions ) " )
}
播放錯誤通常透過播放控制器的視訊播放事件進行處理和報告。如果您需要更深入地挖掘並追蹤特定影片或應用程式會話的問題,您可以利用 Brightcove Player SDK 的會話 ID 。會話 ID 是BCOVPlayerSDKManager
的屬性,您可以像這樣檢索:
let sdkSessionID = BCOVPlayerSDKManager . sharedManager ( ) . sessionID
會話 ID 是一個唯一的字串,在應用程式生命週期中不會更改。該字串與各種其他分析數據一起報告給 Brightcove 指標伺服器。如果您在使用特定應用程式實例或影片時遇到問題,您可以記錄會話 ID 並將其發送回您自己的公司伺服器。然後,您可以將會話 ID、視訊 ID 和任何其他相關資料傳送給 Brightcove 服務工程師,以協助診斷任何問題。
如果您需要組合播放器 SDK 插件,例如在播放由 Google IMA 管理的廣告的 DRM 保護的影片中添加字幕,則會建立每個插件的BCOVSessionProviders
並將其連結在一起,並且該鏈用於建構BCOVPlaybackController
。
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let imaSettings = IMASettings ( )
imaSettings . ppid = kIMAPublisherID
if let languageCode = NSLocale . current . languageCode {
imaSettings . language = languageCode
}
let renderSettings = IMAAdsRenderingSettings ( )
renderSettings . linkOpenerPresentingController = self
let adsRequestPolicy = BCOVIMAAdsRequestPolicy . videoPropertiesVMAPAdTagUrl ( )
// create the sidecar subtitles session provider. it has no upstream session provider.
let sidecarSessionProvider = sdkManager . createSidecarSubtitlesSessionProvider ( withUpstreamSessionProvider : nil )
// create a fairplay session provider with the sidecar session provider as its upstream session
let authProxy = BCOVFPSBrightcoveAuthProxy ( withPublisherId : nil ,
applicationId : nil )
let fairPlaySessionProvider = sdkManager . createFairPlaySessionProvider ( withAuthorizationProxy : authProxy ,
upstreamSessionProvider : sidecarSessionProvider )
// create the IMA session provider with an upstream sidecar subtitles session provider.
let imaSessionProvider = sdkManager . createIMASessionProvider ( with : imaSettings ,
adsRenderingSettings : renderSettings ,
adsRequestPolicy : adsRequestPolicy ,
adContainer : playerView ? . contentOverlayView ,
viewController : self ,
companionSlots : nil ,
upstreamSessionProvider : fairPlaySessionProvider )
開發人員可以控制AVPlayer
所使用的正向播放緩衝區的大小。這是透過設定AVPlayerItem
類別中的preferredForwardBufferDuration
屬性來完成的。
預設情況下,Brightcove Native Player SDK 設定preferredForwardBufferDuration
屬性的方式可以優化整體頻寬而不犧牲播放品質。此行為可以用您自己的價值觀覆蓋。
每個人都為頻寬付費,因此在不影響播放品質的情況下減少頻寬消耗非常重要。 Brightcove Native Player SDK 是 5.2.0 版的新增功能,可在影片播放時動態為您管理緩衝區大小。
在 iOS 10 之前, AVPlayer
緩衝盡可能多的視訊數據,最多可達 50 MB 左右。這對於用戶選擇視頻然後觀看直到結束的視頻觀看模型來說很好,但許多現代應用程序現在通過自動播放來“逗弄”視頻,希望在幾秒鐘後確保參與度。許多用戶只是轉向不同的影片。透過積極的緩衝,您最終可能會得到幾分鐘的緩衝視頻,這些視頻會隨著每次視頻展示而被丟棄。
Brightcove Native Player SDK 透過以較小的基線緩衝區啟動影片來解決此問題,然後隨著用戶觀看更多影片而增加基線緩衝區。在某一點之後,緩衝區大小就會受到限制,因為將其設置得太大既不實際也沒有幫助。
如果您想保留 Brightcove Native Player SDK 的預設行為,但修改緩衝區大小使用的最小值和最大值,您可以在設定BCOVPlaybackController
時執行以下操作:
// Create mutable dictionary to hold new values
if var options = playbackController . options {
// Set new values in dictionary
options [ kBCOVBufferOptimizerMethodKey ] = BCOVBufferOptimizerMethod . default . rawValue
options [ kBCOVBufferOptimizerMinimumDurationKey ] = minValue
options [ kBCOVBufferOptimizerMaximumDurationKey ] = maxValue
// Set new dictionary in your playback controller
playbackController . options = options
}
這些選項應該在呼叫playbackController.setVideos()
之前設定。
min
和max
:
AVPlayer
可能會緩衝從未查看過的資料。AVPlayerItem
中的一個特殊值,它告訴AVPlayer
確定自己的緩衝區大小。如果您不希望在當前播放會話中啟動任何緩衝區優化,則可以使用相同的技術,但將優化方法設為“無”,如下所示:
// Create mutable dictionary to hold new values
if var options = playbackController . options {
// Set new values in dictionary
options [ kBCOVBufferOptimizerMethodKey ] = BCOVBufferOptimizerMethod . none
// Set new dictionary in your playback controller
playbackController . options = options
}
將方法設為.none
時,iOS 將保持對轉送緩衝區大小的完全控制。
如果您想設定自己的播放緩衝區大小,請先按照上一節所述關閉緩衝區最佳化。然後,您可以實作以下BCOVPlaybackController
委託方法:
func playbackController ( _ controller : BCOVPlaybackController , didAdvanceTo session : BCOVPlaybackSession ) {
if let currentItem = session . player . currentItem {
// Set your preferredForwardBufferDuration value here.
currentItem . preferredForwardBufferDuration = newPreferredForwardBufferDurationValue
}
}
如果您想要隨時間動態變更緩衝區大小,可以以類似的方式在BCOVPlaybackController
的進度委託方法中設定session.player.currentItem.preferredForwardBufferDuration
:
func playbackController ( _ controller : BCOVPlaybackController , playbackSession session : BCOVPlaybackSession , didProgressTo progress : TimeInterval ) {
if let currentItem = session . player . currentItem {
// Set your preferredForwardBufferDuration value here.
currentItem . preferredForwardBufferDuration = newPreferredForwardBufferDurationValue
}
}
注意:Apple 特別將「preferred」放在preferredForwardBufferDuration
中,因為您可以設定任何您想要的值,但一般來說, AVPlayer
播放器只會將其用作指導。另請記住,將其設為零會將緩衝區大小的完全控制權傳回AVPlayer
。
您可以使用 AVPlayerViewController 而不是 BCOVPlaybackSession 類別使用的 AVPlayerLayer。使用 AVPlayerViewController 允許播放器使用本機 iOS 和 tvOS 播放器控件,但這種方法有其限制(見下文)。
要使用 AVPlayerViewController,您可以設定一個名為kBCOVAVPlayerViewControllerCompatibilityKey
的 BCOVPlaybackController 字典屬性:
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = sdkManager . createPlaybackController ( )
if var mutableOptions = playbackController . options {
// To use the AVPlayerViewController
mutableOptions [ kBCOVAVPlayerViewControllerCompatibilityKey ] = true
// To use the BCOVPlaybackSession's AVPlayerLayer
// mutableOptions[kBCOVAVPlayerViewControllerCompatibilityKey] = false
playbackController . options = mutableOptions
}
kBCOVAVPlayerViewControllerCompatibilityKey 的預設值為false
,這表示在未明確設定此字典屬性的情況下建立的 BCOVPlaybackController 將預設使用 BCOVPlaybackSession 的 AVPlayerLayer。
使用 AVPlayerViewController 時,Brightcove IMA、FreeWheel、Pulse 和 SSAI 廣告外掛程式相容。您可以使用 AVPlayerViewController 的contentOverlayView
作為顯示廣告的視圖(不適用於 SSAI)。
您可能希望在廣告播放之前和之後隱藏/顯示 AVPlayerViewController 的播放控制:
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didEnter adSequence : BCOVAdSequence ) {
avpvc . showsPlaybackControls = false
}
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didExitAdSequence adSequence : BCOVAdSequence ) {
avpvc . showsPlaybackControls = true
}
當使用具有 Brightcove IMA 插件的 AVPlayerViewController 以及具有「了解更多」按鈕的廣告時,您需要建立一個額外的 UIView 來用作廣告容器視圖。這是因為 AVPlayerViewController 的contentOverlayView
不是互動的,因此嘗試點擊「了解更多」按鈕將不會有任何效果。您可以使用playbackController:playbackSession:didEnterAdSequence:
和playbackController:playbackSession:didExitAdSequence:
委託方法來顯示和隱藏廣告容器視圖。
如果在 tvOS 上使用 IMA、FreeWheel、Pulse 或 SSAI 插件,將為每個廣告提示點建立AVInterstitialTimeRange
數組,並在關聯的AVPlayerItem
的interstitialTimeRanges
上設定。對於 IMA、FreeWheel 和 Pulse 插件,您需要建立播放/暫停手勢,以便當廣告處於活動狀態時,您可以正確暫停和恢復廣告,而不會影響影片本身的播放。這是一個例子:
func setUpAdPlayPauseGesture ( ) {
let playPauseGesture = UITapGestureRecognizer ( target : self , action : #selector ( playPauseAd ( _ : ) ) )
playPauseGesture . allowedPressTypes = [ NSNumber ( value : UIPress . PressType . playPause . rawValue ) ]
avpvc . view . addGestureRecognizer ( playPauseGesture )
self . playPauseGesture = playPauseGesture
}
@ objc
func playPauseAd ( _ gesture : UITapGestureRecognizer ) {
if insideAdSequence {
if adPlaying {
playbackController ? . resumeAd ( )
adPlaying = false
} else {
playbackController ? . pauseAd ( )
adPlaying = true
}
} else {
if avpvc . player ? . rate == 0 {
playbackController ? . play ( )
} else {
playbackController ? . pause ( )
}
}
}
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didEnterAdSequence adSequence : BCOVAdSequence ) {
insideAdSequence = true
}
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didExitAdSequence adSequence : BCOVAdSequence ) {
insideAdSequence = false
}
若要顯示廣告疊加層(例如倒數計時),請參閱您正在使用的廣告外掛程式自述文件的AVPlayerViewController 支援部分以獲得一些指導。
請注意,由於AVInterstitialTimeRange
的可用性,SSAI 的AVPlayerViewController
相容性特定於 tvOS。您仍然可以在 iOS 上播放,但影片的持續時間將包括所有廣告的持續時間。
我們有範例專案示範如何使用 AVPlayerViewController 與 Brightcove iOS SDK。您可以在此處找到 iOS 範例項目,在此處找到 tvOS 範例項目。
使用 AVPlayerViewController 時,傳送至 Brightcove Analytics 伺服器的 video_engagement 事件將報告player_width 和player_height 為0。
如果您使用播放授權服務,則需要使用播放服務BCOVPlaybackService.ConfigurationKeyAuthToken
設定金鑰。
// Video Request
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : videoID ,
BCOVPlaybackService . ConfigurationKeyAuthToken : authToken
]
playbackService . findVideo ( withConfiguration : configuration ,
queryParameters : nil ) { ( video : BCOVVideo ? ,
jsonResponse : Any ? ,
error : Error ? ) in
...
}
// Playlist Request
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : playlistID ,
BCOVPlaybackService . ConfigurationKeyAuthToken : authToken
]
playbackService . findPlaylist ( withConfiguration : configuration ,
queryParameters : nil ) { ( playlist : BCOVPlaylist ? ,
jsonResponse : Any ? ,
error : Error ? ) in
...
}
注意:對於播放列表,播放清單中的所有影片必須使用相同的令牌。在後續版本中,可以為播放清單中的每個影片分配不同的令牌。您將負責維護視訊 id 和令牌之間的映射。
播放控制支援開箱即用的 VoiceOver。預設情況下,如果啟用 VoiceOver,BCOVPlayerUI 控制視圖將不會自動隱藏。在播放控制器的視圖上使用雙擊 VoiceOver 啟動手勢將切換控制視圖的可見性。在播放控制器的視圖上設定了一個關聯的accessibilityHint
。每個 BCOVPlayerUI 控制項的accessibilityLabel
都可以在您的應用程式中進行自訂。
若要變更控制視圖中任何按鈕的accessibilityLabel
值,您必須將物件設定為BCOVPUIButtonAccessibilityDelegate
,如下所示:
playerView . controlsView . setButtonsAccessibilityDelegate ( self )
然後,您必須透過實作與此類似的- (NSString *)accessibilityLabelForButton:(BCOVPUIButton *)button isPrimaryState:(BOOL)isPrimaryState
方法來使該物件符合BCOVPUIButtonAccessibilityDelegate
協定:
func accessibilityLabel ( for button : BCOVPUIButton ,
isPrimaryState : Bool ) -> String ? {
switch button . tag {
case BCOVPUIViewTag . buttonPlayback . rawValue :
return isPrimaryState ? NSLocalizedString ( " Start Playback " , comment : " playback button " ) : NSLocalizedString ( " Pause Playback " , comment : " playback button " )
case BCOVPUIViewTag . buttonScreenMode . rawValue :
return isPrimaryState ? NSLocalizedString ( " Enter Fullscreen " , comment : " screenmode button " ) : NSLocalizedString ( " Exit Fullscreen " , comment : " screenmode button " )
case BCOVPUIViewTag . buttonJumpBack . rawValue :
return nil
case BCOVPUIViewTag . buttonClosedCaption . rawValue :
return nil
case BCOVPUIViewTag . buttonVideo360 . rawValue :
return nil
case BCOVPUIViewTag . buttonPreferredBitrate . rawValue :
return nil
default :
return nil
}
}
如果傳回nil
值,則將使用預設值。
在播放控制器上設定accessibilityHint
可以像這樣完成:
playbackController . view . accessibilityHint = " Double tap to show or hide controls "
同樣,您可以在當前時間和持續時間標籤上設定accessibilityLabel
以及進度滑桿,如下所示:
playerView . controlsView . durationLabel . accessibilityLabelPrefix = " Total Time "
playerView . controlsView . currentTimeLabel . accessibilityLabelPrefix = " Current Time "
playerView . controlsView . progressSlider . accessibilityLabel = " Timeline "
您可以提供 Brightcove iOS SDK 不支援開箱即用的其他語言在地化。
+
按鈕來新增本地化。若要為中國的播放服務、指標和分析伺服器定義代理域,請將BCOVGlobalConfiguration
單例的chinaProxyDomain
屬性設定為完全限定網域名稱。例如:
BCOVGlobalConfiguration . sharedConfig . chinaProxyDomain = " host.mydomain.com "
在使用Native Player SDK的任何其他服務之前,請務必設定代理網域。有關詳細信息,請參閱BCOVGlobalConfiguration 類別參考。
根據您需要應用程式在音訊播放時執行的方式,您可以配置 AVAudioSession 以滿足您的特定需求。例如,如果您想支援 AirPlay 2 和多個音訊路由,請參閱本自述文件的 AirPlay 部分。
基本的 AVAudioSession 可以這樣配置:
var categoryError : NSError ?
var success : Bool
do {
// see https://developer.apple.com/documentation/avfoundation/avaudiosessioncategoryplayback
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback )
success = true
} catch let error as NSError {
categoryError = error
success = false
}
if !success {
// Handle error
}
此配置通常可以在 AppDelegate 的application:didFinishLaunchingWithOptions:
方法中完成。在某些情況下,您可能需要更複雜的 AVAudioSession 配置,例如,如果您希望在應用程式中的音訊靜音時允許聽到其他應用程式的音訊。在這種情況下,您可以在有權存取目前 AVPlayer 的視圖控制器中設定 AVAudioSession。例如:
func setUpAudioSession ( ) {
var categoryError : NSError ?
var success : Bool
do {
if let currentPlayer = currentPlayer {
// If the player is muted, then allow mixing.
// Ensure other apps can have their background audio
// active when this app is in foreground
if currentPlayer . isMuted {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , options : . mixWithOthers )
} else {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , options : AVAudioSession . CategoryOptions ( rawValue : 0 ) )
}
} else {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , options : AVAudioSession . CategoryOptions ( rawValue : 0 ) )
}
success = true
} catch let error as NSError {
categoryError = error
success = false
}
if !success {
print ( " AppDelegate Debug - Error setting AVAudioSession category. Because of this, there may be no sound. ( categoryError! ) " )
}
}
範例程式碼可以在我們的 VideoCloudBasicPlayer 範例專案中找到。
您可以在此處閱讀有關 AVAudioSession 的更多資訊。
Brightcove Player SDK 支援純音訊串流並包含一些純音訊功能。如果您為影片配置了海報影像,則該影像將顯示在BCOVPUIPlayerView
的contentOverlayView
中。您可以使用BCOVPUIPlayerViewOptions
上的contentModeForPosterImage
屬性來調整海報影像視圖的UIViewContentMode
,預設值為UIViewContentModeScaleAspectFit
。
您可能還希望始終保持播放器控制項可見,在這種情況下,您可以在BCOVPUIPlayerViewOptions
上啟用keepControlsVisible
。
如果您不想顯示海報圖像或只是想要更緊湊的播放視圖,您可以將BCOVPUIPlayerView
父視圖的高度設置為88 pt 的高度以實現緊湊(< 450 pt)佈局,或將高度設置為44 pt 以實現緊湊的佈局。
如果您不使用automaticControlTypeSelection
則可以使用三種預先配置的純音訊BCOVPUIBasicControlView
佈局:
basicControlViewWithAODLayout
basicControlViewWithLiveAudioLayout
basicControlViewWithLiveDVRAudioLayout
如果串流是純音頻或視訊+音頻,您也可以使用playbackController:playbackSession:determinedMediaType
委託方法收到通知:
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
determinedMediaType mediaType : BCOVSourceMediaType ) {
switch mediaType {
case BCOVSourceMediaType . audio :
print ( " Source is Audio Only " )
case BCOVSourceMediaType . audioVideo :
print ( " Source is Audio and Video " )
default :
break
}
}
我們的VideoCloudBasicPlayer 支援在鎖定畫面、控制中心和AirPlay 上顯示媒體訊息。有關實現詳細信息,請參閱NowPlayingHandler
類別。
影片導視廣告是一種簡短的資源,通常為 10 秒或更短,在所有其他媒體之前播放,通常會顯示您的影片所代表的品牌或公司。播放器將像任何其他影片一樣從 Playback API 請求導視廣告,並將其插入廣告和內容之前。
保險桿是玩家等級的功能,這意味著給定的玩家只能與單一保險桿相關聯。這些播放清單共用相同的導視影片。有兩種方法可以配置播放器來播放導視影片:
bumperID
。要尋找的影片的 ID。 // Using `bumperID`
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : videoID ,
BCOVPlaybackService . ConfigurationKeyBumperID : bumperID
]
// Using `bumperReferenceID`
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : playlistID ,
BCOVPlaybackService . ConfigurationKeyBumperReferenceID : bumperReferenceID
]
// With a Video Request
playbackService . findVideo ( withConfiguration : configuration ,
queryParameters : nil ) { ( video : BCOVVideo ? ,
jsonResponse : Any ? ,
error : Error ? ) in
...
}
// With a Playlist Request
playbackService . findPlaylist ( withConfiguration : configuration ,
queryParameters : nil ) { ( playlist : BCOVPlaylist ? ,
jsonResponse : Any ? ,
error : Error ? ) in
...
}
bumper_id
欄位可以在 VideoCloud/Studio 的自訂欄位中定義。無需先前定義的簽名即可使用bumper_id
。 bumper_id
必須是有效的視訊 ID。
注意:透過自訂欄位( bumper_id
欄位)傳遞的 BumperID 優先於播放服務中的任何 ID。
緩衝播放時可以隱藏播放控制。
let options = BCOVPUIPlayerViewOptions ( )
options . automaticControlTypeSelection = true
options . showBumperControls = false
let playerView = BCOVPUIPlayerView ( playbackController : nil , options : options , controlsView : nil )
如果automaticControlTypeSelection
選項設為true
,保險桿的佈局將適應內容(僅限視訊或音訊)。 basicControlViewWithVODLayout
和basicControlViewWithAODLayout
佈局是為保險桿設計的, Live
或LiveDVR
佈局不可用。當保險桿處於活動狀態時,播放控制具有獨特的外觀:
對互動性的支援已整合到核心BrightcovePlayerSDK框架中。有關使用 Brightcove Native Player SDK 互動性的完整詳細信息,請參閱互動指南。
如果內容打包為 MP4,您可以將 URL 直接貼到大多數 Web 瀏覽器中,影片就會播放(或下載到您的檔案系統,您可以在本機播放)。如果內容打包為 HLS,您可以使用 QuickTime Player 進行測試:選擇File -> Open Location…
並貼上.m3u8
播放清單 URL,影片應該可以播放。
這是從非主執行緒呼叫僅限主執行緒的 UIKit 或 AVFoundation 方法的常見症狀。 BCOVPlaybackControllerDelegate
上的委託方法始終在主執行緒上呼叫。
此訊息表示預設來源選擇策略無法確定要選擇哪個來源。預設策略選擇第一個deliveryMethod
為kBCOVSourceDeliveryHLS
(“HLS”)的來源。如果未找到 HLS 來源,其回退行為將選擇第一個deliveryMethod
為kBCOVSourceDeliveryMP4
(「MP4」)的來源。如果影片中不存在deliveryMethod
為「HLS」或「MP4」的來源,則策略將選擇影片的第一個來源(無論deliveryMethod
為何)。如果您對其選擇不滿意,可以使用-[BCOVPlayerSDKManager createBasicSessionProviderWithOptions:]
並傳入具有自訂sourceSelectionPolicy
屬性集的BCOVBasicSessionProviderOptions
實例。手動建立影片和來源時,請確保使用適當的deliveryMethod
建立來源。
控制應用程式是否在 iOS 應用程式中發出音訊的 API 是 AVAudioSession API。音訊會話對於應用程式來說是全域性的,這意味著它的配置會影響由 Player SDK 創建的 AVPlayer 發出的聲音,以及應用程式可能產生的其他聲音。由於播放器 SDK 無法知道應用程式希望如何為其他聲音配置音訊會話,因此它根本不會影響音訊會話。這意味著,除非您明確配置應用程式的音訊會話,否則您將繼承在裝置靜音時抑制任何和所有音訊的預設行為,包括 AVPlayer 發出的音訊。為了符合 Apple 關於音訊播放的建議,您(應用程式開發人員)必須根據應用程式的特定需求配置音訊會話。
有關更多信息,請參閱本自述文件中的 AVAudioSession 配置部分。
如果您有疑問、需要協助或想要提供回饋,請使用支援入口網站或聯絡您的客戶經理。若要接收新 SDK 軟體版本的通知,請訂閱 Brightcove Native Player SDK Google 群組。