ブライトコーブは、次の iOS バージョンの最新パブリック リリースで最新の iOS SDK のアクティブなサポートを提供します。
ブライトコーブは、次の iOS バージョンのパッシブ サポートを提供します。
Core SDK は、アラビア語 (ar)、英語 (en)、フランス語 (fr)、ドイツ語 (de)、日本語 (ja)、韓国語 (ko)、スペイン語 (es)、簡体字中国語 (zh-Hans)、繁体字中国語にローカライズされています。中国語 (zh-Hant)。ローカライズのメリットを得るには、アプリも同じ言語とロケールにローカライズする必要があります。詳細については、「カスタム ローカリゼーション」セクションを参照してください。
すべての SDK コンポーネント (コア フレームワークとプラグイン フレームワーク) は、同じバージョン番号でリリースされます。単一のコンポーネントをアップグレードする場合は、すべてのコンポーネントを同じバージョンにアップグレードします。
Apple Silicon M1 上の Xcode 12 およびユニバーサル フレームワーク (.framework) を使用するプロジェクトの場合、arm64 シミュレーター用のプロジェクトをビルドするとビルド エラーが返されます。
*ld: building for iOS Simulator, but linking in dylib built for iOS, file for architecture arm64*
arm64 シミュレーター用にビルドするには、アプリケーション ターゲットの [ビルド設定] タブにAny iOS Simulator SDK
の [除外アーキテクチャ] ビルド設定にarm64
が追加されていることを確認してください。
Brightcove Player SDK のリリース 6.10.0 では、XCFrameworks をサポートするためのコアと各プラグインのサブスペックが追加されています。各サブスペックのデフォルト値は/XCFramework
です。
ポッドスペック名 | サブスペック名 |
---|---|
ブライトコーブ プレーヤー コア | Brightcove-Player-コア/フレームワーク Brightcove-Player-Core/XCFramework |
Brightcove-Player-DAI | Brightcove-Player-DAI/フレームワーク Brightcove-Player-DAI/XCFramework |
ブライトコーブ プレーヤー フリーホイール | Brightcove-Player-FreeWheel/フレームワーク Brightcove-Player-FreeWheel/XCFramework |
Brightcove-Player-GoogleCast | Brightcove-Player-GoogleCast/フレームワーク Brightcove-Player-GoogleCast/XCFramework |
ブライトコーブ プレーヤー-IMA | Brightcove-Player-IMA/フレームワーク Brightcove-Player-IMA/XCFramework |
Brightcove-Player-Omniture | Brightcove-Player-Omniture/フレームワーク Brightcove-Player-Omniture/XCFramework |
ブライトコーブ プレーヤー パルス | Brightcove-Player-Pulse/フレームワーク Brightcove-Player-Pulse/XCFramework |
ブライトコーブ プレーヤー SSAI | Brightcove-Player-SSAI/フレームワーク Brightcove-Player-SSAI/XCFramework |
Brightcove-Player-OpenMeasurement | - |
Brightcove Player SDK のリリース 6.12.0 では、 Brightcove-Player-FreeWheel
およびBrightcove-Player-Omniture
ポッドスペックが更新され、 BrightcovePlayerSDK
の動的バージョンがインストールされます。
ポッドスペック名 | フレームワークの種類 | 依存 |
---|---|---|
Brightcove プレーヤー コア | 動的 | - |
Brightcove-Player-DAI (6.12.7 以降で利用可能) | 動的 | ブライトコーブ プレーヤー コア |
ブライトコーブ プレーヤー フリーホイール | 動的 | iOS 用 Brightcove-Player-Core、 tvOS 用 Brightcove-Player-Core |
Brightcove-Player-GoogleCast | 静的 | ブライトコーブ プレーヤー コア |
ブライトコーブ プレーヤー-IMA | 動的 | ブライトコーブ プレーヤー コア |
Brightcove-Player-Omniture | 動的 | ブライトコーブ プレーヤー コア |
ブライトコーブ プレーヤー パルス | 動的 | ブライトコーブ プレーヤー コア |
ブライトコーブ プレーヤー SSAI | 動的 | Brightcove プレーヤー コア、 Brightcove-Player-OpenMeasurement (オープン測定のみ) |
Brightcove-Player-OpenMeasurement (6.10.0 以降で利用可能) | 動的 | - |
FairPlay で保護されたビデオのサポートは、コアのBrightcovePlayerSDKフレームワークに統合されています。 Brightcove Native Player SDK での FairPlay の使用の詳細については、FairPlay ガイドを参照してください。
サイドカー字幕のサポートは、コアのBrightcovePlayerSDKフレームワークに統合されています。 Brightcove Native Player SDK でのサイドカー字幕の使用の詳細については、サイドカー字幕ガイドを参照してください。
リリース 6.0.0 以降、Brightcove Native Player SDK を使用すると、FairPlay 暗号化で保護されたビデオを含む HLS ビデオをダウンロードして、オンラインまたはオフラインで後で再生できるようになります。詳細については、アプリ開発者ガイドを参照してください。
FairPlay を使用したビデオのダウンロードとオフライン再生に関する iOS アプリ開発者ガイド
Brightcove Player SDK は、iOS および tvOS 用のインストール パッケージを、Frameworks および XCFrameworks としてパッケージ化された動的ライブラリとして提供します。導入は iOS 12.0 以降でサポートされています。
CocoaPods を使用して、Brightcove Player SDK をプロジェクトに追加できます。最新のBrightcove-Player-Core
ポッドスペックはここで見つけることができます。 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
サブ仕様をポッドに追加することでインストールできます。
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
インストールを更新するときは、CococaPods マスター リポジトリを更新するのと同じように、BrightcoveSpecs リポジトリのローカル コピーを更新して、最新の podspecs をローカルに入手することをお勧めします。通常、ターミナルで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 を以下に示します。
成分 | URL |
---|---|
Brightcove プレーヤー コア | https://github.com/brightcove/brightcove-player-sdk-ios/tags |
Brightcove-Player-DAI | https://github.com/brightcove/brightcove-player-sdk-ios-dai/tags |
ブライトコーブ プレーヤー フリーホイール | https://github.com/brightcove/brightcove-player-sdk-ios-fw/tags |
Brightcove-Player-GoogleCast | https://github.com/brightcove/brightcove-player-sdk-ios-googlecast/tags |
ブライトコーブ プレーヤー-IMA | https://github.com/brightcove/brightcove-player-sdk-ios-ima/tags |
Brightcove-Player-Omniture | https://github.com/brightcove/brightcove-player-sdk-ios-omniture/tags |
ブライトコーブ プレーヤー パルス | https://github.com/brightcove/brightcove-player-sdk-ios-pulse/tags |
ブライトコーブ プレーヤー 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 を作成してから、BCOVPUIPlayerView を作成します。ここで、Playback Controller (およびそれによって再生されるすべてのビデオ) をコントロールに関連付けます。
// 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
に設定されている場合、 BCOVPUIPlayerView
イニシャライザに渡されるBCOVPUIBasicControlView
プロパティは無視されます。
ビデオ + オーディオ ストリーム
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 )
さまざまな種類のビデオをサポートするために 3 つのレイアウトが提供されています。
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 )
空のレイアウト ビューを作成して、そこに独自のビュー (ロゴ、コントロール、何もないなど) を配置することもできることに注意してください。このコードは、上で作成した logoLayoutView1 内にUIImage
ロゴを配置する方法を示しています。
// 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 )
レイアウト ビューにはさまざまなコントロールがパッケージ化されているため、それらは配列に並べられ、それぞれが 1 行のコントロール、つまりコントロール バーを表します。縦向きと横向きで異なるレイアウトを使用できるため、通常は 2 つの異なるコントロール バー配列を設定することになります。
横向きの標準レイアウトでは、コントロールは 1 つの配列に配置され、その配列はコントロールのセット全体を表す別の配列に格納されます。
let standardLayoutLine1 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
currentTimeLayoutView ,
timeSeparatorLayoutView ,
durationLayoutView ,
progressLayoutView ,
spacerLayoutView1 ,
logoLayoutView1 ,
spacerLayoutView2 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView
]
let standardLayoutLines = [ standardLayoutLine1 ]
縦向きのコンパクトなレイアウトでは、コントロールの 2 つの配列が各行に 1 つずつ作成されます。これらの配列は、コンパクトなレイアウトを表す別の配列にパッケージ化されます。
各レイアウトのほとんどのコントロールにまったく同じオブジェクトが使用されていることに注意してください。これが完了し、縦向きと横向きを切り替えると、オブジェクトはスムーズなアニメーションを使用して新しい位置に移動します。
let compactLayoutLine1 = [
currentTimeLayoutView ,
progressLayoutView ,
durationLayoutView
]
let compactLayoutLine2 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
spacerLayoutView1 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView ,
logoLayoutView2
]
let compactLayoutLines = [
compactLayoutLine1 ,
compactLayoutLine2
]
最後に、2 つのレイアウト構成 (1 つは全幅用、もう 1 つはコンパクト幅用) があるため、新しい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 で再生するためのコントロールが組み込まれています。 Brightcove Native Player SDK での組み込み TV プレーヤー UI の使用の詳細については、TV プレーヤー ガイドを参照してください。
BCOVPlaybackController
のsetAllowsExternalPlayback
プロパティをtrue
に設定して、AirPlay 機能を有効にします。 AirPlay デバイスがネットワーク上で見つかった場合、AirPlay ボタンが再生コントロールに表示されます。
現在、IMA は AirPlay をサポートする唯一の広告プラグインであり、プレロール広告やポストロール広告を使用する場合にのみサポートされます。 Pulse、SSAI、または FreeWheel 広告プラグインで AirPlay を使用すると、予期しない動作が発生する可能性があります。
AirPlay 2 もサポートし、オーディオ出力に複数のデバイスを選択できるようにしたい場合は、いくつかの追加作業を行う必要があります。まず、 routeSharingPolicy
を設定できるように AVAudioSession を構成する必要があります。例えば:
do {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , mode : . moviePlayback , policy : . longFormVideo )
} catch {
print ( " Error setting AVAudioSession category " )
}
また、 MPRemoteCommandCenter
経由で少なくとも 1 つの再生コマンドを設定する必要があります。少なくとも、 pauseCommand
とplayCommand
両方を設定する必要があります。例えば:
let center = MPRemoteCommandCenter . shared ( )
center . pauseCommand . addTarget { _ in
playbackController . pause ( )
return . success
}
center . playCommand . addTarget { _ in
playbackController . play ( )
return . success
}
デバイスは、2 つのデリゲート メソッドを持つAVRoutePickerView
を利用します。これらのデリゲート メソッドはBCOVPUIPlayerViewDelegate
に渡されます。方法は次のとおりです。
func routePickerViewDidEndPresentingRoutes ( _ routePickerView : AVRoutePickerView )
func routePickerViewWillBeginPresentingRoutes ( _ routePickerView : AVRoutePickerView )
AirPlay ルートの検出に使用されるAVRouteDetector
BCOVPUIBasicControlView
オブジェクトで使用できるため、必要に応じてそのrouteDetectionEnabled
プロパティを有効または無効にできます。
Apple のドキュメントによると、「ルート検出により電力消費が大幅に増加するため、不要になった場合はオフにする必要があります。 」
playerView ? . controlsView . routeDetector . isRouteDetectionEnabled = false
AirPlay 2 をアプリに組み込む方法の詳細については、「AirPlay 2 をアプリに組み込む」ドキュメントを参照してください。
Native Player SDK には、360 度の全天球ビデオをインタラクティブに表示するためのサポートが含まれています。 360 度ビデオには、値「equirectangular」を含む「projection」フィールド プロパティでタグ付けする必要があります。これらのビデオは他のビデオと同じ方法でロードおよび再生されますが、AVPlayerLayer ではなく CAMetalLayer に表示されます。
注: 現時点で 360 ソース ビデオでサポートされている投影形式は「正距円筒図法」のみです。
PlayerUI にはビデオ 360 のサポートも組み込まれており、デフォルトのパン ジェスチャ、ビューのジャイロモーション検出、およびビデオ 360 アセットの再生時に表示される新しいビデオ 360 ボタンが提供されます。このボタンは iPhone にのみ表示され、通常のビューと「VR ゴーグル」ビューを切り替えることができます。このビューでは、画面が 2 つに分割され、それぞれの目に同じシーンがレンダリングされ、デバイスを頭の中で使用できるようになります。取り付けられた構成。 iPad では、動作モードが 1 つだけであるため、ビデオ 360 ボタンは必要ありません。パン ジェスチャのサポートによるモーション検出です。
Video 360 のサポートは、ビデオを再生するのと同じくらい簡単です。 「投影」フィールド プロパティが検出されると、Native Player SDK は Metal でのビデオのセットアップと表示、および必要に応じて Video 360 ボタンのインストールを自動的に処理します。
Video Cloud の外部で 360 度ビデオを再生している場合は、値「equirectangular」を持つ「projection」プロパティをBCOVVideo
オブジェクトに必ず追加してください。
VR ゴーグル モードで最高のユーザー エクスペリエンスを提供するには、 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
プロパティを使用して、これらのパラメーターを設定できます。このプロパティは、 pan
、 tilt
、 zoom
などの基本的な仮想カメラ設定を備えたBCOVVideo360ViewProjection
クラスです。設定を変更するには、現在のインスタンスのコピーを作成し、新しいインスタンスの設定を変更して、それをviewProjection
プロパティに割り当て直します。
iOS 用 Brightcove Player SDK へのエントリ ポイントは、 BCOVPlayerSDKManager
シングルトン オブジェクトです。このマネージャーは、プラグイン コンポーネントの登録やその他のいくつかのハウスキーピング タスクを処理しますが、主にオブジェクト ファクトリとして機能します。アプリのビュー コントローラーは Manager への参照を取得し、それを使用してBCOVPlaybackController
を作成します。再生コントローラーのview
プロパティは、最終的にビデオ コンテンツを画面上に表示する AVPlayerLayer オブジェクトを含む UIView を公開します。再生コントローラーはBCOVPlaybackControllerDelegate
も受け入れます。これを実装すると、さまざまなビデオ再生イベントに応答できます。
再生コントローラーは、現在のビデオの再生に影響を与えるメソッドとプロパティを提供します。ただし、内部的には、再生コントローラーはBCOVPlaybackSession
オブジェクトに委任します。再生セッションは、ビデオ コンテンツの準備と再生という実際の作業を実行し、ビデオのメタデータとAVPlayer
が含まれます。再生コントローラーには、ビデオの終了時に自動的に、またはメソッド呼び出しを使用して手動で、現在の再生セッションから次の再生セッションに進むメカニズムがあります。再生コントローラーが新しいセッションに進むと、前のセッションは破棄され、再度使用することはできません。
再生コントローラーには他に 2 つの要素があります。 BCOVPlaybackSessionProvider
とBCOVPlaybackSessionConsumer
のリストです。名前が示すように、再生セッション プロバイダーは、再生セッションを作成し、それらを再生コントローラーに配信する責任があります。次に、再生コントローラーは、リスト内の各再生セッション コンシューマーにセッションを配信します。セッション プロバイダー API とセッション コンシューマー API はどちらもプラグイン開発者が使用するように設計されており、このドキュメントでは詳しく説明しません。
上で説明したクラスによって提供される再生機能に加えて、いくつかの値クラスがあります。これらは、iOS 用 Player SDK に固有のデータを保持するために使用されます。これらのそれぞれについては、以下のそれぞれのセクションで詳しく説明します。
iOS 用 Brightcove プレーヤー 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 を利用しています。
ただし、プレイリスト内の今後のビデオのプリロードをより詳細に制御したい場合があります。考えられるアプローチの 1 つは、2 つの再生コントローラーを使用してビデオのリストをダブルバッファリングすることです。次に例を示します。
playbackController1.setVideos([videos.firstObject])
) に渡します。playbackController:didProgressTo:
デリゲート メソッドを使用して、現在のビデオが次のビデオのプリロードを開始する位置まで十分に進んだかどうかを判断します。実用的な例として、Player Samples リポジトリから VideoPreloading サンプル アプリをダウンロードできます。
注: クライアントのデバイスで利用可能なメモリの量と接続速度を考慮することが必要になる場合があります。 Wi-Fi に接続していない場合、ビデオをプリロードすると、現在のビデオのネットワーク リソースに影響を与える可能性があります。
iOS 用 Brightcove プレーヤー SDK は、クライアントに複数の URL および配信タイプ ( BCOVSource
) を 1 つのビデオ ( BCOVVideo
) に添付する機能を提供します。たとえば、ビデオが Playback Service によって取得されている場合、1 つのビデオに HLS または MP4 レンディションと、HTTP および HTTPS バージョンが混在している可能性があります。 これらのソースのうちどれが選択されるかは、ソース選択ポリシー ブロックによって決定されます。デフォルトのソース選択ポリシーでは、各BCOVVideo
の最初の HLS BCOVSource
が選択され、HTTP よりも HTTPS ソースが優先されます。
ソースの選択は、 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 )
このデフォルトの選択ポリシーが機能しない場合は、ソースを選択するための代替手段がいくつかあります。
Playback Service 経由で Video Cloud からビデオを取得する場合は、 playbackController.setVideos()
を呼び出す前に、 BCOVVideo
の update メソッドを使用して、必要なソースのみを含めます (詳細については、「値」セクションを参照してください)。
ヘルパー メソッド[BCOVBasicSourceSelectionPolicy sourceSelectionHLSWithScheme:scheme]
を使用して、特定のスキームを優先するポリシーを作成できます。これは、HTTPS を優先するデフォルトのソース選択ポリシーを作成するために使用される方法です。
ビデオ オブジェクトの更新と同様に、独自のソース選択ブロックを実装することもできます。
options . sourceSelectionPolicy = { ( video : BCOVVideo ? ) -> BCOVSource ? in
< Check video . sources for source >
< Return source >
}
MP4 ビデオの使用に関しては、App Store の制限があることに注意してください。詳細については、最新の Apple Developer 情報を確認してください。
iOS 用 Brightcove Player SDK は、ビデオの優先ビットレートを設定する方法を提供します。希望のビットレート オプションと、オプションを表示するために作成されるビュー コントローラーの構成を含む BCOVPreferredBitrateConfig オブジェクトを作成できます。
メニューのタイトルはオプションです。ビットレート オプションは、各辞書に 1 つのキーと値のペアを持つ NSDictionary の配列です。キーはオプション名として使用され、値はそのオプションのビットレートを bps (ビット/秒) で表す NSNumber です。入力するビットレートは、ビデオ アセットのレンディションのビットレートにマッピングできる値です。レンディションの詳細については、「プロファイルの取り込みのベスト プラクティス」を参照してください。
以下に例を示します。
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 )
エンドユーザーがオプションの 1 つを選択すると、現在の AVPlayerItem のpreferredPeakBitRate プロパティがオプションの値に設定されます。ビデオがプレイリストにある場合、次に再生されるビデオにもpreferredPeakBitRate値が設定されます。
preferredPeakBitRate にゼロ以外の値を設定した後は、AVPlayer が現在のバッファリングされたキャッシュの最後に到達するまで品質の違いに気付かない場合があります。
さらに、好みの初期値のインデックスを設定する機能を提供するconfigWithMenuTitle:bitrateOptions:andIndexofInitialSelection:
イニシャライザーを使用することもできます。インデックスは、 bitrateOptions
配列内の目的のオプションのインデックスと相関している必要があります。
さらに、 BCOVPlaybackController
オブジェクトでsetPreferredPeakBitRate:
メソッドを使用して、現在および将来のセッションの優先ビットレートをプログラム的に設定することもできます。
注: エンドユーザーには、preferredPeakBitRate のデフォルト値 (0) に戻る方法を提供する必要があります。これを行うには、ビットレート値 0 のオプションを指定します。ビットレート オプション 0 を指定しない場合、エンドユーザーのオプションのリストに「自動」オプションが追加されます。
詳細については、preferredPeakBitRate に関する Apple のドキュメントを参照してください。
iOS 用 Brightcove Player SDK は、再生情報を取得するための 2 つのメカニズムを提供します。再生コントローラーは、 BCOVPlaybackControllerDelegate
を実装するデリゲート プロパティを提供します。デリゲートはこれらのオプションのメソッドを実装して、進行状況、継続時間の変更、その他のイベントなどの再生メタデータの通知を受け取ることができます。広告プラグインがインストールされている場合は、このデリゲートを使用して広告の再生に関する情報を提供することもあります。ライフサイクル イベント デリゲート メソッドは、再生状態の変化を通知するイベントを提供します。たとえば、プレーヤーが一時停止状態から再生状態に移行すると、ライフサイクル イベント デリゲート メソッドがkBCOVPlaybackSessionLifecycleEventPlay
イベントで呼び出されます。デフォルトのライフサイクル イベントはBCOVPlaybackSession
で宣言されます。 Brightcove が提供するプラグインは、各プラグインで定義されている追加のライフサイクル イベントを追加します。
再生コントローラーでは 1 つのデリゲートが許可されます。多くの場合、情報を取得するにはこれで十分です。デリゲートの実装は、必要に応じて値とイベントをアプリのさまざまな部分に広めることができます。プラグインを開発するときのように、複数の代表者が必要な場合、 BCOVPlaybackSessionConsumer
代表者は、ADデータを含む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
、中断が長すぎると回復を試みることができます。これが発生した場合、Lifecycle Delegateメソッドは、 kBCOVPlaybackSessionLifecycleEventFailedToPlayToEndTime
イベントで呼び出されます。このイベントが発生した場合、再生は自動的に回復しません。このイベントから回復するには、クライアントコードでネットワークが回復するときに検出する必要があります。
ネットワークが回復したと判断したら、 playbackController.resumeVideo(at:withAutoPlay:)
を使用して、プレーヤーを再発行できます。再開したい場所を追跡する必要があります。プレイヤーは、広告が再生されたり、分析が妨げられるのを防ぐために、ライフサイクルイベントや進捗イベントを抑制するために最善の努力をします。
playbackController.resumeVideo(at:withAutoPlay:)
を呼び出すと、プレーヤーはkBCOVPlaybackSessionLifecycleEventResumeBegin
のタイプのライフサイクルイベントを送信します。 kBCOVPlaybackSessionLifecycleEventResumeComplete
kBCOVPlaybackSessionLifecycleEventResumeFail
送信されます。
playbackController.resumeVideo(at:withAutoPlay:)
kBCOVPlaybackSessionLifecycleEventResumeComplete
またはkBCOVPlaybackSessionLifecycleEventResumeFail
を受信するまで、2回目に電話をかける必要があります。ユーザーにネットワークが不安定すぎるというメッセージを提供する前に、再試行制限を課したい場合があります。
AVPlayer
がまだネットワークにアクセスできるが、ネットワークが遅すぎるためにビデオが失速する場合、Lifecycle DelegateメソッドはkBCOVPlaybackSessionLifecycleEventPlaybackStalled
イベントで呼び出されます。再生が再開できる場合、Lifecycle DelegateメソッドはkBCOVPlaybackSessionLifecycleEventPlaybackRecovered
イベントで呼び出されます。これらのイベントは、通常の再生が停止し、ビデオのシークまたは初期負荷中に発生するバッファリングをカバーしない場合のみをカバーしています。
ビデオが最初に読み込まれている場合、SEEKが発生した場合、またはネットワークが遅いために再生が失速する場合、 kBCOVPlaybackSessionLifecycleEventPlaybackBufferEmpty
イベントでLifecycle Delegateメソッドが呼び出されます。再生が再開できる場合、Lifecycle DelegateメソッドはkBCOVPlaybackSessionLifecycleEventPlaybackLikelyToKeepUp
イベントで呼び出されます。
明示的に文書化されている場合を除き、iOSのプレーヤーSDKのクラスはいずれも、サブクラス化するように設計されていません。サブクラス化されるように明示的に設計されていないSDKクラスのサブクラスを作成すること、特にバリュークラスのいずれかは、予測不可能な動作をもたらす可能性があります。
「モデルオブジェクト」とも呼ばれ、これらのクラス( BCOVPlaylist
、 BCOVVideo
、 BCOVSource
、 BCOVCuePoint
、 BCOVCuePointCollection
)は、iOSのプレーヤーSDKのデータを表すために使用されます。これらのデータ型は、アイデンティティではなく値として扱われていることを理解することが重要です。これにより、まったく同じデータを持っている値クラスの2つのインスタンスがある場合、それらは個別のメモリアドレスで技術的に2つの異なるオブジェクトであるにもかかわらず、同じアイデアまたは値を表していることを意味します。言い換えれば、SDKコードもクライアントコードも、値オブジェクトを使用してID比較(「ポインター平等」)を使用する必要はありません。代わりに、各値クラスは-isEqual:
実装し、クラス固有の平等方式の過負荷を提供します。どちらも代わりに使用する必要があります。
これは悪いです:
if myVideo == session . video // Could lead to bugs!
これらは良い(そして機能的に同等です):
if myVideo . isEqual ( session . video )
if myVideo . isEqual ( toVideo : session . video )
iOSのプレイヤーSDKの内部は、メモの値を測定したり、防御的なコピーを作成したりする可能性があるため、平等をチェックするためにポインターアドレスに依存すると、痛みが生じます。
iOSのプレーヤー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 ( )
}
}
注:再生承認サービスを使用している場合は、その機能に関連するこのREADMEのセクションを確認してください。
プレイリストを返す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);
この署名は、UIViewを返すObjective-Cブロックと、UiViewと再生コントローラーの2つのパラメーターを取得することを説明しています。返品値は、再生コントローラーのViewプロパティが指すUIViewオブジェクトです。最初のパラメーターは、ビデオレイヤーを含むUiviewです。Uiviewにはビデオが表示されます。 2番目のパラメーターは、ビュー戦略が与えられた再生コントローラーオブジェクトであり、再生コントローラーを使用して、ビデオコントロールや広告コントロールなどの必要なセッション消費者を追加できます。
ビュー戦略の実装の例:
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
}
コードをBCOVPlaybackSessionConsumer
に分割します。 BCOVPlaybackSessionConsumer
プロトコルを使用すると、広告に加えて各ビデオの基本的な再生情報を受信できます。 [2]ビデオビューとカスタムコントロールのコンテナビューを作成します。 [3]ビデオコンテナとカスタムコントロールをサブビューとして追加します。階層は、ビューが追加されるのと同じ順序で構成されています。 [4] BCOVPlaybackSessionConsumer
プロトコルに準拠するADコントロールビューを作成します。 [5]ビデオビューとコントロール、および広告ビューのコンテナビューを作成します。 [6]ビデオコンテナをサブビューとして追加し、広告を制御するビューを制御します。 [7]ブロックで返される再生コントローラーオブジェクトを使用して、カスタムコントロールビューと広告コントロールビューをセッション消費者として登録します。
ビュー戦略を使用することには1つの注意事項があります。ビュー戦略ブロック内から再生コントローラーのview
プロパティにアクセスしないでください。再生コントローラーのview
プロパティが初めてアクセスされたためにブロックが呼び出されているため、ビュー戦略ブロック内で再びview
プロパティにアクセスすると、プログラムがクラッシュします。
デフォルトでは、iOSアプリケーションがバックグラウンドに送信されるか、デバイスがロックされている場合、iOSは再生されているビデオを一時停止します。この動作を変更するには、 BCOVPlaybackController
オブジェクトのallowsBackgroundAudioPlayback
プロパティをtrue
に設定します。 (デフォルト値はfalse
で、再生がバックグラウンドで一時停止することを示します。)
また、AppleがテクニカルQ&A QA1668で設定したガイドラインに従って、アプリの適切なバックグラウンドモードとオーディオセッションカテゴリを設定する必要があります。
アプリがバックグラウンドに切り替わる前に(およびアプリが前景に戻ったときに再刻まれる前に、 AVPlayerLayer
をAVPlayer
から分離することが重要です。 BrightCove Player SDKは、 allowsBackgroundAudioPlayback
がtrue
に設定されている場合、これを処理します。
最後に、バックグラウンドビデオを再生するとき(特にプレイリストを使用する場合)、iOS MPRemoteCommandCenter
APIを使用して、ロック画面とコントロールセンターでユーザーの再生コントロールを提供する必要があります。
アプリケーションでピクチャインピクチャーを有効にするには、 BCOVPUIPlayerView
オブジェクトをインスタンス化するときに、 BCOVPUIPlayerViewOptions
オブジェクトのshowPictureInPictureButton
プロパティをtrue
に設定します。その後、ピクチャーインピクチャーボタンは、サポートするデバイスのコントロールバーに表示されます。
Picture-in-Pictureが適切に動作するには、プロジェクトのターゲット機能のバックグラウンドモードセクションに描かれているAudio, AirPlay, and Picture in Picture
プロジェクトのターゲット機能のバックBackground Modes
セクションで確認されるようにする必要があります。また、AppleがテクニカルQ&A 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のavpictureinpictureconturecontrollerdelegateドキュメントを参照してください。
独自の絵での絵の動作を実装するには、 BCOVPlaybackController
のallowsBackgroundAudioPlayback
プロパティをfalse
に設定し、 BCOVPlaybackController
のpictureInPictureActive
プロパティをpicture in pictureステータスで更新します。 AVPictureInPictureController
を使用している場合は、 pictureInPictureControllerDidStartPicture(inPicture:)
およびpictureInPictureControllerDidStopPicture(inPicture:)
このプロパティを更新するための代表者メソッドを使用できます。
Appleの採用写真の絵の絵の写真の絵の写真の詳細については、カスタムプレーヤーのドキュメントで読むことができます。
ピクチャーインピクチャを備えたミックスフォーマットを備えたビデオのプレイリストを使用すると、各ビデオ間の視聴ウィンドウが閉じられます。
iOSとiPados 14はSettings > General > Picture in Picture
。この機能が予想どおりに機能するためには、プレイヤービューは画面の幅に等しくなければならず、高さは幅(16:9以上)の比率が少なくとも0.57でなければなりません。プレーヤービューの幅または高さがこれらの値よりも小さい場合、アプリケーションが背景に入ると、ピクチャーインピクチャーが自動的にトリガーされない場合があります。
重要:IMA、フリーホイール、パルス、SSAIプラグインはそれぞれ、絵の絵の機能を異なって処理します。追加情報については、各プラグインREADMEのピクチャーインピクチャーセクションを確認してください。
サムネイルシークを使用すると、ユーザーはタイムラインに沿ってプレイヘッドをドラッグし、サムネイルを関連するコンテンツのプレビューとして表示できます。これにより、ユーザーはビデオファイルをすばやくナビゲートし、興味のあるコンテンツを見つけることができます。
この機能は、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 " )
} )
}
サムネイルシークは、オンラインビデオでのみ利用できます。ダウンロード/オフラインビデオは、この機能をサポートしていません。
BCOVPlaybackController
insertVideo:afterVideoAtIndex:
例えば:
// This will insert the new video after the first video in the queue
playbackController . insert ( videoToInsert , afterVideoAt : 0 )
リクエストの成功または失敗について警告するために利用できる2つの代表的な方法があります。
func playbackController(_ controller: BCOVPlaybackController, didInsert video: BCOVVideo, at index: UInt)
func playbackController(_ controller: BCOVPlaybackController, failedToInsert video: BCOVVideo)
Generic Stream Concurrency(GSC)は、視聴者のアクティブな再生セッションとプリセットの並行制限に基づいて再生が許可されるかどうかを決定するサービスです。このサービスは、Edge Playback Authorization(EPA)サービスを通じて要求されます。ビデオの取得に使用された同じJWTがここで使用されており、 uid
クレーム、 climit
請求、およびオプションでsid
請求を含める必要があります。この機能は、Acccountで有効にする必要があります。
一般的なストリームの並行性は、デフォルトでは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サービスエンジニアに送信して、問題の診断を支援できます。
Player 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
プロパティを設定します。この動作は、あなた自身の価値で無効にすることができます。
誰もが帯域幅を支払うので、再生品質に影響を与えることなく帯域幅の消費を減らすことが重要です。バージョン5.2.0の新機能、BrightCoveネイティブプレーヤーSDKは、ビデオが再生されるときに動的にバッファサイズを管理します。
iOS 10の前に、 AVPlayer
、最大約50メガバイトまで、実践的にできる限り多くのビデオデータをバッファリングしました。これは、ユーザーがビデオを選択して最後まで視聴するビデオ視聴モデルには問題ありませんが、現在、多くの最新のアプリが自動再生でビデオを「いじめ」、数秒後にエンゲージメントを確保したいと考えています。多くのユーザーは、単に異なるビデオに移ります。アグレッシブなバッファリングを使用すると、各ビデオ印象で捨てられる数分間のバッファービデオで終わる可能性があります。
BrightCoveのネイティブプレーヤー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
Delegateメソッドを実装できます。
func playbackController ( _ controller : BCOVPlaybackController , didAdvanceTo session : BCOVPlaybackSession ) {
if let currentItem = session . player . currentItem {
// Set your preferredForwardBufferDuration value here.
currentItem . preferredForwardBufferDuration = newPreferredForwardBufferDurationValue
}
}
時間の経過とともにバッファサイズを動的に変更する場合は、 session.player.currentItem.preferredForwardBufferDuration
BCOVPlaybackController
設定できます。
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は、任意の価値を設定できるため、希望するpreferredForwardBufferDuration
に「優先」を具体的に配置しますが、一般的には、 AVPlayer
プレーヤーはガイドラインとしてのみ使用します。また、それをゼロに設定すると、バッファサイズの完全な制御がAVPlayer
に完全に制御されることに注意してください。
BCOVPlayBackSessionクラスで使用されるAVPlayerLayerの代わりに、AvplayerviewControllerを使用できます。 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
です。つまり、この辞書プロパティなしで作成されたBCOVPLAYBAYCONTROLLERは、明示的に設定されていることを意味します。
BrightCove IMA、フリーホイール、パルス、SSAI広告プラグインは、AvplayerviewControllerを使用する場合に互換性があります。 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:
and playbackController:playbackSession:didExitAdSequence:
広告コンテナビューを表示および非表示にするデリゲートメソッドを使用できます。
IMA、フリーホイール、パルス、またはSSAIプラグインを使用して、各広告キューポイントに対してAVInterstitialTimeRange
の配列が作成され、関連するAVPlayerItem
のインタースティinterstitialTimeRanges
に設定されます。 IMA、フリーホイール、パルスプラグインの場合、広告がアクティブなときに広告を正しく一時停止して再開し、ビデオ自体の再生に影響を与えないように、プレイ/一時停止ジェスチャーを作成する必要があります。これが例です:
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
}
カウントダウンのような広告オーバーレイを表示するには、いくつかのガイダンスに使用している広告プラグインREADMEのAVPLAYERVIEWCONTROLLERサポートセクションを参照してください。
SsaiのAVPlayerViewController
互換性は、 AVInterstitialTimeRange
が利用可能であるため、TVOSに固有のものであることに注意してください。 iOSで再生を行うことができますが、ビデオの期間にはすべての広告の期間が含まれます。
BrightCove iOS SDKを使用したAvplayerviewControllerの使用を示すサンプルプロジェクトがあります。 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が有効になっている場合、BCOVPLAYERUIコントロールビューは自動隠されません。再生コントローラーのビューでダブルタップのボイスオーバーアクティベーションジェスチャーを使用すると、コントロールビューの可視性が切り替えられます。再生コントローラーのビューに設定された関連するaccessibilityHint
があります。各BCOVPLAYERUIコントロールのaccessibilityLabel
は、アプリケーション内でカスタマイズできます。
コントロールビュー内のボタンのaccessibilityLabel
値を変更するには、オブジェクトをBCOVPUIButtonAccessibilityDelegate
に設定する必要があります。
playerView . controlsView . setButtonsAccessibilityDelegate ( self )
次に、そのオブジェクトをBCOVPUIButtonAccessibilityDelegate
プロトコルに適合させる必要があります- (NSString *)accessibilityLabelForButton:(BCOVPUIButton *)button isPrimaryState:(BOOL)isPrimaryState
メソッド
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
SingletonのchinaProxyDomain
プロパティを完全に資格のあるドメイン名に設定します。例えば:
BCOVGlobalConfiguration . sharedConfig . chinaProxyDomain = " host.mydomain.com "
ネイティブプレーヤーSDKの他のサービスを使用する前に、必ずプロキシドメイン名を設定してください。詳細については、 BCOVGlobalConfigurationクラスのリファレンスを参照してください。
オーディオの再生に関しては、アプリケーションがどのようにパフォーマンスを発揮するかに応じて、特定のニーズに合わせてAvaudiosessionを構成できます。たとえば、AirPlay 2と複数のオーディオルートをサポートしたい場合は、このREADMEの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:
Methodで実行できます。たとえば、より洗練されたAvaudiosession構成が必要な状況がある場合があります。たとえば、アプリのオーディオがミュートされたときに他のアプリからオーディオを聞くことを許可する場合。この状況では、現在のAvplayerにアクセスできるView Controllerで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
UIViewContentModeScaleAspectFit
contentModeForPosterImage
プロパティを使用して、ポスター画像ビューのUIViewContentMode
を調整できます。
また、プレイヤーコントロールを常に表示しておくことをお勧めします。その場合、 BCOVPUIPlayerViewOptions
でkeepControlsVisible
有効にすることができます。
ポスター画像を表示したくない場合、または単にコンパクトな再生ビューが必要な場合は、コンパクト(<450 pt)レイアウトの場合、 BCOVPUIPlayerView
の親ビューの高さを88 ptの高さまたは44 ptの高さを設定できます。標準レイアウト。
3つの事前に構成されたオーディオのみのBCOVPUIBasicControlView
レイアウトがあります。 automaticControlTypeSelection
を使用していない場合に使用できます。
basicControlViewWithAODLayout
basicControlViewWithLiveAudioLayout
basicControlViewWithLiveDVRAudioLayout
また、ストリームがAudioのみまたは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は、ロック画面、コントロールセンター、およびオーバーエアプレイにメディア情報を表示するためのサポートを持っています。実装の詳細については、 NowPlayingHandler
クラスを参照してください。
ビデオバンパーは、通常は10秒以下の短い資産であり、他のすべてのメディアの前で再生され、通常、ビデオが表すブランドや会社を示しています。プレイヤーは、他のビデオと同様に再生APIからバンパーをリクエストし、広告やコンテンツの前に挿入します。
バンパーはプレーヤーレベルの機能です。つまり、特定のプレーヤーは単一のバンパーにのみ関連付けられる場合があります。プレイリストは同じバンパービデオを共有しています。バンパービデオを再生するようにプレーヤーを構成する2つの方法があります。
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でなければなりません。
注:カスタムフィールドを介して通過したBumperid( bumper_id
フィールド)は、再生サービスのIDよりも優先されます。
バンパーが再生中に再生コントロールを隠すことができます。
let options = BCOVPUIPlayerViewOptions ( )
options . automaticControlTypeSelection = true
options . showBumperControls = false
let playerView = BCOVPUIPlayerView ( playbackController : nil , options : options , controlsView : nil )
automaticControlTypeSelection
オプションがtrue
に設定されている場合、バンパーのレイアウトはコンテンツに適応します(ビデオまたはオーディオのみ)。 basicControlViewWithVODLayout
およびbasicControlViewWithAODLayout
レイアウトは、 LiveDVR
用に設計されていLive
。再生コントロールは、バンパーがアクティブになったときにユニークな外観を持っています。
インタラクティブ性のサポートは、Core BrightCovePlayersDKフレームワークに統合されています。 BrightCove Native Player SDKとの対話性の使用の詳細については、インタラクティブガイドを参照してください。
コンテンツがMP4としてパッケージ化されている場合、URLをほとんどのWebブラウザーに直接貼り付けることができ、ビデオが再生される(またはファイルシステムにダウンロードして、ローカルで再生できる)。コンテンツがHLSとしてパッケージ化されている場合、QuickTimeプレーヤーを使用してテストできます。 File -> Open Location…
を選択し、 .m3u8
プレイリストURLに貼り付け、ビデオが再生されるはずです。
これは、メインスレッドのみのUIKITまたは非メインスレッドからのAVFoundationメソッドと呼ばれる一般的な症状です。 BCOVPlaybackControllerDelegate
の代表的な方法は、常にメインスレッドで呼び出されます。
このメッセージは、デフォルトのソース選択ポリシーが選択するソースを把握できないことを示しています。デフォルトのポリシーは、 deliveryMethod
がkBCOVSourceDeliveryHLS
( "hls")である最初のソースを選択します。 HLSソースが見つからない場合、そのフォールバックの動作は、 deliveryMethod
がkBCOVSourceDeliveryMP4
( "MP4")である最初のソースを選択します。 「HLS」または「MP4」のdeliveryMethod
がビデオに存在するソースがない場合、ポリシーはビデオの最初のソースを選択します( deliveryMethod
に関係なく)。その選択BCOVBasicSessionProviderOptions
満足していない場合はsourceSelectionPolicy
-[BCOVPlayerSDKManager createBasicSessionProviderWithOptions:]
使用できます。ビデオやソースを手動で作成するときは、ソースが適切なdeliveryMethod
で作成されていることを確認してください。
アプリがiOSアプリでオーディオを発するかどうかを制御するAPIは、Avaudiosession APIです。オーディオセッションはアプリにとってグローバルです。つまり、その構成は、プレーヤーSDKによって作成されたAvplayersが放出するサウンドと、アプリが生成する可能性のある他のサウンドに影響を与えます。 Since the Player SDK cannot know how the app wants the audio session configured for those other sounds, it doesn't affect the audio session at all. This means that unless you explicitly configure your app's audio session otherwise, you inherit the default behavior of suppressing any and all audio when the device is muted, including audio emitted by AVPlayers. To conform to Apple's recommendations regarding audio playback, you (the app developer) must configure the audio session according to your app's specific needs.
See our AVAudioSession Configuration section in this README for additional information.
If you have questions, need help or want to provide feedback, please use the Support Portal or contact your Account Manager. To receive notification of new SDK software releases, subscribe to the Brightcove Native Player SDKs Google Group.