Brightcove memberikan dukungan aktif untuk iOS SDK terbaru pada rilis publik terbaru dari versi iOS berikut:
Brightcove memberikan dukungan pasif untuk versi iOS berikut:
Core SDK dilokalkan untuk bahasa Arab (ar), Inggris (en), Perancis (fr), Jerman (de), Jepang (ja), Korea (ko), Spanyol (es), Cina Sederhana (zh-Hans) dan Tradisional Cina (zh-Hant). Untuk mendapatkan manfaat pelokalan, aplikasi Anda juga harus dilokalkan untuk bahasa dan lokasi yang sama. Lihat bagian Pelokalan Khusus untuk informasi tambahan.
Semua komponen SDK - kerangka inti dan plugin - dirilis dengan nomor versi yang sama. Saat memutakhirkan satu komponen, tingkatkan semua komponen ke versi yang sama.
Untuk proyek yang menggunakan Xcode 12 di Apple Silicon M1 dan Universal Frameworks (.framework), kesalahan build ditampilkan saat membuat proyek untuk simulator arm64.
*ld: building for iOS Simulator, but linking in dylib built for iOS, file for architecture arm64*
Untuk membuat simulator arm64, pastikan arm64
telah ditambahkan ke pengaturan build "Arsitektur yang Dikecualikan" untuk Any iOS Simulator SDK
di tab "Pengaturan Pembuatan" pada target aplikasi Anda.
Rilis 6.10.0 dari Brightcove Player SDK menambahkan subspesifikasi untuk inti dan setiap plugin untuk mendukung XCFrameworks. Nilai default untuk setiap subspesifikasi adalah /XCFramework
.
Nama Podspesifikasi | Nama Subspesifikasi |
---|---|
Brightcove-Pemain-Inti | Brightcove-Pemain-Inti/Kerangka Brightcove-Player-Core/XCFramework |
Brightcove-Pemain-DAI | Brightcove-Player-DAI/Kerangka Brightcove-Player-DAI/XCFramework |
Brightcove-Player-FreeWheel | Roda/Kerangka Bebas Pemain Brightcove Brightcove-Player-FreeWheel/XCFramework |
Brightcove-Pemain-GoogleCast | Brightcove-Player-GoogleCast/Framework Brightcove-Player-GoogleCast/XCFramework |
Brightcove-Pemain-IMA | Brightcove-Player-IMA/Kerangka Brightcove-Player-IMA/XCFramework |
Brightcove-Pemain-Omniture | Brightcove-Pemain-Omniture/Kerangka Brightcove-Player-Omniture/XCFramework |
Brightcove-Pemain-Pulsa | Brightcove-Player-Pulse/Kerangka Brightcove-Player-Pulse/XCFramework |
Brightcove-Pemain-SSAI | Brightcove-Player-SSAI/Kerangka Brightcove-Player-SSAI/XCFramework |
Pengukuran Brightcove-Player-Open | - |
Rilis 6.12.0 dari Brightcove Player SDK memperbarui podspec Brightcove-Player-FreeWheel
dan Brightcove-Player-Omniture
untuk menginstal versi dinamis BrightcovePlayerSDK
.
Nama Podspesifikasi | Jenis Kerangka | Ketergantungan |
---|---|---|
Brightcove-Pemain-Inti | dinamis | - |
Brightcove-Player-DAI (tersedia sejak 6.12.7) | dinamis | Brightcove-Pemain-Inti |
Brightcove-Player-FreeWheel | dinamis | Brightcove-Player-Core untuk iOS, Brightcove-Player-Core untuk tvOS |
Brightcove-Pemain-GoogleCast | statis | Brightcove-Pemain-Inti |
Brightcove-Pemain-IMA | dinamis | Brightcove-Pemain-Inti |
Brightcove-Pemain-Omniture | dinamis | Brightcove-Pemain-Inti |
Brightcove-Pemain-Pulsa | dinamis | Brightcove-Pemain-Inti |
Brightcove-Pemain-SSAI | dinamis | Brightcove-Pemain-Inti, Brightcove-Player-OpenMeasurement (hanya untuk Pengukuran Terbuka) |
Brightcove-Player-OpenMeasurement (tersedia sejak 6.10.0) | dinamis | - |
Dukungan untuk video yang dilindungi FairPlay diintegrasikan ke dalam kerangka inti BrightcovePlayerSDK . Lihat panduan FairPlay untuk detail lengkap tentang penggunaan FairPlay dengan Brightcove Native Player SDK.
Dukungan untuk Subtitle Sidecar diintegrasikan ke dalam kerangka inti BrightcovePlayerSDK . Untuk detail selengkapnya tentang penggunaan Subtitle Sidecar dengan Brightcove Native Player SDK, lihat panduan Subtitle Sidecar.
Sejak rilis 6.0.0, Brightcove Native Player SDK memungkinkan Anda mengunduh video HLS, termasuk video yang dilindungi dengan enkripsi FairPlay, untuk diputar nanti, baik online maupun offline. Lihat panduan pengembang aplikasi untuk detail selengkapnya:
Panduan Pengembang Aplikasi iOS untuk Pengunduhan Video dan Pemutaran Offline dengan FairPlay
Brightcove Player SDK menyediakan paket instalasi untuk iOS dan tvOS sebagai perpustakaan dinamis yang dikemas sebagai Frameworks dan XCFrameworks. Penerapan didukung di iOS 12.0 dan yang lebih baru.
Anda dapat menggunakan CocoaPods untuk menambahkan Brightcove Player SDK ke proyek Anda. Anda dapat menemukan podspec Brightcove-Player-Core
terbaru di sini. Podspec mendukung iOS dan tvOS.
Saat menggunakan Brightcove CocoaPods di proyek Anda, tambahkan source 'https://github.com/brightcove/BrightcoveSpecs.git'
di awal Podfile Anda.
nama.
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 dapat diinstal dengan menambahkan subspesifikasi /Framework
ke 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
Saat memperbarui instalasi Anda, ada baiknya untuk menyegarkan salinan lokal repositori BrightcoveSpecs Anda sehingga Anda memiliki podspec terbaru secara lokal, sama seperti Anda memperbarui repositori master CococaPods Anda. Biasanya jika Anda menjalankan pod update
di Terminal, hal ini akan terjadi secara otomatis, atau sebagai alternatif, Anda dapat memperbarui secara eksplisit dengan pod repo update
.
Untuk menambahkan Brightcove Player SDK ke proyek Anda secara manual:
BrightcovePlayerSDK.framework
atau BrightcovePlayerSDK.xcframework
ke proyek Anda. Pastikan untuk menggunakan versi yang sesuai dengan target Anda, iOS atau tvOS.BrightcovePlayerSDK.framework
/ BrightcovePlayerSDK.xcframework
bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
. Centang "Jalankan skrip hanya saat menginstal". Ini akan menghapus arsitektur yang tidak diperlukan dari build, yang penting untuk pengiriman App Store. Langkah ini tidak lagi diperlukan saat menggunakan XCFramework.bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
. Centang "Jalankan skrip hanya saat menginstal". Ini akan menghapus arsitektur yang tidak diperlukan dari build, yang penting untuk pengiriman App Store.arm64
telah ditambahkan ke pengaturan build "Arsitektur yang Dikecualikan" untuk Any iOS Simulator SDK
.Sebagai referensi, berikut adalah semua komponen SDK dan URL terkait untuk membantu Anda menemukan dan mendownload rilis terbaru:
Komponen | URL |
---|---|
Brightcove-Pemain-Inti | https://github.com/brightcove/brightcove-player-sdk-ios/tags |
Brightcove-Pemain-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-Pemain-GoogleCast | https://github.com/brightcove/brightcove-player-sdk-ios-googlecast/tags |
Brightcove-Pemain-IMA | https://github.com/brightcove/brightcove-player-sdk-ios-ima/tags |
Brightcove-Pemain-Omniture | https://github.com/brightcove/brightcove-player-sdk-ios-omniture/tags |
Brightcove-Pemain-Pulsa | https://github.com/brightcove/brightcove-player-sdk-ios-pulse/tags |
Brightcove-Pemain-SSAI | https://github.com/brightcove/brightcove-player-sdk-ios-ssai/tags |
Untuk menambahkan Brightcove Player SDK ke proyek Anda dengan Swift Package Manager:
https://github.com/brightcove/brightcove-player-sdk-ios.git
Catatan: Hanya XCFramework dinamis yang didukung untuk Swift Package Manager.
Brightcove Player SDK untuk iOS dapat diimpor menggunakan:
import BrightcovePlayerSDK;
Memutar video dengan Brightcove Player SDK untuk iOS:
// ** 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 ( )
}
}
Anda harus menjaga agar pengontrol tidak dilepaskan secara otomatis di akhir metode. Cara umum untuk melakukan ini adalah dengan menyimpan referensi ke pengontrol dalam variabel instan yang kuat.
Sejak versi 5.1.0, Brightcove PlayerUI terintegrasi penuh ke dalam kerangka Core SDK. PlayerUI menyediakan serangkaian kontrol berfitur lengkap untuk pemutaran dan periklanan, langsung dari kotaknya.
PlayerUI cepat diatur, menampilkan kontrol iklan untuk SSAI, Pulse dan FreeWheel, dan dapat disesuaikan dengan membuat tata letak Anda sendiri.
Ikuti panduan di bawah ini untuk menyiapkan kontrol PlayerUI.
Buat properti di UIViewController Anda untuk melacak BCOVPUIPlayerView. BCOVPUIPlayerView akan berisi tampilan Pengontrol Pemutaran dan tampilan kontrol.
// PlayerUI's Player View
var playerView : BCOVPUIPlayerView ?
Buat BCOVPUIBasicControlView, lalu BCOVPUIPlayerView. Di sinilah kami mengaitkan Pengontrol Pemutaran (dan semua video yang diputarnya) dengan kontrol.
// 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 )
}
Anda harus menyiapkan tata letak untuk tampilan pemutar, Anda dapat melakukannya dengan Tata Letak Otomatis atau pendekatan Springs & Struts yang lebih lama.
Atur tampilan pemutar agar sesuai dengan wadah video dari tata letak Anda ( videoView
) saat diubah ukurannya.
playerView . frame = videoView . bounds
playerView . autoresizingMask = [ . flexibleHeight , . flexibleWidth ]
Setel translatesAutoresizingMaskIntoConstraints
di BCOVPUIPlayerView ke false
.
playerView . translatesAutoresizingMaskIntoConstraints = false
Kemudian tambahkan batasan untuk tata letaknya; mengatur jangkar atas, kanan, kiri dan bawah BCOVPUIPlayerView Anda agar sama dengan 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 )
] )
Kelas BCOVPUIPlayerViewOptions
memungkinkan Anda menyesuaikan beberapa perilaku BCOVPlayerUI saat inisialisasi. Anda dapat menyesuaikan hal berikut:
jumpBackInterval
Waktu dalam detik pemain akan mencari kembali ketika tombol lompat mundur ditekan.
hideControlsInterval
Waktu dalam detik setelah peristiwa sentuhan terakhir, sebelum kontrol disembunyikan.
hideControlsAnimationDuration
Waktu yang diperlukan dalam hitungan detik agar kontrol dianimasikan hingga disembunyikan.
showControlsAnimationDuration
Waktu yang diperlukan dalam hitungan detik agar kontrol dapat dianimasikan agar terlihat.
learnMoreButtonBrowserStyle
Setelan yang menentukan apakah mengetuk tombol "Pelajari Lebih Lanjut" pada iklan akan menampilkan tautan klik-tayang di browser eksternal (setelan default) atau browser internal.
presentingViewController
Subkelas UIViewController yang digunakan untuk menyajikan pengontrol tampilan lainnya (seperti pengontrol tampilan pilihan teks tertutup).
automaticControlTypeSelection
Apakah Anda ingin BCOVPUIPlayerView
memilih jenis BCOVPUIBasicControlView
secara otomatis berdasarkan jenis media. Jika nilai ini disetel ke true
properti BCOVPUIBasicControlView
yang diteruskan ke penginisialisasi BCOVPUIPlayerView
akan diabaikan.
Aliran Video + Audio
basicControlViewWithVODLayout
basicControlViewWithLiveLayout
basicControlViewWithLiveDVRLayout
Streaming Audio Saja
basicControlViewWithAODLayout
basicControlViewWithLiveAudioLayout
basicControlViewWithLiveDVRAudioLayout
CATATAN: automaticControlTypeSelection
memilih tata letak dari yang disediakan oleh BCOVPlayerUI, sehingga kontrol dan tata letak khusus akan ditimpa; automaticControlTypeSelection
dan kustomisasi UI pemutar tidak kompatibel.
Opsi dapat diatur menggunakan metode berikut:
let manager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = manager . createPlaybackController ( )
let options = BCOVPUIPlayerViewOptions ( )
options . jumpBackInterval = 5
let playerView = BCOVPUIPlayerView ( playbackController : playbackController ,
options : options )
Tiga tata letak disediakan untuk mendukung berbagai jenis video:
BCOVPUIControlLayout basicVODControlLayout
adalah tata letak dasar untuk streaming video berdasarkan permintaan secara umum.
BCOVPUIControlLayout basicLiveControlLayout
adalah tata letak untuk video langsung.
BCOVPUIControlLayout basicLiveDVRControlLayout
adalah tata letak untuk streaming video langsung dengan kontrol DVR.
Anda biasanya menyetel tata letak baru segera setelah BCOVPUIPlayerView
dibuat, namun Anda juga dapat menyetel tata letak baru kapan saja. Misalnya, Anda dapat menyetel tata letak VOD baru seperti ini:
playerView ? . controlsView . layout = BCOVPUIControlLayout . basicVOD ( )
Selain tata letak default, Anda dapat membuat tata letak Anda sendiri yang sangat disesuaikan dengan membuat instance BCOVPUIControlLayout
baru dengan desain Anda sendiri. Namun perlu diperhatikan bahwa automaticControlTypeSelection
memilih tata letak dari yang disediakan oleh BCOVPlayerUI, sehingga kontrol dan tata letak khusus akan ditimpa; automaticControlTypeSelection
dan kustomisasi UI pemutar tidak kompatibel.
Pertama, buat kontrol yang akan masuk ke tata letak Anda menggunakan BCOVPUIBasicControlView layoutViewWithControlFromTag:width:elasticity:
. Setiap kontrol dikemas dalam BCOVPUILayoutView
yang menentukan jarak kontrol.
Anda dapat mengatur width
setiap tampilan tata letak ke lebar default (yang didasarkan pada tipe kontrol), atau Anda dapat menentukan lebar Anda sendiri.
Gunakan argumen elasticity
untuk menentukan seberapa besar tampilan tata letak yang berisi kontrol mengubah lebarnya untuk mengisi bilah kontrol.
Berikut adalah contoh pembuatan berbagai kontrol dasar.
// 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 )
Perhatikan bahwa Anda juga dapat membuat tampilan tata letak kosong, di mana Anda dapat menempatkan tampilan Anda sendiri (logo, kontrol, tidak ada, dll.). Kode ini menunjukkan cara menempatkan logo UIImage
di dalam logoLayoutView1 yang kita buat di atas.
// 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 )
Sekarang terdapat berbagai kontrol yang dikemas dalam tampilan tata letak, mereka diurutkan ke dalam array, yang masing-masing mewakili satu baris kontrol, yaitu bilah kontrol. Perhatikan bahwa Anda dapat memiliki tata letak yang berbeda untuk orientasi potret dan lanskap, jadi Anda biasanya akan menyiapkan dua susunan bilah kontrol yang berbeda.
Dalam tata letak standar untuk orientasi lanskap, kontrol disusun dalam satu larik, lalu larik tersebut disimpan dalam larik lain yang mewakili seluruh rangkaian kontrol.
let standardLayoutLine1 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
currentTimeLayoutView ,
timeSeparatorLayoutView ,
durationLayoutView ,
progressLayoutView ,
spacerLayoutView1 ,
logoLayoutView1 ,
spacerLayoutView2 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView
]
let standardLayoutLines = [ standardLayoutLine1 ]
Dalam tata letak ringkas untuk orientasi potret, dua rangkaian kontrol dibuat, satu untuk setiap baris. Array ini dikemas ke dalam array lain yang mewakili tata letak kompak.
Perhatikan bahwa objek yang sama persis digunakan untuk sebagian besar kontrol di setiap tata letak. Ketika ini selesai, dan Anda beralih antara orientasi potret dan lanskap, objek akan dipindahkan ke posisi barunya menggunakan animasi yang halus.
let compactLayoutLine1 = [
currentTimeLayoutView ,
progressLayoutView ,
durationLayoutView
]
let compactLayoutLine2 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
spacerLayoutView1 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView ,
logoLayoutView2
]
let compactLayoutLines = [
compactLayoutLine1 ,
compactLayoutLine2
]
Terakhir, karena kini terdapat dua konfigurasi tata letak (satu untuk lebar penuh, dan satu lagi untuk lebar kompak), Anda dapat membuat objek BCOVPUIControlLayout
baru, dan mengaturnya dalam tampilan kontrol pemutar.
let customLayout = BCOVPUIControlLayout . init ( standardControls : standardLayoutLines ,
compactControls : compactLayoutLines )
playerView ? . controlsView . layout = customLayout
Jika Anda memiliki kontrol yang perlu sering ditampilkan atau disembunyikan, Anda bisa mengatur properti removed
pada tampilan tata letak kontrol tersebut. Ketika Anda telah mengubah kontrol, panggil setNeedsLayout
pada controlView playerView:
logoLayoutView1 ? . isRemoved = true
playerView ? . controlsView . setNeedsLayout ( )
Anda juga dapat menyesuaikan beberapa properti umum BCOVPUIControlLayout
:
controlBarHeight
mengatur ukuran setiap baris kontrol.horizontalItemSpacing
menyetel jarak antara setiap BCOVPUILayoutView
di setiap bilah kontrol.compactLayoutMaximumWidth
menentukan kumpulan kontrol mana yang digunakan. Jika tampilan kontrol lebih kecil dari compactLayoutMaximumWidth
, kumpulan kontrol ringkas akan digunakan, jika tidak, kontrol standar akan digunakan. Untuk mengubah kumpulan kontrol yang ditampilkan, Anda harus membuat dan menginstal BCOVPUIControlLayout
baru. Kontrol baru dapat dipasang kapan saja.
Untuk contoh penyesuaian PlayerUI lainnya, Anda dapat melihat kode contoh di folder PlayerUI di repositori GitHub BrightcoveOS:
https://github.com/BrightcoveOS/ios-player-samples
Brightcove Native Player SDK menyertakan kontrol bawaan untuk pemutaran di tvOS di Apple TV. Untuk detail selengkapnya tentang penggunaan UI Pemutar TV bawaan dengan Brightcove Native Player SDK, lihat panduan Pemutar TV kami.
Aktifkan fungsionalitas AirPlay dengan mengatur properti setAllowsExternalPlayback
di BCOVPlaybackController
Anda ke true
. Tombol AirPlay akan ditampilkan di kontrol pemutaran jika perangkat AirPlay ditemukan di jaringan Anda.
Saat ini, IMA adalah satu-satunya plugin iklan yang mendukung AirPlay dan hanya jika menggunakan iklan pra-putar dan/atau pasca-putar. Menggunakan AirPlay dengan plugin iklan Pulse, SSAI, atau FreeWheel dapat mengakibatkan perilaku yang tidak terduga.
Jika Anda juga ingin mendukung AirPlay 2 dan mengizinkan beberapa perangkat dipilih untuk output audio, Anda harus melakukan beberapa hal tambahan. Pertama, Anda harus mengonfigurasi AVAudioSession agar Anda dapat menyetel routeSharingPolicy
. Misalnya:
do {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , mode : . moviePlayback , policy : . longFormVideo )
} catch {
print ( " Error setting AVAudioSession category " )
}
Anda juga perlu mengonfigurasi setidaknya satu perintah pemutaran melalui MPRemoteCommandCenter
. Setidaknya Anda ingin mengonfigurasi pauseCommand
dan playCommand
. Misalnya:
let center = MPRemoteCommandCenter . shared ( )
center . pauseCommand . addTarget { _ in
playbackController . pause ( )
return . success
}
center . playCommand . addTarget { _ in
playbackController . play ( )
return . success
}
Perangkat akan memanfaatkan AVRoutePickerView
yang memiliki dua metode delegasi. Metode delegasi ini diteruskan ke BCOVPUIPlayerViewDelegate
. Metodenya adalah:
func routePickerViewDidEndPresentingRoutes ( _ routePickerView : AVRoutePickerView )
func routePickerViewWillBeginPresentingRoutes ( _ routePickerView : AVRoutePickerView )
AVRouteDetector
yang digunakan untuk menemukan rute AirPlay tersedia di objek BCOVPUIBasicControlView
sehingga Anda dapat mengaktifkan atau menonaktifkan properti routeDetectionEnabled
sesuai kebutuhan.
Berdasarkan dokumentasi Apple: " Deteksi rute secara signifikan meningkatkan konsumsi daya dan harus dimatikan jika tidak diperlukan lagi. "
playerView ? . controlsView . routeDetector . isRouteDetectionEnabled = false
Untuk informasi lebih lanjut tentang menggabungkan AirPlay 2 ke dalam aplikasi Anda, silakan lihat dokumentasi Mendapatkan Airplay 2 ke dalam Aplikasi Anda.
Native Player SDK menyertakan dukungan untuk menampilkan video 360 derajat secara interaktif. Video 360 harus diberi tag dengan properti bidang "proyeksi" yang berisi nilai "equirectangular". Video ini akan dimuat dan diputar dengan cara yang sama seperti video lainnya, namun akan ditampilkan di CAMetalLayer, bukan AVPlayerLayer.
Catatan: "equirectangular" adalah satu-satunya format proyeksi yang didukung untuk video sumber 360 saat ini.
PlayerUI juga memiliki dukungan bawaan untuk Video 360, menyediakan gerakan menggeser default, deteksi gerakan giroskopik untuk tampilan, dan tombol Video 360 baru yang muncul saat aset Video 360 diputar. Tombol ini hanya muncul di iPhone, dan memungkinkan Anda beralih antara tampilan normal dan tampilan "VR Goggles", dengan layar terbagi dua, dengan pemandangan yang sama ditampilkan untuk setiap mata sehingga perangkat dapat digunakan di kepala. konfigurasi terpasang. Di iPad, tombol Video 360 tidak diperlukan karena hanya ada satu mode pengoperasian: deteksi gerakan dengan dukungan gerakan menggeser.
Mendukung Video 360 semudah memutar video. Ketika properti bidang "proyeksi" terdeteksi, Native Player SDK akan secara otomatis menangani pengaturan dan menampilkan video dalam Metal, dan menginstal tombol Video 360 bila diperlukan.
Jika Anda memutar video 360 di luar Video Cloud, pastikan untuk menambahkan properti "proyeksi" ke objek BCOVVideo
dengan nilai "equirectangular".
Untuk memberikan pengalaman pengguna terbaik dengan mode VR Goggles, Anda harus menggunakan metode BCOVPUIPlayerViewDelegate
untuk mendeteksi kapan mode ini diaktifkan. Hal ini memungkinkan Anda memaksa perangkat ke orientasi lanskap (karena itulah satu-satunya orientasi yang masuk akal untuk tampilan VR Goggles).
Kode berikut menunjukkan bagaimana Anda dapat menangani perubahan orientasi paksa saat beralih antara tampilan 360 normal dan mode VR Goggles.
// 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 akan menginstal gerakan untuk menangani navigasi di sekitar video 360, tetapi jika Anda menggunakan kontrol Anda sendiri, Anda dapat mengatur sendiri parameter tampilan kamera virtual. Properti viewProjection
protokol BCOVPlaybackController
memungkinkan Anda mengatur parameter ini. Properti ini adalah kelas BCOVVideo360ViewProjection
dengan pengaturan kamera virtual dasar seperti pan
, tilt
, dan zoom
. Untuk mengubah pengaturan, buat salinan instance saat ini, ubah pengaturan pada instance baru, lalu tetapkan kembali ke properti viewProjection
.
Titik masuk ke Brightcove Player SDK untuk iOS adalah objek tunggal BCOVPlayerSDKManager
. Manajer ini menangani pendaftaran komponen plugin dan beberapa tugas tata graha lainnya, namun terutama berfungsi sebagai pabrik objek. Pengontrol tampilan aplikasi Anda memperoleh referensi ke Manajer, dan menggunakannya untuk membuat BCOVPlaybackController
. Properti view
pengontrol pemutaran menampilkan UIView yang berisi objek AVPlayerLayer yang pada akhirnya menampilkan konten video Anda di layar. Pengontrol pemutaran juga menerima BCOVPlaybackControllerDelegate
, yang dapat Anda terapkan untuk merespons berbagai peristiwa pemutaran video.
Pengontrol pemutaran menawarkan metode dan properti untuk memengaruhi pemutaran video saat ini. Namun, secara internal, pengontrol pemutaran mendelegasikan ke objek BCOVPlaybackSession
. Sesi pemutaran melakukan pekerjaan sebenarnya dalam mempersiapkan dan memutar konten video, dan berisi metadata video dan AVPlayer
. Pengontrol pemutaran memiliki mekanisme untuk melanjutkan dari sesi pemutaran saat ini ke sesi pemutaran berikutnya, baik secara otomatis di akhir video, atau secara manual dengan pemanggilan metode. Setelah pengontrol pemutaran melanjutkan ke sesi baru, sesi sebelumnya akan dibuang dan tidak dapat digunakan lagi.
Ada dua elemen lain dari pengontrol pemutaran: BCOVPlaybackSessionProvider
, dan daftar BCOVPlaybackSessionConsumer
. Seperti namanya, penyedia sesi pemutaran bertanggung jawab untuk membuat sesi pemutaran dan mengirimkannya ke pengontrol pemutaran. Pengontrol pemutaran kemudian mengirimkan sesi ke setiap konsumen sesi pemutaran dalam daftar. API penyedia sesi dan konsumen sesi dirancang untuk digunakan oleh pengembang plugin, dan tidak dirinci dalam dokumen ini.
Selain fungsi pemutaran yang disediakan oleh kelas-kelas yang dijelaskan di atas, ada beberapa kelas nilai. Ini digunakan untuk menyimpan data khusus untuk Player SDK untuk iOS. Masing-masing dijelaskan secara lebih rinci pada bagian tersendiri di bawah ini.
Brightcove Player SDK untuk iOS menyediakan metode putar, jeda, dan pencarian di BCOVPlaybackController
. Penting untuk menggunakan metode ini daripada menggunakan metode yang setara dengan AVPlayer. Dalam implementasi defaultnya, objek ini meneruskan panggilan langsung ke metode terkait di AVPlayer. Namun, jika Anda menggunakan plugin, plugin tersebut mungkin mengesampingkan perilaku default untuk menambahkan fungsionalitas. Misalnya, jika menggunakan plugin periklanan, memanggil playbackController.play()
untuk pertama kalinya mungkin menyebabkan pra-putar diputar sebelum konten dimulai. Untuk mengetahui lebih lanjut tentang bagaimana sebuah plugin dapat mengesampingkan perilaku default, silakan rujuk ke setiap plugin README.md atau dengan memeriksa ekstensi kategori di BCOVSessionProviderExtension
yang mungkin ditambahkan oleh plugin.
Memanggil pemutaran, jeda, atau pencarian di AVPlayer secara langsung dapat menyebabkan perilaku tidak terdefinisi.
Untuk menyetel kecepatan pemutaran khusus untuk AVPlayer, Anda dapat menggunakan properti playbackRate
di BCOVPlaybackController
. Penting bagi Anda untuk menyetel kecepatan pemutaran menggunakan properti ini alih-alih menyetelnya langsung di AVPlayer.
Mencoba menyetel playbackRate
ke nilai 0 atau lebih rendah akan menghasilkan nilai yang disetel ke 1,0. Jika currentItem
AVPlayer tidak mendukung canPlaySlowForward
(untuk nilai kurang dari 1) atau canPlayFastForward
(untuk nilai lebih besar dari 1) maka kecepatan pemutaran default 1,0 akan digunakan. Pemutaran iklan tidak akan terpengaruh.
Jika nilai khusus telah ditetapkan untuk playbackRate
audioTimePitchAlgorithm
untuk setiap AVPlayerItem
akan ditetapkan ke AVAudioTimePitchAlgorithmTimeDomain
. Alternatifnya, Anda dapat menetapkan nilai Anda sendiri untuk audioTimePitchAlgorithm
seperti ini:
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didReceive lifecycleEvent : BCOVPlaybackSessionLifecycleEvent ) {
if lifecycleEvent . eventType == kBCOVPlaybackSessionLifecycleEventReady {
session . player . currentItem ? . audioTimePitchAlgorithm = . varispeed
}
}
Anda dapat membaca lebih lanjut tentang audioTimePitchAlgorithm
di sini.
Sejak rilis 6.12.0, SDK iOS telah menggunakan AVQueuePlayer yang menangani pramuat video berikutnya dalam antrean.
Namun, Anda mungkin ingin memiliki kontrol lebih besar atas pramuat video mendatang dalam daftar putar. Salah satu pendekatan yang mungkin dilakukan adalah melakukan buffering ganda pada daftar video menggunakan dua pengontrol pemutaran, misalnya:
playbackController1.setVideos([videos.firstObject])
)playbackController:didProgressTo:
pengontrol pemutaran menentukan apakah video saat ini telah berkembang cukup jauh ke tempat Anda ingin mulai memuat video berikutnyaSebagai contoh, Anda dapat mengunduh aplikasi sampel VideoPreloading kami dari repositori Sampel Pemain kami.
Catatan: Anda mungkin ingin memperhitungkan jumlah memori yang tersedia pada perangkat klien dan kecepatan koneksinya. Jika mereka tidak menggunakan Wifi, memuat video terlebih dahulu dapat memengaruhi sumber daya jaringan video saat ini.
Brightcove Player SDK untuk iOS memberi klien kemampuan untuk melampirkan beberapa url dan jenis pengiriman ( BCOVSource
) ke satu video ( BCOVVideo
). Misalnya, jika video Anda diambil oleh Layanan Pemutaran, mungkin ada campuran rendisi HLS atau MP4 untuk satu video, bersama dengan versi HTTP dan HTTPS. Sumber mana yang dipilih ditentukan oleh blok kebijakan pemilihan sumber. Kebijakan pemilihan sumber default akan memilih HLS BCOVSource
pertama di setiap BCOVVideo
, dengan sumber HTTPS lebih diutamakan daripada HTTP.
Pemilihan sumber dapat diganti dengan membuat BCOVBasicSessionProviderOptions
dan menggunakannya untuk membuat BCOVBasicSessionProvider
. Misalnya:
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let options = BCOVBasicSessionProviderOptions ( )
options . sourceSelectionPolicy = < policy >
let provider = sdkManager . createBasicSessionProvider ( withOptions : options )
let playbackController = sdkManager . createPlaybackController ( withSessionProvider : provider , viewStrategy : nil )
Jika kebijakan pemilihan default ini tidak sesuai untuk Anda, ada beberapa alternatif selain memilih sumber:
Jika mengambil video dari Video Cloud melalui Layanan Pemutaran, sebelum memanggil playbackController.setVideos()
, gunakan metode pembaruan pada BCOVVideo
untuk hanya memuat sumber yang Anda inginkan (lihat bagian "Nilai" untuk info lebih lanjut).
Anda dapat menggunakan metode pembantu [BCOVBasicSourceSelectionPolicy sourceSelectionHLSWithScheme:scheme]
untuk membuat kebijakan yang lebih memilih skema tertentu. Ini adalah metode yang digunakan untuk membuat kebijakan pemilihan sumber default yang lebih memilih HTTPS.
Mirip dengan memperbarui objek video, Anda juga dapat menerapkan blok pemilihan sumber Anda sendiri.
options . sourceSelectionPolicy = { ( video : BCOVVideo ? ) -> BCOVSource ? in
< Check video . sources for source >
< Return source >
}
Perlu diketahui bahwa ada batasan App Store terkait penggunaan video MP4. Periksa informasi Pengembang Apple terbaru untuk mengetahui detailnya.
Brightcove Player SDK untuk iOS menyediakan cara untuk mengatur bitrate pilihan untuk sebuah video. Anda dapat membuat objek BCOVPreferredBitrateConfig yang berisi opsi bitrate yang Anda inginkan, bersama dengan beberapa konfigurasi untuk pengontrol tampilan yang dibuat untuk menampilkan opsi.
Judul menu bersifat opsional. Opsi bitrate adalah larik NSDictionary dengan setiap kamus memiliki satu pasangan kunci:nilai. Kuncinya akan digunakan sebagai nama opsi, dan nilainya adalah NSNumber dengan bitrate untuk opsi tersebut dalam bps (bit per detik). Kecepatan bit yang Anda masukkan adalah nilai yang dapat dipetakan ke kecepatan bit rendisi aset video Anda. Anda dapat mempelajari lebih lanjut tentang rendisi di Praktik Terbaik Profil Penyerapan.
Berikut ini contohnya:
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 )
Ketika pengguna akhir memilih salah satu opsi, propertipreferPeakBitRate dari AVPlayerItem saat ini akan ditetapkan ke nilai opsi. Jika video ada dalam daftar putar, video berikutnya yang diputar juga akan memiliki nilai PreferPeakBitRate yang ditetapkan.
Setelah menetapkan nilai bukan nol untuk PreferredPeakBitRate, Anda mungkin tidak melihat perbedaan kualitas hingga AVPlayer mencapai akhir dari cache yang di-buffer saat ini.
Anda juga dapat menggunakan penginisialisasi configWithMenuTitle:bitrateOptions:andIndexofInitialSelection:
yang menyediakan kemampuan untuk mengatur indeks nilai awal pilihan Anda. Indeks harus berkorelasi dengan indeks opsi yang diinginkan dalam array bitrateOptions
.
Anda juga dapat menggunakan metode setPreferredPeakBitRate:
pada objek BCOVPlaybackController
untuk mengatur bitrate pilihan secara terprogram untuk sesi saat ini dan sesi mendatang.
CATATAN: Pengguna akhir harus diberikan cara untuk kembali ke nilai default (0) dari PreferPeakBitRate. Anda dapat melakukannya dengan memberikan opsi dengan nilai bitrate 0. Jika Anda tidak memberikan opsi bitrate 0, opsi "Otomatis" akan ditambahkan ke daftar opsi untuk pengguna akhir.
Silakan lihat dokumentasi Apple di PreferredPeakBitRate untuk informasi lebih lanjut.
Brightcove Player SDK untuk iOS menyediakan dua mekanisme untuk mendapatkan informasi pemutaran. Pengontrol pemutaran menyediakan properti delegasi yang mengimplementasikan BCOVPlaybackControllerDelegate
. Delegasi dapat menerapkan metode opsional ini untuk mendapatkan pemberitahuan tentang metadata pemutaran seperti kemajuan, perubahan durasi, dan acara lainnya. Jika plugin iklan dipasang, plugin ini juga dapat menggunakan delegasi ini untuk memberikan informasi tentang pemutaran iklan. Metode delegasi kejadian siklus hidup menyediakan kejadian untuk menandakan perubahan dalam status pemutaran. Misalnya, saat pemain berpindah dari status dijeda ke status diputar, metode delegasi peristiwa siklus hidup akan dipanggil dengan peristiwa kBCOVPlaybackSessionLifecycleEventPlay
. Peristiwa Siklus Hidup default dideklarasikan di BCOVPlaybackSession
. Plugin yang disediakan oleh Brightcove menambahkan peristiwa siklus hidup tambahan yang ditentukan di setiap plugin.
Pengontrol pemutaran memungkinkan satu delegasi. Dalam banyak kasus, ini sudah cukup untuk mendapatkan kembali informasi; implementasi delegasi dapat menyebarkan nilai dan peristiwa ke berbagai bagian aplikasi jika diperlukan. Jika diperlukan beberapa delegasi, seperti halnya saat mengembangkan plugin, delegasi BCOVPlaybackSessionConsumer
menyediakan fungsionalitas yang setara dengan metode BCOVPlaybackControllerDelegate
, termasuk data iklan.
Berikut adalah contoh bagaimana seseorang dapat menggunakan BCOVPlaybackSessionConsumer
untuk membuat plugin analitik:
class XYZAnalytics : NSObject , BCOVPlaybackSessionConsumer {
func playbackSession ( _ session : BCOVPlaybackSession , didProgressTo progress : TimeInterval ) {
//react to progress event
}
}
Untuk menggunakan plugin:
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let controller = sdkManager . createPlaybackController ( )
let analytics = XYZAnalytics ( )
controller . add ( analytics )
Ketika aplikasi mengalami gangguan jaringan, AVPlayer
yang digunakan oleh BCOVPlaybackController
dapat berhenti mencoba untuk memulihkan jika gangguan berlangsung terlalu lama. Jika ini terjadi, metode delegasi siklus hidup akan dipanggil dengan acara kBCOVPlaybackSessionLifecycleEventFailedToPlayToEndTime
. Ketika acara ini terjadi, pemutaran tidak akan pulih secara otomatis. Untuk memulihkan dari acara ini, Anda perlu mendeteksi ketika jaringan pulih dalam kode klien Anda.
Setelah Anda menentukan bahwa jaringan telah pulih, Anda dapat menggunakan playbackController.resumeVideo(at:withAutoPlay:)
untuk memulai kembali pemain. Anda perlu melacak di mana Anda ingin melanjutkan. Pemain akan melakukan upaya terbaik untuk menekan acara siklus hidup dan kemajuan acara, untuk mencegah iklan dari memutar ulang atau dari analitik yang diganggu.
Setelah menelepon playbackController.resumeVideo(at:withAutoPlay:)
, pemain akan mengirim acara siklus hidup tipe kBCOVPlaybackSessionLifecycleEventResumeBegin
. kBCOVPlaybackSessionLifecycleEventResumeComplete
akan dikirim jika tindakan ini berhasil, jika tidak, kBCOVPlaybackSessionLifecycleEventResumeFail
akan dikirim.
Anda harus menunggu sebelum menelepon playbackController.resumeVideo(at:withAutoPlay:)
untuk kedua kalinya sampai Anda menerima kBCOVPlaybackSessionLifecycleEventResumeComplete
atau kBCOVPlaybackSessionLifecycleEventResumeFail
dari panggilan sebelumnya. Anda mungkin ingin memaksakan batas ulang, sebelum memberi pengguna pesan bahwa jaringan mereka terlalu tidak stabil.
Ketika AVPlayer
masih dapat mengakses jaringan, tetapi video terhenti karena jaringannya terlalu lambat, metode delegasi siklus hidup akan dipanggil dengan acara kBCOVPlaybackSessionLifecycleEventPlaybackStalled
. Ketika pemutaran dapat dilanjutkan, metode delegasi siklus hidup akan dipanggil dengan acara kBCOVPlaybackSessionLifecycleEventPlaybackRecovered
. Peristiwa ini hanya mencakup kasus di mana pemutaran normal berhenti dan tidak mencakup buffering yang terjadi selama pencarian atau beban awal video.
Ketika video awalnya dimuat, ketika pencarian terjadi, atau ketika pemutaran terhenti karena jaringan yang lambat, metode delegasi siklus hidup akan dipanggil dengan acara kBCOVPlaybackSessionLifecycleEventPlaybackBufferEmpty
. Ketika pemutaran dapat dilanjutkan, metode delegasi siklus hidup akan dipanggil dengan acara kBCOVPlaybackSessionLifecycleEventPlaybackLikelyToKeepUp
.
Kecuali jika secara eksplisit didokumentasikan sebaliknya, tidak ada kelas di pemain SDK untuk iOS yang dirancang untuk disubklasian. Membuat subclass dari kelas SDK apa pun yang tidak dirancang secara eksplisit untuk disubklasir, terutama kelas nilai mana pun, dapat menghasilkan perilaku yang tidak dapat diprediksi.
Juga dikenal sebagai "objek model", kelas -kelas ini ( BCOVPlaylist
, BCOVVideo
, BCOVSource
, BCOVCuePoint
, BCOVCuePointCollection
) digunakan untuk mewakili data dalam pemain SDK untuk iOS. Sangat penting untuk memahami bahwa tipe data ini diperlakukan sebagai nilai , bukan identitas . Dengan ini, kami maksudkan bahwa jika Anda memiliki dua contoh kelas nilai yang memiliki data yang sama persis, mereka mewakili ide atau nilai yang sama, meskipun secara teknis mereka adalah dua objek yang berbeda pada alamat memori yang terpisah. Dengan kata lain, kode SDK maupun kode klien Anda tidak boleh menggunakan perbandingan identitas ("Pointer Equality") dengan objek nilai. Sebagai gantinya, setiap kelas nilai mengimplementasikan -isEqual:
dan memberikan kelebihan metode kesetaraan khusus kelas, yang salah satu dari yang harus digunakan sebagai gantinya.
Ini buruk:
if myVideo == session . video // Could lead to bugs!
Ini bagus (dan setara secara fungsional):
if myVideo . isEqual ( session . video )
if myVideo . isEqual ( toVideo : session . video )
Internal pemain SDK untuk iOS dapat melakukan hal -hal seperti memoisasi nilai atau membuat salinan defensif, jadi mengandalkan alamat pointer untuk memeriksa kesetaraan akan berakhir menyebabkan Anda sakit.
Kualitas lain dari kelas nilai di SDK pemain untuk iOS adalah mereka tidak bisa diubah . Setelah Anda memiliki contoh nilai, Anda tidak boleh mencoba menumbangkan keabadian ini dengan cara apa pun, karena dapat menyebabkan perilaku yang tidak dapat diprediksi. Jika dalam kode Anda, Anda ingin "memodifikasi" nilai dengan cara tertentu, satu -satunya jalan Anda adalah menciptakan nilai baru. Sebagai kenyamanan untuk membantu klien memperoleh nilai "dimodifikasi", masing -masing kelas nilai menawarkan metode -update:
yang mengambil blok yang memungkinkan Anda untuk beroperasi pada salinan yang dapat berubah dari nilai asli.
Berikut adalah contoh penggunaan metode ini untuk membuat versi "dimodifikasi" dari objek video yang ada, tetapi dengan properti yang berbeda:
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
Seperti yang dapat Anda lihat dalam contoh, video1
belum diubah oleh panggilan metode -update
. Sebaliknya, metode ini mengembalikan salinan video1
, kecuali dengan modifikasi yang dibuat di badan blok. Anda tidak boleh mengizinkan salinan yang dapat berubah untuk menghindari blok (seperti dengan menetapkannya ke variabel __block
), alih -alih menggunakan objek abadi yang dikembalikan dengan metode -update
setelah Anda membuat modifikasi.
Kelas layanan pemutaran, BCOVPlaybackService
, menyediakan fungsionalitas untuk mengambil aset video dan daftar putar Anda melalui API pemutaran Brightcove, termasuk metadata kaya seperti trek teks, pratinjau, dan thumbnail. Contoh berikut menunjukkan cara mengambil video dengan ID video. Metode untuk mengambil video atau daftar putar dengan ID referensi video itu juga tersedia.
[ 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 ( )
}
}
CATATAN: Jika Anda menggunakan Layanan Otorisasi Playback, harap tinjau bagian ReadMe ini terkait dengan fitur itu.
Untuk metode BCOVPlaybackService
yang mengembalikan daftar putar, Anda dapat meminta daftar putar parsial, atau "halaman" dari daftar putar dengan menentukan batas dan parameter offset dalam kamus parameter. Batas menentukan jumlah maksimum video yang akan dikembalikan, dan Offset menentukan indeks ke daftar putar di mana video akan dikembalikan.
Misalnya, jika Anda memiliki daftar putar dengan 100 video, Anda hanya dapat meminta 6 video mulai dari video nomor 10 sebagai berikut:
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 ( )
}
}
Objek BCOVPlaybackController
dibangun dengan strategi tampilan, yang memungkinkan Anda, sebagai klien SDK, untuk menentukan objek UIView yang tepat yang dikembalikan dari properti View Controller Playback. Ini penting ketika menggunakan plugin yang memengaruhi tampilan pengontrol pemutaran, seperti plugin iklan yang menutupi tampilan video dengan tampilan iklan. Banyak aplikasi tidak perlu membuat strategi tampilan, dan dapat dengan mudah melewati nil
saat membuat pengontrol pemutaran baru. Ini akan membuat tampilan video standar di pengontrol pemutaran.
BCOVPlaybackControllerViewStrategy
Typedef Aliases (dan Documents) tanda tangan blok yang lebih kompleks ini:
UIView *(^)(UIView *videoView, id playbackController);
Tanda tangan ini menjelaskan blok objektif-C yang mengembalikan UIVIEW dan mengambil dua parameter: UIVIEW dan pengontrol pemutaran. Nilai pengembalian adalah objek UIVIEW yang akan ditunjukkan oleh properti View Controller Playback. Parameter pertama adalah UIView yang berisi lapisan video, UIVIEW akan menampilkan video. Parameter kedua adalah objek pengontrol pemutaran yang telah diberikan strategi tampilan, pengontrol pemutaran dapat digunakan untuk menambahkan konsumen sesi yang diperlukan seperti kontrol video atau kontrol AD.
Contoh Implementasi Strategi Tampilan:
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
}
Memecah kode menjadi langkah -langkah: [1] Buat tampilan kontrol khusus yang sesuai dengan protokol BCOVPlaybackSessionConsumer
. Protokol BCOVPlaybackSessionConsumer
memungkinkan untuk menerima informasi pemutaran dasar untuk setiap video selain iklan. [2] Buat tampilan kontainer untuk tampilan video dan kontrol khusus. [3] Tambahkan sebagai subview wadah video dan kontrol khusus. Hirarki disusun dalam urutan yang sama dengan yang ditambahkan. [4] Buat tampilan kontrol iklan yang sesuai dengan protokol BCOVPlaybackSessionConsumer
. [5] Buat tampilan kontainer untuk tampilan dan kontrol video, dan tampilan iklan. [6] Tambahkan sebagai subview wadah video dan tampilan kontrol iklan. [7] Daftarkan tampilan kontrol khusus dan tampilan kontrol iklan sebagai konsumen sesi menggunakan objek pengontrol pemutaran yang dikembalikan oleh blok.
Ada satu peringatan untuk menggunakan strategi tampilan: Anda tidak boleh mengakses properti view
Controller Playback dari dalam blok View Strategy. Karena blok dipanggil karena properti view
Controller Playback diakses untuk pertama kalinya, mengakses properti view
lagi dalam blok View Strategy akan menyebabkan program Anda macet.
Secara default, ketika aplikasi iOS dikirim ke latar belakang, atau perangkat terkunci, iOS akan menjeda video apa pun yang diputar. Untuk mengubah perilaku ini, atur properti allowsBackgroundAudioPlayback
dari objek BCOVPlaybackController
ke true
. (Nilai standarnya false
, menunjukkan pemutaran akan berhenti di latar belakang.)
Anda juga harus mengikuti pedoman yang ditetapkan oleh Apple dalam T&J T&J Teknis QA1668 untuk menetapkan mode latar belakang yang tepat dan kategori sesi audio untuk aplikasi Anda.
Sangat penting bahwa AVPlayerLayer
dilepas dari AVPlayer
sebelum aplikasi dialihkan ke latar belakang (dan dipasang kembali ketika aplikasi kembali ke latar depan). SDK Pemain Brightcove akan menangani ini untuk Anda ketika allowsBackgroundAudioPlayback
diatur ke true
.
Akhirnya, saat memutar video latar belakang (dan terutama saat menggunakan daftar putar), Anda harus menggunakan API iOS MPRemoteCommandCenter
untuk memberikan kontrol pemutaran pengguna pada layar kunci dan di pusat kontrol.
Untuk mengaktifkan Picture-In-Picture dalam aplikasi Anda, atur properti showPictureInPictureButton
dari objek BCOVPUIPlayerViewOptions
ke true
ketika instantiating objek BCOVPUIPlayerView
Anda. Tombol gambar-in-picture kemudian akan ditampilkan di bilah kontrol pada perangkat apa pun yang mendukungnya.
Agar gambar-in-picture berfungsi dengan baik, Anda perlu memastikan bahwa Audio, AirPlay, and Picture in Picture
diputar di bagian Background Modes
tab Target kemampuan proyek Anda. Anda juga harus mengikuti pedoman yang ditetapkan oleh Apple dalam T&J T&J Teknis QA1668 untuk menetapkan mode latar belakang yang tepat dan kategori sesi audio untuk aplikasi Anda.
Metode AVPictureInPictureControllerDelegate
disahkan melalui BCOVPUIPlayerViewDelegate
. Metode ini adalah:
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 )
Lihat dokumentasi AvPictureInpictureControllerdelegate Apple untuk informasi lebih lanjut.
Untuk mengimplementasikan perilaku gambar-in-picture Anda sendiri, tinggalkan properti BCOVPlaybackController
allowsBackgroundAudioPlayback
ke false
, dan jaga agar properti pictureInPictureActive
dari BCOVPlaybackController
diperbarui dengan status gambar-in-picture. Jika Anda menggunakan AVPictureInPictureController
, Anda dapat menggunakan pictureInPictureControllerDidStartPicture(inPicture:)
dan pictureInPictureControllerDidStopPicture(inPicture:)
Delegasi metode untuk memperbarui properti ini.
Anda dapat membaca lebih lanjut tentang penerimaan gambar-in-picture dalam gambar mengadopsi Apple dalam gambar dalam dokumentasi pemain khusus.
Menggunakan daftar putar video dengan format campuran dengan gambar-in-picture akan mengakibatkan penutupan jendela gambar-in-picture antara setiap video.
iOS dan iPados 14 memperkenalkan perilaku gambar-in-picture otomatis yang dapat dihidupkan/dimatikan dalam Settings > General > Picture in Picture
. Agar fitur ini berfungsi seperti yang diharapkan, tampilan pemain harus sama dengan lebar layar dan tinggi harus memiliki rasio minimal 0,57 dengan lebar (16: 9 atau lebih besar). Jika lebar atau tinggi tampilan pemain Anda lebih kecil dari nilai-nilai ini gambar-in-picture mungkin tidak secara otomatis dipicu ketika aplikasi memasuki latar belakang.
Penting: Plugin IMA, Freewheel, Pulse dan SSAI masing-masing menangani fungsionalitas gambar-in-picture secara berbeda. Tinjau bagian gambar-in-picture di setiap plugin readme untuk informasi tambahan.
Pencarian thumbnail memungkinkan pengguna untuk menyeret playhead sepanjang garis waktu dan melihat thumbnail sebagai pratinjau konten yang terkait. Ini memberi pengguna kemampuan untuk dengan cepat menavigasi file video dan menemukan konten yang mereka minati.
Fitur ini juga disebut oleh Apple sebagai Trick Play, dan dirujuk dalam spesifikasi penulisan HLS mereka.
Fitur ini diaktifkan secara default. Jika Anda ingin menonaktifkan thumbnail yang mencari Anda dapat melakukannya dengan mengatur properti thumbnailSeekingEnabled
di BCOVPlaybackController
Anda menjadi false
.
playbackController . thumbnailSeekingEnabled = false
Anda dapat menyesuaikan tata letak pratinjau thumbnail dengan memanfaatkan metode delegasi dengan BCOVPUIPlayerView
Anda atau BCOVTVPlayerView
.
Di iOS Anda dapat menyesuaikan tinggi, lebar dan vertikal offset:
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 )
}
Di TVOS Anda dapat menyesuaikan tinggi dan lebar:
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
}
Jika secara manual membangun objek BCOVVideo
Anda dapat mengatur URL untuk digunakan untuk sumber Thumbnail WebVTT:
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 " )
} )
}
Pencarian thumbnail hanya tersedia untuk video online; Video yang diunduh/offline tidak mendukung fitur ini.
Anda dapat memasukkan bcovvideo tambahan, setelah bcovvideo lain sudah ada di antrian, ke dalam BCOVPlaybackController
Anda dengan menelepon insertVideo:afterVideoAtIndex:
.
Misalnya:
// This will insert the new video after the first video in the queue
playbackController . insert ( videoToInsert , afterVideoAt : 0 )
Ada dua metode delegasi yang dapat Anda manfaatkan untuk diberitahu tentang keberhasilan atau kegagalan permintaan.
func playbackController(_ controller: BCOVPlaybackController, didInsert video: BCOVVideo, at index: UInt)
func playbackController(_ controller: BCOVPlaybackController, failedToInsert video: BCOVVideo)
Generic Stream Concurrency (GSC) adalah layanan yang menentukan apakah pemutaran diizinkan berdasarkan sesi pemutaran aktif untuk penonton dan batas konkurensi yang telah ditetapkan. Layanan ini diminta melalui layanan Otorisasi Playback Edge (EPA). JWT yang sama yang digunakan untuk mengambil video digunakan di sini, dan harus menyertakan klaim uid
, klaim climit
dan secara opsional, klaim sid
. Fitur ini harus diaktifkan di AccCount Anda.
Konkurensi aliran generik tidak diaktifkan di SDK secara default. Jika Anda ingin mengaktifkannya, atur streamConcurrencyEnabled
properti BCOVPlaybackController
Anda ke true
.
playbackController . streamConcurrencyEnabled = true
Nilai sid
dapat dimasukkan dalam JWT atau dikirim sebagai opsi BCOVPlaybackController
, yang keduanya opsional. Nilai sid
dalam JWT telah diutamakan daripada opsi BCOVPlaybackController
.
playbackController . options [ kBCOVAuthHeartbeatPropertyKeySessionId ] = " sessionId "
Metode delegasi baru telah ditambahkan ke BCOVPlaybackControllerDelegate
untuk mengambil sesi aktif ketika batas konkurensi telah tercapai.
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didReachMaxConcurrency sessions : [ AnyHashable : Any ] ) {
print ( " ( sessions ) " )
}
Kesalahan pemutaran biasanya ditangani dan dilaporkan melalui acara pemutaran video dari pengontrol pemutaran. Jika Anda perlu menggali lebih dalam dan melacak masalah dengan video atau sesi aplikasi tertentu, Anda dapat memanfaatkan ID sesi SDK pemain BrightCove. Sesi ID adalah properti dari BCOVPlayerSDKManager
yang dapat Anda ambil seperti ini:
let sdkSessionID = BCOVPlayerSDKManager . sharedManager ( ) . sessionID
ID sesi adalah string unik yang tidak berubah selama siklus hidup aplikasi. String ini dilaporkan dengan berbagai data analitik lainnya ke server metrik BrightCove. Jika Anda mengalami masalah dengan instance aplikasi tertentu, atau video, Anda dapat merekam ID sesi dan mengirimkannya kembali ke server perusahaan Anda sendiri. Kemudian Anda dapat mengirim ID sesi, ID video, dan data terkait lainnya kepada Insinyur Layanan BrightCove untuk membantu mendiagnosis masalah apa pun.
Jika Anda perlu menggabungkan plugin pemain SDK, misalnya untuk menambahkan subtitle ke video yang dilindungi DRM yang memutar iklan yang dikelola oleh Google IMA, BCOVSessionProviders
dari masing-masing plugin dibuat dan dirantai bersama dan rantai digunakan untuk membangun 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 )
Pengembang memiliki kendali atas ukuran buffer pemutaran ke depan yang digunakan oleh AVPlayer
. Ini dilakukan dengan mengatur properti preferredForwardBufferDuration
di kelas AVPlayerItem
.
Secara default, SDK pemain asli Brightcove menetapkan properti preferredForwardBufferDuration
dengan cara yang mengoptimalkan bandwidth keseluruhan tanpa mengorbankan kualitas pemutaran. Perilaku ini dapat ditimpa dengan nilai -nilai Anda sendiri.
Setiap orang membayar bandwidth, jadi penting untuk mengurangi konsumsi bandwidth tanpa mempengaruhi kualitas pemutaran. Baru dengan versi 5.2.0, SDK pemain asli Brightcove mengelola ukuran buffer untuk Anda secara dinamis saat video diputar.
Sebelum ke iOS 10, AVPlayer
buffered sebanyak mungkin data video, hingga sekitar 50 megabyte. Ini bagus untuk model tampilan video di mana pengguna memilih video dan kemudian menontonnya sampai akhir, tetapi banyak aplikasi modern sekarang "menggoda" video dengan autoplay, berharap untuk mengamankan keterlibatan setelah beberapa detik. Banyak pengguna hanya beralih ke video yang berbeda. Dengan buffering agresif, Anda dapat berakhir dengan beberapa menit video buffered yang dibuang dengan setiap kesan video.
SDK pemutar asli Brightcove membahas masalah ini dengan memulai video dengan buffer baseline kecil, dan kemudian meningkatkannya saat pengguna menonton lebih banyak video. Setelah titik tertentu, ukuran buffer dibatasi karena tidak praktis atau bermanfaat untuk membuatnya terlalu besar.
Jika Anda ingin menjaga perilaku default SDK pemain asli Brightcove, tetapi memodifikasi nilai minimum dan maksimum yang digunakan untuk ukuran buffer, Anda dapat melakukan yang berikut saat mengatur 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
}
Opsi ini harus ditetapkan sebelum memanggil playbackController.setVideos()
.
Nilai min
dan max
:
AVPlayer
dapat buffer data yang tidak pernah dilihat.AVPlayerItem
yang memberitahu AVPlayer
untuk menentukan ukuran buffernya sendiri.Jika Anda tidak ingin optimasi buffer aktif aktif dalam sesi pemutaran Anda saat ini, Anda dapat menggunakan teknik yang sama, tetapi atur metode optimziasi menjadi "tidak ada" sebagai berikut:
// 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
}
Dengan metode yang diatur ke .none
, iOS akan mempertahankan kontrol penuh dari ukuran buffer maju.
Jika Anda ingin mengatur ukuran buffer Anda sendiri untuk pemutaran, pertama -tama mematikan optimasi buffer seperti yang dijelaskan di bagian sebelumnya. Kemudian, Anda dapat mengimplementasikan metode delegasi BCOVPlaybackController
berikut:
func playbackController ( _ controller : BCOVPlaybackController , didAdvanceTo session : BCOVPlaybackSession ) {
if let currentItem = session . player . currentItem {
// Set your preferredForwardBufferDuration value here.
currentItem . preferredForwardBufferDuration = newPreferredForwardBufferDurationValue
}
}
Jika Anda ingin mengubah ukuran buffer secara dinamis dari waktu ke waktu, Anda dapat mengatur 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
}
}
Catatan: Apple secara khusus menempatkan "Preferred" di preferredForwardBufferDuration
karena Anda dapat menetapkan nilai apa pun yang Anda inginkan, tetapi secara umum pemain AVPlayer
hanya akan menggunakannya sebagai pedoman. Juga perlu diingat bahwa mengaturnya ke nol mengembalikan kontrol penuh dari ukuran buffer ke AVPlayer
.
Anda dapat menggunakan AvplayerviewController alih -alih AvplayerLayer yang digunakan oleh kelas BCOVPlayBackSession. Menggunakan AvplayerviewController memungkinkan pemain untuk menggunakan kontrol pemain iOS dan TVOS asli, tetapi ada batasan untuk pendekatan ini (lihat di bawah).
Untuk menggunakan AvplayerViewController, Anda dapat mengatur properti Kamus BCOVPlayBackController yang disebut kBCOVAVPlayerViewControllerCompatibilityKey
:
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
}
Nilai default dari KBCOVAVAVAVPLOIWNICECROLLERERCOMPIBITY adalah false
, yang berarti bahwa bcovplayBackController yang dibuat tanpa properti kamus ini secara eksplisit diatur akan menggunakan avlayererer BCOVPlayBackSession secara default.
Plugin iklan Brightcove, Freewheel, Pulse dan SSAI kompatibel saat menggunakan AvplayerviewController. Anda dapat menggunakan AvplayerviewController's contentOverlayView
untuk tampilan untuk menampilkan iklan (tidak berlaku untuk SSAI).
Anda mungkin ingin menyembunyikan/menampilkan kontrol pemutaran AvplayerviewController sebelum dan sesudah iklan diputar:
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
}
Saat menggunakan AvplayerViewController dengan plugin dan iklan IMA Brightcove dengan tombol "Pelajari lebih banyak" Anda perlu membuat UIView tambahan untuk digunakan sebagai tampilan kontainer iklan. Ini karena AvplayerViewController's contentOverlayView
tidak interaktif sehingga mencoba mengetuk tombol "Pelajari lebih banyak" tidak akan berpengaruh. Anda dapat menggunakan playbackController:playbackSession:didEnterAdSequence:
dan playbackController:playbackSession:didExitAdSequence:
Delegasi metode untuk menampilkan dan menyembunyikan tampilan kontainer iklan Anda.
Jika menggunakan plugin IMA, Freewheel, Pulse, atau SSAI di TVOS, array AVInterstitialTimeRange
akan dibuat untuk setiap titik isyarat iklan dan ditetapkan pada interstitialTimeRanges
dari AVPlayerItem
yang terkait. Untuk plugin IMA, Freewheel dan Pulse Anda ingin membuat gerakan bermain/jeda sehingga ketika iklan aktif Anda dapat dengan benar menjeda dan melanjutkan iklan dan tidak mempengaruhi pemutaran video itu sendiri. Inilah contohnya:
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
}
Untuk menampilkan overlay iklan, seperti hitungan mundur, silakan lihat bagian Dukungan AvplayerViewController dari ReadMe plugin iklan yang Anda gunakan untuk beberapa panduan.
Perhatikan bahwa kompatibilitas AVPlayerViewController
SSAI khusus untuk TVOS karena ketersediaan AVInterstitialTimeRange
. Anda masih dapat memiliki pemutaran di iOS namun durasi video akan mencakup durasi semua iklan.
Kami memiliki proyek sampel yang menunjukkan penggunaan AvplayerViewController dengan Brightcove iOS SDK. Anda dapat menemukan proyek sampel iOS di sini dan proyek sampel TVOS di sini.
Saat menggunakan AvplayerviewController, acara Video_Engagement yang dikirim ke BrightCove Analytics Server akan melaporkan 0 untuk player_width dan player_height.
Jika Anda menggunakan layanan otorisasi pemutaran, Anda perlu menggunakan layanan pemutaran BCOVPlaybackService.ConfigurationKeyAuthToken
kunci konfigurasi.
// 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
...
}
Catatan: Dalam hal daftar putar, semua video di daftar putar harus menggunakan token yang sama. Dalam rilis berikutnya, menetapkan token yang berbeda untuk setiap video di daftar putar akan dimungkinkan. Anda akan bertanggung jawab untuk mempertahankan pemetaan antara ID video dan token.
Sulih suara didukung di luar kotak untuk kontrol pemutaran. Secara default, jika sulih suara diaktifkan, tampilan kontrol bcovplayerui tidak akan disembunyikan secara otomatis. Menggunakan gerakan aktivasi sulih suara ganda pada tampilan pengontrol pemutaran akan mengalihkan visibilitas tampilan kontrol. Ada accessibilityHint
HART yang ditetapkan pada tampilan pengontrol pemutaran. accessibilityLabel
dari setiap kontrol BCOVPlayerui dapat disesuaikan dalam aplikasi Anda.
Untuk mengubah nilai accessibilityLabel
dari salah satu tombol dalam tampilan kontrol, Anda harus mengatur objek menjadi BCOVPUIButtonAccessibilityDelegate
seperti ini:
playerView . controlsView . setButtonsAccessibilityDelegate ( self )
Anda kemudian harus memiliki objek itu sesuai dengan protokol BCOVPUIButtonAccessibilityDelegate
dengan mengesankan - (NSString *)accessibilityLabelForButton:(BCOVPUIButton *)button isPrimaryState:(BOOL)isPrimaryState
Mirip dengan ini:
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
}
}
Jika nilai nil
dikembalikan, nilai default akan digunakan.
Mengatur accessibilityHint
pada pengontrol pemutaran dapat dilakukan seperti ini:
playbackController . view . accessibilityHint = " Double tap to show or hide controls "
Demikian pula Anda dapat mengatur label accessibilityLabel
pada label waktu dan durasi saat ini, bersama dengan slider kemajuan, seperti ini:
playerView . controlsView . durationLabel . accessibilityLabelPrefix = " Total Time "
playerView . controlsView . currentTimeLabel . accessibilityLabelPrefix = " Current Time "
playerView . controlsView . progressSlider . accessibilityLabel = " Timeline "
Anda dapat memberikan lokalisasi bahasa tambahan yang tidak mendukung IOS SDK Brightcove.
+
di bawah bagian "Lokalisasi". Untuk mendefinisikan domain proxy untuk layanan pemutaran, metrik, dan server analitik di Cina, menetapkan properti chinaProxyDomain
dari singleton BCOVGlobalConfiguration
ke nama domain yang sepenuhnya memenuhi syarat. Misalnya:
BCOVGlobalConfiguration . sharedConfig . chinaProxyDomain = " host.mydomain.com "
Pastikan untuk mengatur nama domain proxy sebelum menggunakan layanan lain dari pemain asli SDK. Lihat referensi kelas BCOVGLOBALConfiguration untuk detailnya.
Bergantung pada bagaimana Anda membutuhkan aplikasi Anda untuk melakukan ketika datang ke pemutaran audio, Anda dapat mengonfigurasi avaudiosession agar sesuai dengan kebutuhan spesifik Anda. Misalnya jika Anda ingin mendukung AirPlay 2 dan beberapa rute audio, lihat bagian AirPlay dari ReadMe ini.
Avaudiosession dasar dapat dikonfigurasi seperti ini:
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
}
Konfigurasi ini biasanya dapat dilakukan dalam application:didFinishLaunchingWithOptions:
Method. Mungkin ada situasi di mana Anda memerlukan konfigurasi Avaudiosession yang lebih canggih, misalnya jika Anda ingin mengizinkan audio dari aplikasi lain untuk didengar ketika audio di aplikasi Anda diredam. Dalam situasi ini Anda dapat mengonfigurasi avaudiosession di pengontrol tampilan yang memiliki akses ke avplayer Anda saat ini. Misalnya:
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! ) " )
}
}
Kode sampel dapat ditemukan di proyek sampel VideocloudBasicPlayer kami.
Anda dapat membaca lebih lanjut tentang Avaudiosession di sini.
Pemain Brightcove SDK mendukung aliran audio saja dan mencakup beberapa fitur audio saja. Jika Anda telah mengkonfigurasi gambar poster untuk video Anda, gambar itu akan ditampilkan di contentOverlayView
dari BCOVPUIPlayerView
Anda. Anda dapat menyesuaikan UIViewContentMode
dari tampilan gambar poster dengan menggunakan properti contentModeForPosterImage
di BCOVPUIPlayerViewOptions
, nilai defaultnya adalah UIViewContentModeScaleAspectFit
.
Anda juga mungkin ingin menjaga kontrol pemain terlihat setiap saat, dalam hal ini Anda dapat mengaktifkan keepControlsVisible
di BCOVPUIPlayerViewOptions
.
Jika Anda tidak ingin menampilkan gambar poster atau hanya ingin tampilan pemutaran yang lebih kompak, Anda dapat mengatur ketinggian tampilan induk BCOVPUIPlayerView
Anda ke ketinggian 88 pt untuk tata letak yang kompak (<450 pt) atau ketinggian 44 pt untuk untuk tata letak standar.
Ada tiga tata letak BCOVPUIBasicControlView
yang telah dikonfigurasi sebelumnya yang dapat Anda gunakan jika Anda tidak menggunakan automaticControlTypeSelection
:
basicControlViewWithAODLayout
basicControlViewWithLiveAudioLayout
basicControlViewWithLiveDVRAudioLayout
Anda juga dapat diberi tahu jika aliran hanya audio atau video+audio dengan 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 kami memiliki dukungan untuk menampilkan informasi media di layar kunci, pusat kontrol, dan AirPlay. Lihat kelas NowPlayingHandler
untuk detail implementasi.
Bumper video adalah aset pendek, biasanya 10 detik atau kurang, yang diputar di hadapan semua media lain dan biasanya menunjukkan merek atau perusahaan yang diwakili oleh video Anda. Seorang pemain akan meminta bumper dari API pemutaran seperti video lainnya, dan memasukkannya sebelum iklan dan konten.
Bumper adalah fitur tingkat pemain, yang berarti pemain yang diberikan hanya dapat dikaitkan dengan bumper tunggal. Daftar putar berbagi video bumper yang sama. Ada dua cara untuk mengonfigurasi pemain untuk memutar video bemper:
bumperID
. ID video yang harus ditemukan. // 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
...
}
Bidang bumper_id
dapat didefinisikan dalam bidang khusus di Videocloud/Studio. bumper_id
dapat digunakan tanpa tanda tangan yang sebelumnya ditentukan. bumper_id
harus berupa ID video yang valid.
Catatan: Bumperid melewati bidang kustom (bidang bumper_id
) diutamakan daripada ID apa pun di layanan pemutaran.
Kontrol pemutaran dapat disembunyikan saat bemper sedang diputar.
let options = BCOVPUIPlayerViewOptions ( )
options . automaticControlTypeSelection = true
options . showBumperControls = false
let playerView = BCOVPUIPlayerView ( playbackController : nil , options : options , controlsView : nil )
Jika opsi automaticControlTypeSelection
diatur ke true
, tata letak untuk bumper akan beradaptasi dengan konten (video atau audio saja). basicControlViewWithVODLayout
dan basicControlViewWithAODLayout
Layout dirancang untuk bumper, tata letak Live
atau LiveDVR
tidak tersedia. Kontrol pemutaran memiliki penampilan yang unik saat bumper aktif:
Dukungan untuk interaktivitas diintegrasikan ke dalam kerangka kerja inti BrightCoveplayersDK . Untuk detail lengkap tentang penggunaan interaktivitas dengan Brightcove Native Player SDK, lihat panduan interaktivitas.
Jika konten dikemas sebagai MP4, Anda dapat menempelkan URL langsung ke sebagian besar browser web, dan video harus diputar (atau mengunduh ke sistem file Anda, di mana Anda dapat memutarnya secara lokal). Jika konten dikemas sebagai HLS, Anda dapat menggunakan QuickTime Player untuk mengujinya: Pilih File -> Open Location…
dan Tempel di URL Daftar Putar .m3u8
, dan video harus diputar.
Ini adalah gejala umum yang disebut sebagai uIKit utas utama atau metode avfoundation dari utas non-utama. Metode delegasi pada BCOVPlaybackControllerDelegate
selalu dipanggil di utas utama.
Pesan ini menunjukkan bahwa kebijakan pemilihan sumber default tidak dapat dipilih sumber mana yang harus dipilih. Kebijakan default memilih sumber pertama yang deliveryMethod
adalah kBCOVSourceDeliveryHLS
("hls"). Jika tidak ada sumber HLS yang ditemukan, perilaku fallback -nya akan memilih sumber pertama yang deliveryMethod
adalah kBCOVSourceDeliveryMP4
("mp4"). Jika tidak ada sumber dengan deliveryMethod
"HLS" atau "MP4" ada di video, kebijakan tersebut akan memilih sumber pertama video (terlepas dari deliveryMethod
). Jika Anda tidak senang dengan pilihannya, Anda dapat menggunakan -[BCOVPlayerSDKManager createBasicSessionProviderWithOptions:]
dan lulus dalam contoh BCOVBasicSessionProviderOptions
dengan sourceSelectionPolicy
Kustom. Saat membuat video dan sumber secara manual, pastikan bahwa sumber dibuat dengan deliveryMethod
yang sesuai.
API yang mengontrol apakah suatu aplikasi memancarkan audio di aplikasi iOS adalah API Avaudiosession. Sesi audio bersifat global untuk suatu aplikasi, yang berarti bahwa konfigurasinya mempengaruhi kedua suara yang dipancarkan oleh Avplayer yang dibuat oleh pemain SDK, serta suara -suara lain yang dapat diproduksi oleh suatu aplikasi. Karena pemain SDK tidak dapat mengetahui bagaimana aplikasi menginginkan sesi audio yang dikonfigurasi untuk suara -suara lain, itu tidak mempengaruhi sesi audio sama sekali. 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.