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 ( )