Brightcove обеспечивает активную поддержку последней версии iOS SDK в последней общедоступной версии следующих версий iOS:
Brightcove предоставляет пассивную поддержку для следующих версий iOS:
Core SDK локализован для арабского (ar), английского (en), французского (fr), немецкого (de), японского (ja), корейского (ko), испанского (es), упрощенного китайского (zh-Hans) и традиционного языков. Китайский (чж-хант). Чтобы получить преимущества от локализации, ваше приложение также должно быть локализовано для того же языка и локали. Дополнительную информацию см. в разделе «Пользовательская локализация».
Все компоненты SDK — ядро и платформы плагинов — выпускаются с одним и тем же номером версии. При обновлении любого отдельного компонента обновите все компоненты до одной и той же версии.
Для проектов, использующих Xcode 12 на Apple Silicon M1 и Universal Frameworks (.framework), при сборке проекта для симулятора Arm64 возвращается ошибка сборки.
*ld: building for iOS Simulator, but linking in dylib built for iOS, file for architecture arm64*
Чтобы выполнить сборку для симулятора Arm64, убедитесь, что arm64
добавлен в параметр сборки «Исключенные архитектуры» для Any iOS Simulator SDK
на вкладке «Настройки сборки» целевого приложения.
В выпуск 6.10.0 Brightcove Player SDK добавлены подспецификации для ядра и каждого плагина для поддержки XCFrameworks. Значение по умолчанию для каждой подспецификации — /XCFramework
.
Имя подспецификации | Имена подспецификаций |
---|---|
Brightcove-Player-Core | Brightcove-Player-Core/Framework Brightcove-Player-Core/XCFramework |
Brightcove-Player-DAI | Brightcove-Player-DAI/Framework Brightcove-Player-DAI/XCFramework |
Brightcove-Player-FreeWheel | Brightcove-Player-FreeWheel/Framework Brightcove-Player-FreeWheel/XCFramework |
Brightcove-Player-GoogleCast | Brightcove-Player-GoogleCast/Framework Brightcove-Player-GoogleCast/XCFramework |
Brightcove-Player-IMA | Brightcove-Player-IMA/Framework Brightcove-Player-IMA/XCFramework |
Brightcove-Player-Omniture | Brightcove-Player-Omniture/Framework Brightcove-Player-Omniture/XCFramework |
Brightcove-Player-Pulse | Brightcove-Player-Pulse/Framework Brightcove-Player-Pulse/XCFramework |
Brightcove-Player-SSAI | Brightcove-Player-SSAI/Framework Brightcove-Player-SSAI/XCFramework |
Brightcove-Player-OpenMeasurement | - |
В выпуске 6.12.0 Brightcove Player SDK обновляются подспецификации Brightcove-Player-FreeWheel
и Brightcove-Player-Omniture
для установки динамической версии BrightcovePlayerSDK
.
Имя подспецификации | Тип платформы | Зависимость |
---|---|---|
Brightcove-Player-Core | динамичный | - |
Brightcove-Player-DAI (доступен с версии 6.12.7) | динамичный | Brightcove-Player-Core |
Brightcove-Player-FreeWheel | динамичный | Brightcove-Player-Core для iOS, Brightcove-Player-Core для tvOS |
Brightcove-Player-GoogleCast | статический | Brightcove-Player-Core |
Brightcove-Player-IMA | динамичный | Brightcove-Player-Core |
Brightcove-Player-Omniture | динамичный | Brightcove-Player-Core |
Brightcove-Player-Pulse | динамичный | Brightcove-Player-Core |
Brightcove-Player-SSAI | динамичный | Brightcove-Player-Core, Brightcove-Player-OpenMeasurement (только для открытого измерения) |
Brightcove-Player-OpenMeasurement (доступно с версии 6.10.0) | динамичный | - |
Поддержка видео, защищенных FairPlay, интегрирована в базовую структуру BrightcovePlayerSDK . Обратитесь к руководству FairPlay для получения полной информации об использовании FairPlay с Brightcove Native Player SDK.
Поддержка дополнительных субтитров интегрирована в базовую структуру BrightcovePlayerSDK . Полную информацию об использовании сопроводительных субтитров с пакетом Brightcove Native Player SDK см. в руководстве по сопроводительным субтитрам.
Начиная с версии 6.0.0, Brightcove Native Player SDK позволяет загружать видео HLS, в том числе защищенные шифрованием FairPlay, для последующего воспроизведения онлайн или оффлайн. Подробную информацию см. в руководстве разработчика приложения:
Руководство разработчика приложений iOS по загрузке видео и автономному воспроизведению с помощью FairPlay
Brightcove Player SDK предоставляет установочные пакеты для iOS и tvOS в виде динамических библиотек, упакованных как Frameworks и XCFrameworks. Развертывание поддерживается на iOS 12.0 и более поздних версиях.
Вы можете использовать CocoaPods, чтобы добавить Brightcove Player SDK в свой проект. Вы можете найти последнюю версию модуля Brightcove-Player-Core
здесь. Подспецификация поддерживает как iOS, так и tvOS.
При использовании Brightcove CocoaPods в своем проекте добавьте source 'https://github.com/brightcove/BrightcoveSpecs.git'
в начало вашего подфайла.
имя.
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 можно установить, добавив к модулю подспецификацию /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
При обновлении установки рекомендуется обновить локальную копию репозитория BrightcoveSpecs, чтобы у вас были последние версии подспецификаций локально, так же, как вы обновляете главный репозиторий CococaPods. Обычно, если вы запускаете pod update
в Терминале, это происходит автоматически или, альтернативно, вы можете обновить явно с помощью pod repo update
.
Чтобы добавить Brightcove Player SDK в проект вручную:
BrightcovePlayerSDK.framework
или BrightcovePlayerSDK.xcframework
в свой проект. Обязательно используйте версию, соответствующую вашей целевой системе, iOS или tvOS.BrightcovePlayerSDK.framework
/ BrightcovePlayerSDK.xcframework
bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
. Установите флажок «Запускать скрипт только при установке». Это позволит удалить ненужные архитектуры из сборки, что важно для отправки в App Store. Этот шаг больше не требуется при использовании XCFramework.bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
. Установите флажок «Запускать скрипт только при установке». Это позволит удалить ненужные архитектуры из сборки, что важно для отправки в App Store.Any iOS Simulator SDK
добавлен arm64
.Для справки, вот все компоненты SDK и соответствующие URL-адреса, которые помогут вам найти и загрузить последние версии:
Компонент | URL-адрес |
---|---|
Brightcove-Player-Core | https://github.com/brightcove/brightcove-player-sdk-ios/tags |
Brightcove-Player-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-Player-GoogleCast | https://github.com/brightcove/brightcove-player-sdk-ios-googlecast/tags |
Brightcove-Player-IMA | https://github.com/brightcove/brightcove-player-sdk-ios-ima/tags |
Brightcove-Player-Omniture | https://github.com/brightcove/brightcove-player-sdk-ios-omniture/tags |
Brightcove-Player-Pulse | https://github.com/brightcove/brightcove-player-sdk-ios-pulse/tags |
Brightcove-Player-SSAI | https://github.com/brightcove/brightcove-player-sdk-ios-ssai/tags |
Чтобы добавить Brightcove Player SDK в свой проект с помощью Swift Package Manager:
https://github.com/brightcove/brightcove-player-sdk-ios.git
Примечание. Для Swift Package Manager поддерживается только динамический XCFramework.
Brightcove Player SDK для iOS можно импортировать с помощью:
import BrightcovePlayerSDK;
Воспроизведение видео с помощью Brightcove Player SDK для 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 ( )
}
}
Вам необходимо предотвратить автоматическое освобождение контроллера в конце метода. Распространенный способ сделать это — сохранить ссылку на контроллер в сильной переменной экземпляра.
Начиная с версии 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. Здесь мы связываем контроллер воспроизведения (и, следовательно, все видео, которые он воспроизводит) с элементами управления.
// 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 )
}
Вам нужно будет настроить макет для представления проигрывателя, вы можете сделать это с помощью Auto Layout или более старого подхода Springs & Struts.
Настройте вид проигрывателя так, чтобы он соответствовал видеоконтейнеру из вашего макета ( videoView
) при изменении его размера.
playerView . frame = videoView . bounds
playerView . autoresizingMask = [ . flexibleHeight , . flexibleWidth ]
Установите translatesAutoresizingMaskIntoConstraints
в BCOVPUIPlayerView значение false
.
playerView . translatesAutoresizingMaskIntoConstraints = false
Затем добавьте ограничения для макета; установка верхних, правых, левых и нижних привязок вашего BCOVPUIPlayerView равными привязкам videoView
NSLayoutConstraint . activate ( [
playerView . topAnchor . constraint ( equalTo : videoView . topAnchor ) ,
playerView . rightAnchor . constraint ( equalTo : videoView . rightAnchor ) ,
playerView . bottomAnchor . constraint ( equalTo : videoView . bottomAnchor ) ,
playerView . leftAnchor . constraint ( equalTo : videoView . leftAnchor )
] )
Класс BCOVPUIPlayerViewOptions
позволяет вам настроить некоторое поведение BCOVPlayerUI при инициализации. Вы можете настроить следующее:
jumpBackInterval
Время в секундах, в течение которого игрок будет возвращаться назад при нажатии кнопки возврата.
hideControlsInterval
Время в секундах после последнего события касания, прежде чем элементы управления будут скрыты.
hideControlsAnimationDuration
Время в секундах, необходимое для анимации элементов управления и их скрытого состояния.
showControlsAnimationDuration
Время в секундах, необходимое для того, чтобы элементы управления анимировались и стали видимыми.
learnMoreButtonBrowserStyle
Параметр, определяющий, будет ли нажатие кнопки «Подробнее» на объявлении отображать ссылку перехода во внешнем браузере (настройка по умолчанию) или во внутреннем браузере.
presentingViewController
Подкласс UIViewController, используемый для представления других контроллеров представления (например, контроллера представления выбора субтитров).
automaticControlTypeSelection
Хотите ли вы, чтобы BCOVPUIPlayerView
автоматически выбирал тип BCOVPUIBasicControlView
на основе типа носителя. Если для этого значения установлено true
свойство BCOVPUIBasicControlView
, переданное в инициализатор BCOVPUIPlayerView
будет игнорироваться.
Видео + аудио потоки
basicControlViewWithVODLayout
basicControlViewWithLiveLayout
basicControlViewWithLiveDVRLayout
Потоки только для аудио
basicControlViewWithAODLayout
basicControlViewWithLiveAudioLayout
basicControlViewWithLiveDVRAudioLayout
ПРИМЕЧАНИЕ. automaticControlTypeSelection
выбирает макеты из тех, которые предоставлены BCOVPlayerUI, поэтому пользовательские элементы управления и макеты будут перезаписаны; automaticControlTypeSelection
и настройка пользовательского интерфейса проигрывателя несовместимы.
Параметры можно установить, используя следующий метод:
let manager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = manager . createPlaybackController ( )
let options = BCOVPUIPlayerViewOptions ( )
options . jumpBackInterval = 5
let playerView = BCOVPUIPlayerView ( playbackController : playbackController ,
options : options )
Для поддержки различных типов видео предусмотрены три макета:
BCOVPUIControlLayout basicVODControlLayout
— это базовый макет для обычных видеопотоков по требованию.
BCOVPUIControlLayout basicLiveControlLayout
— это макет для живого видео.
BCOVPUIControlLayout basicLiveDVRControlLayout
— это макет для потокового видео в реальном времени с элементами управления DVR.
Обычно вы устанавливаете новый макет сразу после создания BCOVPUIPlayerView
, но вы также можете установить новый макет в любое время. Например, вы можете установить новый макет VOD следующим образом:
playerView ? . controlsView . layout = BCOVPUIControlLayout . basicVOD ( )
В дополнение к макетам по умолчанию вы можете создавать свои собственные макеты с широкими возможностями настройки, создав новый экземпляр BCOVPUIControlLayout
с собственным дизайном. Однако обратите внимание , что automaticControlTypeSelection
выбирает макеты из тех, которые предоставлены BCOVPlayerUI, поэтому пользовательские элементы управления и макеты будут перезаписаны; automaticControlTypeSelection
и настройка пользовательского интерфейса проигрывателя несовместимы.
Сначала создайте элементы управления, которые будут включены в ваш макет, используя BCOVPUIBasicControlView layoutViewWithControlFromTag:width:elasticity:
. Каждый элемент управления упакован в BCOVPUILayoutView
, который определяет расстояние между элементами управления.
Вы можете установить width
каждого вида макета по умолчанию (которая зависит от типа элемента управления) или указать свою собственную ширину.
Используйте аргумент elasticity
, чтобы определить, насколько представление макета, содержащее элемент управления, изменяет свою ширину для заполнения панели управления.
Вот примеры создания различных базовых элементов управления.
// Create various standard layout views
// Standard play/pause button
let playbackLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonPlayback ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Standard jump back button
let jumpBackButtonLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonJumpBack ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Current time indicator
let currentTimeLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelCurrentTime ,
width : kBCOVPUILayoutUseDefaultValue
elasticity : 0.0 )
// Time separator - typically the '/' character
let timeSeparatorLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelTimeSeparator ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Video duration label
let durationLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelDuration ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Slider bar used for seeking through the video
// The elasticity is set to 1 so that it can resize to fill available space
let progressLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . sliderProgress ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 1.0 )
// Closed caption button
// This button is initially hidden ('removed'), and will be shown
// if closed captions or audio tracks are available.
let closedCaptionLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonClosedCaption ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
closedCaptionLayoutView ? . isRemoved = true
// The full-screen button
let screenModeLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonScreenMode ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// AirPlay button
// This button is initially hidden ('removed'), and will be shown
// if AirPlay devices are available.
let externalRouteLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewExternalRoute ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
externalRouteLayoutView ? . isRemoved = true
// Empty view - used as a spacer
let spacerLayoutView1 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 1.0 ,
elasticity : 1.0 )
// Empty view - used as a spacer
let spacerLayoutView2 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 1.0 ,
elasticity : 1.0 )
// Empty view - will have a custom UIImageView added as a subview
let logoLayoutView1 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 88.0 ,
elasticity : 1.0 )
// Empty view - will have a custom UIImageView added as a subview
let logoLayoutView2 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 36.0 ,
elasticity : 1.0 )
Обратите внимание, что вы также можете создать пустое представление макета, в которое вы можете поместить свое собственное представление (логотип, элемент управления, ничего и т. д.). Этот код показывает, как разместить логотип UIImage
внутри logoLayoutView1, который мы создали выше.
// Create logo image inside an image view for display in control bar.
let logoImage1 = UIImage ( named : " myLogo " )
let logoImageView1 = UIImageView ( image : logoImage1 )
logoImageView1 . autoresizingMask = [ . flexibleWidth , . flexibleHeight ]
logoImageView1 . contentMode = . scaleAspectFit
logoImageView1 . frame = logoLayoutView1 . frame
// Add image view to our empty layout view.
logoLayoutView1 . addSubview ( logoImageView1 )
Теперь, когда в представлениях макета упакованы различные элементы управления, они упорядочены в массивы, каждый из которых представляет одну строку элементов управления, то есть панель управления. Обратите внимание, что у вас могут быть разные макеты для книжной и альбомной ориентации, поэтому обычно вы настраиваете два разных массива панелей управления.
В стандартной компоновке для альбомной ориентации элементы управления располагаются в одном массиве, а затем этот массив сохраняется в другом массиве, представляющем весь набор элементов управления.
let standardLayoutLine1 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
currentTimeLayoutView ,
timeSeparatorLayoutView ,
durationLayoutView ,
progressLayoutView ,
spacerLayoutView1 ,
logoLayoutView1 ,
spacerLayoutView2 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView
]
let standardLayoutLines = [ standardLayoutLine1 ]
В компактном макете для книжной ориентации создаются два массива элементов управления, по одному на каждую строку. Эти массивы упаковываются в другой массив, представляющий компактный макет.
Обратите внимание, что для большинства элементов управления в каждом макете используются одни и те же объекты. Когда это будет сделано и вы переключитесь между книжной и альбомной ориентацией, объект будет перемещен в новое положение с помощью плавной анимации.
let compactLayoutLine1 = [
currentTimeLayoutView ,
progressLayoutView ,
durationLayoutView
]
let compactLayoutLine2 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
spacerLayoutView1 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView ,
logoLayoutView2
]
let compactLayoutLines = [
compactLayoutLine1 ,
compactLayoutLine2
]
Наконец, теперь, когда есть две конфигурации макета (одна для полной ширины и одна для компактной ширины), вы можете создать новый объект BCOVPUIControlLayout
и установить его в представлении управления проигрывателя.
let customLayout = BCOVPUIControlLayout . init ( standardControls : standardLayoutLines ,
compactControls : compactLayoutLines )
playerView ? . controlsView . layout = customLayout
Если у вас есть элементы управления, которые вам нужно часто отображать или скрывать, вы можете установить removed
свойство в представлении макета этого элемента управления. После изменения элементов управления вызовите setNeedsLayout
в элементе управления playerView:
logoLayoutView1 ? . isRemoved = true
playerView ? . controlsView . setNeedsLayout ( )
Вы также можете настроить несколько общих свойств BCOVPUIControlLayout
:
controlBarHeight
устанавливает размер каждой строки элементов управления.horizontalItemSpacing
устанавливает расстояние между каждым BCOVPUILayoutView
на каждой панели управления.compactLayoutMaximumWidth
определяет, какой набор элементов управления используется. Если представление элемента управления меньше compactLayoutMaximumWidth
, будет использоваться компактный набор элементов управления, в противном случае будут использоваться стандартные элементы управления. Чтобы изменить набор отображаемых элементов управления, необходимо создать и установить новый BCOVPUIControlLayout
. Новые элементы управления могут быть установлены в любое время.
Дополнительные примеры настройки PlayerUI можно посмотреть в образце кода в папке PlayerUI репозитория BrightcoveOS GitHub:
https://github.com/BrightcoveOS/ios-player-samples
Brightcove Native Player SDK включает встроенные элементы управления воспроизведением в tvOS на Apple TV. Полную информацию об использовании встроенного пользовательского интерфейса ТВ-плеера с пакетом Brightcove Native Player SDK см. в нашем руководстве по ТВ-плееру.
Включите функциональность AirPlay, установив для свойства setAllowsExternalPlayback
вашего BCOVPlaybackController
значение true
. Кнопка AirPlay будет отображаться в элементах управления воспроизведением, если в вашей сети будут обнаружены устройства AirPlay.
В настоящее время IMA — единственный рекламный плагин, который поддерживает AirPlay и только при использовании рекламы в начале и/или конце ролика. Использование AirPlay с рекламными плагинами Pulse, SSAI или FreeWheel может привести к неожиданному поведению.
Если вы также хотите поддерживать AirPlay 2 и разрешить выбор нескольких устройств для вывода звука, вам придется сделать несколько дополнительных действий. Во-первых, вам нужно настроить AVAudioSession, чтобы вы могли установить routeSharingPolicy
. Например:
do {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , mode : . moviePlayback , policy : . longFormVideo )
} catch {
print ( " Error setting AVAudioSession category " )
}
Вам также потребуется настроить хотя бы одну команду воспроизведения через MPRemoteCommandCenter
. По крайней мере, вам понадобится настроить и pauseCommand
, и playCommand
. Например:
let center = MPRemoteCommandCenter . shared ( )
center . pauseCommand . addTarget { _ in
playbackController . pause ( )
return . success
}
center . playCommand . addTarget { _ in
playbackController . play ( )
return . success
}
Устройства будут использовать преимущества AVRoutePickerView
, который имеет два метода делегирования. Эти методы делегата передаются в BCOVPUIPlayerViewDelegate
. Методы:
func routePickerViewDidEndPresentingRoutes ( _ routePickerView : AVRoutePickerView )
func routePickerViewWillBeginPresentingRoutes ( _ routePickerView : AVRoutePickerView )
AVRouteDetector
используемый для обнаружения маршрутов AirPlay, доступен в объекте BCOVPUIBasicControlView
, поэтому вы можете при необходимости включать или отключать его routeDetectionEnabled
.
Согласно документации Apple: « Обнаружение маршрута значительно увеличивает энергопотребление, и его необходимо отключить, когда оно больше не нужно».
playerView ? . controlsView . routeDetector . isRouteDetectionEnabled = false
Дополнительную информацию о включении AirPlay 2 в ваше приложение см. в документации «Как включить Airplay 2 в ваше приложение».
Native Player SDK включает поддержку интерактивного отображения сферических видеороликов на 360 градусов. Панорамные видео должны быть помечены свойством поля «Проекция», содержащим значение «Равноугольный». Эти видео будут загружаться и воспроизводиться так же, как и другие видео, но они будут отображаться в CAMetalLayer вместо AVPlayerLayer.
Примечание. В настоящее время «равнопромежуточный» — единственный формат проекции, поддерживаемый для исходного видео 360°.
Пользовательский интерфейс PlayerUI также имеет встроенную поддержку Video 360, обеспечивающую жесты панорамирования по умолчанию, гироскопическое обнаружение движения для просмотра и новую кнопку Video 360, которая появляется при воспроизведении ресурса Video 360. Эта кнопка появляется только на iPhone и позволяет переключаться между обычным видом и видом «VR Goggles», где экран разделен на две части, при этом для каждого глаза отображается одна и та же сцена, чтобы устройство можно было использовать в голове. смонтированная конфигурация. На iPad кнопка Video 360 не требуется, поскольку существует только один режим работы: обнаружение движения с поддержкой жестов панорамирования.
Поддерживать Video 360 так же просто, как воспроизводить видео. При обнаружении свойства поля «проекция» Native Player SDK автоматически выполнит настройку и отображение видео в Metal, а также при необходимости установит кнопку Video 360.
Если вы воспроизводите панорамное видео за пределами Video Cloud, обязательно добавьте свойство «проекция» к объекту BCOVVideo
со значением «равнопрямоугольный».
Чтобы обеспечить максимальное удобство работы пользователя в режиме VR Goggles, вам следует использовать метод BCOVPUIPlayerViewDelegate
чтобы определить, включен ли этот режим. Это позволяет принудительно перевести устройство в альбомную ориентацию (поскольку это единственная ориентация, которая имеет смысл для просмотра в очках VR).
Следующий код показывает, как можно обрабатывать принудительное изменение ориентации при переключении между обычным обзором на 360 градусов и режимом очков VR.
// Set this to YES when displaying a VR goggles video
var landscapeOnly = false
// UIViewController override:
// Lets us control the orientation of the device
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
get {
if landscapeOnly {
return . landscape
}
return . all
}
}
// BCOVPUIPlayerViewDelegate method
func didSetVideo360NavigationMethod ( _ navigationMethod : BCOVPUIVideo360NavigationMethod ,
projectionStyle : BCOVVideo360ProjectionStyle ) {
switch projectionStyle {
case . normal :
print ( " BCOVVideo360ProjectionStyleNormal " )
landscapeOnly = false
case . vrGoggles :
print ( " BCOVPUIVideo360NavigationDeviceMotionTracking " )
landscapeOnly = true
let currentDeviceOrientation = UIDevice . current . orientation
switch currentDeviceOrientation {
case . landscapeLeft ,
. landscapeRight :
// all good
break
default :
// switch orientation
UIDevice . current . setValue ( UIInterfaceOrientation . landscapeLeft . rawValue , forKey : " orientation " )
break
}
break
default :
break
}
UIViewController . attemptRotationToDeviceOrientation ( )
}
PlayerUI установит жесты для управления навигацией по панорамному видео, но если вы используете собственные элементы управления, вы можете самостоятельно установить параметры просмотра виртуальной камеры. Свойство viewProjection
протокола BCOVPlaybackController
позволяет устанавливать эти параметры. Свойство представляет собой класс BCOVVideo360ViewProjection
с базовыми настройками виртуальной камеры, такими как pan
, tilt
и zoom
. Чтобы изменить настройки, создайте копию текущего экземпляра, измените настройки нового экземпляра, а затем снова назначьте его свойству viewProjection
.
Точкой входа в Brightcove Player SDK для iOS является одноэлементный объект BCOVPlayerSDKManager
. Этот менеджер занимается регистрацией компонентов плагина и некоторыми другими служебными задачами, но в основном он служит фабрикой объектов. Контроллер представления вашего приложения получает ссылку на Manager и использует ее для создания BCOVPlaybackController
. Свойство view
контроллера воспроизведения предоставляет UIView, содержащий объект AVPlayerLayer, который в конечном итоге представляет ваш видеоконтент на экране. Контроллер воспроизведения также принимает BCOVPlaybackControllerDelegate
, который можно реализовать для реагирования на различные события воспроизведения видео.
Контроллер воспроизведения предлагает методы и свойства, влияющие на воспроизведение текущего видео. Однако внутри контроллер воспроизведения делегирует объекту BCOVPlaybackSession
. Сеансы воспроизведения выполняют фактическую работу по подготовке и воспроизведению видеоконтента и содержат метаданные видео и AVPlayer
. Контроллер воспроизведения имеет механизмы для перехода от текущего сеанса воспроизведения к следующему сеансу воспроизведения либо автоматически в конце видео, либо вручную с помощью вызова метода. Как только контроллер воспроизведения перейдет к новому сеансу, предыдущий сеанс отменяется и не может быть использован снова.
Есть два других элемента контроллера воспроизведения: BCOVPlaybackSessionProvider
и список BCOVPlaybackSessionConsumer
. Как следует из названия, поставщик сеансов воспроизведения отвечает за создание сеансов воспроизведения и доставку их на контроллер воспроизведения. Затем контроллер воспроизведения доставляет сеанс каждому из потребителей сеанса воспроизведения в списке. API-интерфейсы как поставщика сеанса, так и API-интерфейсы потребителя сеанса предназначены для использования разработчиками плагинов и не подробно описаны в этом документе.
Помимо функций воспроизведения, предоставляемых описанными выше классами, существует несколько классов значений. Они используются для хранения данных, специфичных для Player SDK для iOS. Каждый из них описан более подробно в отдельном разделе ниже.
Пакет Brightcove Player SDK для iOS предоставляет методы воспроизведения, паузы и поиска в BCOVPlaybackController
. Важно использовать эти методы вместо эквивалента AVPlayer. В своих реализациях по умолчанию эти объекты пересылают вызовы непосредственно соответствующему методу AVPlayer. Однако если вы используете плагины, они могут переопределить поведение по умолчанию, чтобы добавить функциональность. Например, если вы используете рекламный плагин, вызов playbackController.play()
в первый раз может привести к воспроизведению преролла перед запуском контента. Чтобы узнать больше о том, как плагин может переопределить поведение по умолчанию, обратитесь к README.md каждого плагина или проверьте расширение категории на BCOVSessionProviderExtension
, которое плагин может добавить.
Вызов воспроизведения, паузы или поиска непосредственно в AVPlayer может привести к неопределенному поведению.
Чтобы установить собственную скорость воспроизведения для AVPlayer, вы можете использовать свойство playbackRate
в BCOVPlaybackController
. Важно, чтобы вы устанавливали скорость воспроизведения, используя это свойство, а не устанавливали ее непосредственно в AVPlayer.
Попытка установить для playbackRate
значение 0 или ниже приведет к установке значения 1,0. Если currentItem
AVPlayer не поддерживает canPlaySlowForward
(для значений меньше 1) или canPlayFastForward
(для значений больше 1), то будет использоваться скорость воспроизведения по умолчанию 1,0. На воспроизведение рекламы это не повлияет.
Если для playbackRate
установлено пользовательское значение, для audioTimePitchAlgorithm
для каждого AVPlayerItem
будет установлено значение AVAudioTimePitchAlgorithmTimeDomain
. Альтернативно вы можете установить собственное значение для audioTimePitchAlgorithm
следующим образом:
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didReceive lifecycleEvent : BCOVPlaybackSessionLifecycleEvent ) {
if lifecycleEvent . eventType == kBCOVPlaybackSessionLifecycleEventReady {
session . player . currentItem ? . audioTimePitchAlgorithm = . varispeed
}
}
Вы можете прочитать больше о audioTimePitchAlgorithm
здесь.
Начиная с версии 6.12.0 iOS SDK использует AVQueuePlayer, который обрабатывает предварительную загрузку следующего видео в очереди.
Однако вам может потребоваться больше контроля над предварительной загрузкой предстоящих видео в список воспроизведения. Один из возможных подходов — двойная буферизация списка видео с использованием двух контроллеров воспроизведения, например:
playbackController1.setVideos([videos.firstObject])
)playbackController:didProgressTo:
контроллера воспроизведения, определите, продвинулось ли текущее видео достаточно далеко до того места, где вы хотите начать предварительную загрузку следующего видео.В качестве рабочего примера вы можете загрузить наш пример приложения VideoPreloading из нашего репозитория Player Samples.
Примечание. Возможно, вы захотите принять во внимание объем памяти, доступной на клиентском устройстве, и скорость его соединения. Если они не подключены к Wi-Fi, предварительная загрузка видео может повлиять на сетевые ресурсы текущего видео.
Brightcove Player SDK для iOS предоставляет клиентам возможность прикреплять несколько URL-адресов и типов доставки ( BCOVSource
) к одному видео ( BCOVVideo
). Например, если ваши видео извлекаются службой воспроизведения, для одного видео может существовать сочетание версий HLS или MP4, а также версий HTTP и HTTPS. Какой из этих источников будет выбран, определяется блоком политики выбора источника. Политика выбора источника по умолчанию выберет первый HLS BCOVSource
для каждого BCOVVideo
, причем источники HTTPS предпочтительнее HTTP.
Выбор источника можно переопределить, создав BCOVBasicSessionProviderOptions
и используя его для создания BCOVBasicSessionProvider
. Например:
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let options = BCOVBasicSessionProviderOptions ( )
options . sourceSelectionPolicy = < policy >
let provider = sdkManager . createBasicSessionProvider ( withOptions : options )
let playbackController = sdkManager . createPlaybackController ( withSessionProvider : provider , viewStrategy : nil )
Если эта политика выбора по умолчанию вам не подходит, есть несколько альтернатив выбору источника:
При получении видео из Video Cloud через службу воспроизведения перед вызовом playbackController.setVideos()
используйте метод update в BCOVVideo
, чтобы он содержал только тот источник, который вам нужен (дополнительную информацию см. в разделе «Значения»).
Вы можете использовать вспомогательный метод [BCOVBasicSourceSelectionPolicy sourceSelectionHLSWithScheme:scheme]
для создания политики, отдающей предпочтение определенной схеме. Этот метод используется для создания политики выбора источника по умолчанию, отдающей предпочтение HTTPS.
Подобно обновлению видеообъекта, вы также можете реализовать свой собственный блок выбора источника.
options . sourceSelectionPolicy = { ( video : BCOVVideo ? ) -> BCOVSource ? in
< Check video . sources for source >
< Return source >
}
Помните, что существуют ограничения App Store на использование видео в формате MP4. Подробности можно найти в последней информации для разработчиков Apple.
Brightcove Player SDK для iOS позволяет установить предпочтительный битрейт для видео. Вы можете создать объект BCOVPreferredBitrateConfig, который содержит желаемые параметры битрейта, а также некоторую конфигурацию для контроллера представления, созданного для отображения этих параметров.
Название меню не является обязательным. Параметры битрейта представляют собой массив NSDictionary, в котором каждый словарь имеет одну пару ключ:значение. Ключ будет использоваться в качестве имени параметра, а значением является 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 )
Когда конечный пользователь выбирает один из параметров, свойствуeferredPeakBitRate текущего AVPlayerItem будет установлено значение этого параметра. Если видео находится в списке воспроизведения, для следующего воспроизводимого видео также будет установлено значение привилегированного PeakBitRate.
После установки ненулевого значения для PreferredPeakBitRate вы можете не заметить разницы в качестве до тех пор, пока AVPlayer не достигнет конца своего текущего буферизованного кэша.
Вы также можете использовать инициализатор configWithMenuTitle:bitrateOptions:andIndexofInitialSelection:
который предоставляет возможность установить индекс предпочитаемого вами начального значения. Индекс должен соответствовать индексу нужной опции в массиве bitrateOptions
.
Вы также можете использовать метод setPreferredPeakBitRate:
для вашего объекта BCOVPlaybackController
, чтобы программно установить предпочтительный битрейт для текущего и будущих сеансов.
ПРИМЕЧАНИЕ. Конечным пользователям должна быть предоставлена возможность вернуться к значению по умолчанию (0) предпочтительного пикбитрейта. Вы можете сделать это, предоставив параметр со значением битрейта 0. Если вы не предоставите параметр битрейта 0, к вашему списку параметров для конечного пользователя будет добавлен параметр «Автоматически».
Дополнительную информацию см. в документации Apple по предпочтительному PeakBitRate.
Brightcove Player SDK для iOS предоставляет два механизма получения информации о воспроизведении. Контроллер воспроизведения предоставляет свойство делегата, которое реализует BCOVPlaybackControllerDelegate
. Делегат может реализовать эти дополнительные методы, чтобы получать уведомления о метаданных воспроизведения, таких как ход выполнения, изменения продолжительности и другие события. Если установлен рекламный плагин, он также может использовать этот делегат для предоставления информации о воспроизведении рекламы. Метод делегата событий жизненного цикла предоставляет события, сигнализирующие об изменениях в состоянии воспроизведения. Например, когда игрок переходит из состояния паузы в состояние воспроизведения, метод делегата события жизненного цикла будет вызываться с событием kBCOVPlaybackSessionLifecycleEventPlay
. События жизненного цикла по умолчанию объявляются в BCOVPlaybackSession
. Плагины, предоставляемые Brightcove, добавляют дополнительные события жизненного цикла, которые определены в каждом плагине.
Контроллер воспроизведения позволяет использовать одного делегата. Во многих случаях этого будет достаточно для получения информации; реализации делегата могут при необходимости распространять значения и события в различные части приложения. В тех случаях, когда потребуются несколько делегатов, как и в случае разработки плагина, делегаты BCOVPlaybackSessionConsumer
предоставляют эквивалентную функциональность для методов BCOVPlaybackControllerDelegate
, включая данные AD.
Вот пример того, как можно использовать BCOVPlaybackSessionConsumer
для создания плагина Analytics:
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 )
Когда приложение испытывает перерывы в сети, AVPlayer
, используемый BCOVPlaybackController
может перестать пытаться восстановиться, если прерывание длится слишком долго. Если это произойдет, метод делегата жизненного цикла будет вызван с помощью события kBCOVPlaybackSessionLifecycleEventFailedToPlayToEndTime
. Когда это событие произойдет, воспроизведение не восстановится автоматически. Чтобы восстановить это событие, вам нужно будет обнаружить, когда сеть восстановится в вашем клиентском коде.
После того, как вы определили, что сеть восстановилась, вы можете использовать playbackController.resumeVideo(at:withAutoPlay:)
для повторного инициализации игрока. Вам нужно будет отслеживать, куда вы хотите возобновить. Игрок приложит все усилия, чтобы подавить события жизненного цикла и события прогресса, чтобы предотвратить воспроизведение рекламы или вмешиваться аналитикой.
После вызова playbackController.resumeVideo(at:withAutoPlay:)
, игрок отправит событие в течение жизненного цикла типа kBCOVPlaybackSessionLifecycleEventResumeBegin
. kBCOVPlaybackSessionLifecycleEventResumeComplete
будет отправлено, если это действие будет успешным, в противном случае будет kBCOVPlaybackSessionLifecycleEventResumeFail
.
Вы должны подождать, прежде чем вызовать playbackController.resumeVideo(at:withAutoPlay:)
во второй раз, пока вы не получите либо kBCOVPlaybackSessionLifecycleEventResumeComplete
, либо kBCOVPlaybackSessionLifecycleEventResumeFail
из предыдущего вызова. Возможно, вы захотите навязать предел повторения, прежде чем дать пользователю сообщение о том, что их сеть слишком нестабильна.
Когда AVPlayer
по -прежнему может получить доступ к сети, но видео заталкивает, потому что сеть слишком медленная, метод делегата LifeCycle будет вызван с помощью события kBCOVPlaybackSessionLifecycleEventPlaybackStalled
. Когда воспроизведение может возобновить, метод делегата жизненного цикла будет вызван с помощью kBCOVPlaybackSessionLifecycleEventPlaybackRecovered
Event. Эти события охватывают только случай, когда нормальное воспроизведение остановилось и не охватывает буферизацию, которая происходит во время поиска или начальной нагрузки видео.
Когда видео изначально загружается, когда происходит поиск, или когда воспроизведение киосков из -за медленной сети, метод делегата жизненного цикла будет вызван с помощью события kBCOVPlaybackSessionLifecycleEventPlaybackBufferEmpty
. Когда воспроизведение может возобновить, метод делегата жизненного цикла будет вызван с помощью события kBCOVPlaybackSessionLifecycleEventPlaybackLikelyToKeepUp
.
За исключением случаев, когда явно задокументирован иначе, ни один из классов в SDK Player для iOS не предназначен для подкласса. Создание подкласса любого класса SDK, который явно не предназначен для подклассов, особенно любого из класса стоимости, может привести к непредсказуемому поведению.
Эти классы ( BCOVPlaylist
, BCOVVideo
, BCOVSource
, BCOVCuePoint
, BCOVCuePointCollection
) используются как для представления данных в SDK для iOS. Крайне важно понимать, что эти типы данных рассматриваются как значения , а не как идентичности . Под этим мы подразумеваем, что если у вас есть два экземпляра класса значений, которые имеют одинаковые данные, они представляют одну и ту же идею или значение, даже если они технически являются двумя разными объектами по отдельным адресам памяти. Другими словами, ни код SDK, ни ваш клиентский код не должны использовать сравнения идентификаций («равенство указателя») с объектами значения. Вместо этого, каждый класс значений реализует -isEqual:
и обеспечивает перегрузку метода равенства, специфичного для класса, которая должна использоваться вместо этого.
Это плохо:
if myVideo == session . video // Could lead to bugs!
Это хорошие (и функционально эквивалентные):
if myVideo . isEqual ( session . video )
if myVideo . isEqual ( toVideo : session . video )
Внутренние игроки SDK для iOS могут делать такие вещи, как запоминание ценностей или делать защитные копии, поэтому полагаться на адрес указателя, чтобы проверить равенство, в конечном итоге причинят вам боль.
Еще одно качество стоимости классов в SDK Player SDK для iOS - это то, что они неизменны . После того, как у вас есть экземпляр значения, вы не должны пытаться каким -либо образом подорвать эту неизменность, поскольку это может привести к непредсказуемому поведению. Если в вашем коде вы хотите «изменить» ценность каким -то образом, ваш единственный режим - создать новое значение. В качестве удобства, чтобы помочь клиентам получить «модифицированные» значения, каждый из классов значений предлагает метод -update:
Block, который позволяет вам работать на изменяемой копии исходного значения.
Вот пример использования этого метода для создания «модифицированной» версии существующего видео объекта, но с разными свойствами:
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 и плейлистов через API воспроизведения BrightCove, включая богатые метаданные, такие как текстовые треки, превью и миниатюры. В следующем примере показано, как получить видео с помощью видео идентификатора. Методы для поиска видео или плейлиста с помощью справочного идентификатора этого видео также доступны.
[ 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 видео, вы можете запросить только 6 видео, начинающихся на видео № 10 следующим образом:
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 определять точный объект UiView, который возвращается из свойства представления контроллера. Это важно при использовании плагинов, которые влияют на представление контроллера воспроизведения, например, рекламный плагин, который накладывает видео с рекламным представлением. Многим приложениям не будет необходимости создавать стратегию представления, и они могут просто передать nil
при создании нового контроллера воспроизведения. Это создаст стандартный видео -представление в контроллере воспроизведения.
BCOVPlaybackControllerViewStrategy
Typedef псевдонимов (и документов) Эта более сложная подпись блока:
UIView *(^)(UIView *videoView, id playbackController);
Эта подпись описывает блок Objective-C, который возвращает UiView и принимает два параметра: Uiview и контроллер воспроизведения. Возвращаемое значение - это объект Uiview, на который будет указывать свойство представления Playback Controller. Первый параметр - это uiview, который содержит слой видео, uiview покажет видео. Второй параметр - это объект контроллера воспроизведения, которому была дана стратегия представления, контроллер воспроизведения может использоваться для добавления необходимых потребителей сеанса, таких как управление видео или элементы управления рекламой.
Пример реализации стратегии представления:
let viewStrategy = { ( videoView : UIView ? , playbackController : BCOVPlaybackController ? ) in
guard let videoView ,
let playbackController else {
return UIView ( )
}
// Create some custom controls for the video view,
// and compose both into a container view.
[ 1 ] let myControlsView = MyControlsView ( ) // Conforms to BCOVPlaybackSessionConsumer
[ 2 ] let controlsAndVideoView = UIView ( )
[ 3 ] controlsAndVideoView . addSubview ( videoView )
controlsAndVideoView . addSubview ( myControlsView )
// Compose the container with an advertising view
// into another container view.
[ 4 ] let adView = SomeAdPluginView ( ) // Conforms to BCOVPlaybackSessionConsumer
[ 5 ] let adAndVideoView = UIView ( )
[ 6 ] adAndVideoView . addSubview ( controlsAndVideoView )
adAndVideoView . addSubview ( adView )
[ 7 ] playbackController . add ( myControlsView )
playbackController . add ( adView )
// This container view will become `playbackController.view`.
return adAndVideoView
}
Разрушение кода на шаги: [1] Создайте пользовательское представление управления, которое соответствует протоколу BCOVPlaybackSessionConsumer
. Протокол BCOVPlaybackSessionConsumer
позволяет получать базовую информацию о воспроизведении для каждого видео в дополнение к рекламе. [2] Создайте представление о контейнере для просмотра видео и пользовательских элементов управления. [3] Добавьте в качестве подвиги видео -контейнер и пользовательские элементы управления. Иерархия составлена в том же порядке, что и виды добавляются. [4] Создайте представление управления AD, которое соответствует протоколу BCOVPlaybackSessionConsumer
. [5] Создайте представление контейнера для представления и элемента управления видео, а также рекламное представление. [6] Добавьте в качестве подвиги. Видео -контейнер и представление управления объявлением. [7] Зарегистрируйте представление пользовательского элемента управления и представление AD Controls в качестве потребителей сеанса, используя объект Controller, возвращаемый блоком.
Существует одна предостережение для использования стратегии представления: вы не должны получать доступ к свойству view
контроллера воспроизведения из блока стратегии представления. Поскольку блок называется, потому что свойство view
Controller для воспроизведения было доступно в первый раз, доступ к свойству view
снова в блоке стратегии просмотра приведет к сбою вашей программы.
По умолчанию, когда на фоновой режим отправляется приложение для iOS, или устройство заблокировано, iOS сделает паузу любого видео, которое воспроизводит. Чтобы изменить это поведение, установите свойство allowsBackgroundAudioPlayback
объекта BCOVPlaybackController
на true
. (Значение по умолчанию false
, указывая на воспроизведение в фоновом режиме.)
Вы также должны следовать рекомендациям, установленным Apple в технических вопросах и ответах QA1668, чтобы установить правильные фоновые режимы и категорию аудиосессии для вашего приложения.
Важно, чтобы AVPlayerLayer
был отделен от AVPlayer
до того, как приложение будет переключено на фон (и переживает, когда приложение возвращается на передний план). BrightCove Player SDK справится с этим для вас, когда allowsBackgroundAudioPlayback
установлен на true
.
Наконец, при воспроизведении фоновых видео (и особенно при использовании плейлистов) вы должны использовать API iOS MPRemoteCommandCenter
, чтобы дать пользователю управление воспроизведением на экране блокировки и в центре управления.
Чтобы включить картинку в вашем приложении, установите объект showPictureInPictureButton
BCOVPUIPlayerViewOptions
для true
при создании вашего объекта BCOVPUIPlayerView
. Кнопка изображения в картине будет отображаться в панели управления на любом устройстве, которое его поддерживает.
Для того, чтобы изобразить в картинке правильно работать, вам нужно будет убедиться, что Audio, AirPlay, and Picture in Picture
повернут в разделе Background Modes
на вкладке Target возможностей вашего проекта. Вы также должны следовать рекомендациям, установленным Apple в технических вопросах и ответах QA1668, чтобы установить правильные фоновые режимы и категорию аудиосессии для вашего приложения.
Методы AVPictureInPictureControllerDelegate
передаются через BCOVPUIPlayerViewDelegate
. Эти методы:
func pictureInPictureControllerDidStartPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func pictureInPictureControllerDidStopPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func pictureInPictureControllerWillStartPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func pictureInPictureControllerWillStopPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func picture ( _ pictureInPictureController : AVPictureInPictureController , failedToStartPictureInPictureWithError error : Error )
func picture ( _ pictureInPictureController : AVPictureInPictureController , restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler : ( Bool ) -> Void )
См. Документацию Apple AvpictureInpictureControllerDelegate для получения дополнительной информации.
Чтобы реализовать свое собственное поведение с изображением в картине, оставьте свойство allowsBackgroundAudioPlayback
от BCOVPlaybackController
, установленное в false
, и сохраните pictureInPictureActive
BCOVPlaybackController
обновленная с статусом картинки в картине. Если вы используете AVPictureInPictureController
, вы можете использовать pictureInPictureControllerDidStartPicture(inPicture:)
и pictureInPictureControllerDidStopPicture(inPicture:)
Методы делегирования, чтобы обновить это свойство.
Вы можете прочитать больше о Implemeneting Picture-in-картине в Apple, внедряющем картинку в рисунке в пользовательской документации по игроку.
Использование плейлиста видео со смешанными форматами с изображением в картинке приведет к закрытию окна изображения в картинке между каждым видео.
iOS и iPados 14 представили автоматическое поведение изображения в картине, которое можно включить/выключить в Settings > General > Picture in Picture
. Для того, чтобы эта функция работала, как и ожидалось, представление игрока должно быть равным ширине экрана, а высота должна иметь соотношение не менее 0,57 к ширине (16: 9 или более). Если ширина или высота представления вашего игрока меньше, чем эти значения изображение в картине не может быть автоматически запустить, когда приложение входит на фон.
ВАЖНО: Плагины IMA, Freewheel, Pulse и SSAI по-разному обрабатывают функциональность изображения в картине. Просмотрите раздел картины в картине в каждом плагине Readme для получения дополнительной информации.
В поисках миниатюры позволяет пользователям перетаскивать гонку вдоль временной шкалы и рассматривать миниатюры в качестве предварительного просмотра связанного контента. Это дает пользователям возможность быстро перемещаться по видеофайлу и найти контент, который им интересует.
Эта функция также называется Apple как трюк, и на их спецификации HLS ссылается.
Эта функция включена по умолчанию. Если вы хотите отключить миниатюр, чтобы сделать это, вы можете сделать это, установив свойство thumbnailSeekingEnabled
на вашем BCOVPlaybackController
для 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
вы можете установить URL для использования для источника миниатюры 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 " )
} )
}
В поисках миниатюры доступна только для онлайн -видео; Скачанные/автономные видео не поддерживают эту функцию.
Вы можете вставить дополнительный Bcovvideo после еще одного Bcovvideo, уже в очереди, в ваш BCOVPlaybackController
, вызывая insertVideo:afterVideoAtIndex:
.
Например:
// This will insert the new video after the first video in the queue
playbackController . insert ( videoToInsert , afterVideoAt : 0 )
Есть два метода делегата, которые вы можете использовать, чтобы быть предупрежденными об успехе или неудаче запроса.
func playbackController(_ controller: BCOVPlaybackController, didInsert video: BCOVVideo, at index: UInt)
func playbackController(_ controller: BCOVPlaybackController, failedToInsert video: BCOVVideo)
Generic Stream Condurence (GSC) - это услуга, которая определяет, разрешено ли воспроизведение на основе активных сеансов воспроизведения для зрителя и предустановленного ограничения параллелизма. Сервис запрашивается через службу авторизации Edge Playback (EPA). Тот же JWT, используемый для извлечения видео, используется здесь, и должен включать заявление uid
, претензию climit
и, опционально, претензии sid
. Эта функция должна быть включена в вашем Acccount.
Общий параллелизм потока не включен в SDK по умолчанию. Если вы хотите включить его, установите свойство streamConcurrencyEnabled
вашего BCOVPlaybackController
на true
.
playbackController . streamConcurrencyEnabled = true
Значение sid
может быть включено в JWT или отправлено в качестве опции BCOVPlaybackController
, оба из которых являются необязательными. Значение sid
в JWT имеет приоритет над опцией BCOVPlaybackController
.
playbackController . options [ kBCOVAuthHeartbeatPropertyKeySessionId ] = " sessionId "
Новый метод делегата был добавлен в BCOVPlaybackControllerDelegate
для извлечения активных сеансов, когда был достигнут предел параллелизма.
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didReachMaxConcurrency sessions : [ AnyHashable : Any ] ) {
print ( " ( sessions ) " )
}
Ошибки воспроизведения обычно обрабатываются и сообщаются через события воспроизведения видео от контроллера воспроизведения. Если вам нужно копать глубже и отслеживать проблемы с определенными видео или приложениями, вы можете воспользоваться идентификатором сеанса SDK Player BrightCove. Идентификатор сессии является свойством BCOVPlayerSDKManager
, которое вы можете получить так:
let sdkSessionID = BCOVPlayerSDKManager . sharedManager ( ) . sessionID
Идентификатор сеанса - это уникальная строка, которая не меняется в течение жизненного цикла приложения. Эта строка сообщается с различными другими аналитическими данными на серверах метрик BrightCove. Если у вас есть проблемы с конкретным экземпляром приложения или видео, вы можете записать идентификатор сеанса и отправить его обратно на свои собственные серверы компании. Затем вы можете отправить идентификатор сеанса, идентификатор видео и любые другие соответствующие данные инженерам Service Service BrightCove, чтобы помочь диагностировать любые проблемы.
Если вам нужно объединить плагины SDK Player, например, для добавления субтитров к видео BCOVPlaybackController
защищенному DRM, которое воспроизводит рекламу, управляемую Google IMA, создаются и приковывают BCOVSessionProviders
из каждого плагина.
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
. Это делается путем установки объекта preferredForwardBufferDuration
в классе AVPlayerItem
.
По умолчанию SDK Native BrightCove SDK устанавливает свойство preferredForwardBufferDuration
таким образом, чтобы оптимизировать общую пропускную способность без жертвоприношения качества воспроизведения. Такое поведение может быть переопределено с вашими собственными ценностями.
Каждый платит за пропускную способность, поэтому важно сократить потребление полосы пропускания, не влияя на качество воспроизведения. Новое с версией 5.2.0, Native Player Sdk BrightCove SDK управляет размер буфера для вас динамически, когда видео играет.
До iOS 10 AVPlayer
буферировал как можно больше видеодантеров, до 50 мегабайт. Это хорошо для модели просмотра видео, где пользователь выбирает видео, а затем смотрит его до конца, но многие современные приложения теперь «дразнят» с автозапрограммой, надеясь обеспечить взаимодействие через несколько секунд. Многие пользователи просто переходят на разные видео. С агрессивной буферией вы можете получить несколько минут буферизованного видео, которое выброшены с каждым видео впечатлением.
SDK BrightCove Contive решает эту проблему, запустив видео с небольшим базовым буфером, а затем увеличивая его, когда пользователь смотрит больше видео. После определенного момента размер буфера ограничен, так как это не практично или полезно сделать его слишком большим.
Если вы хотите сохранить поведение по умолчанию SDK Native Player BrightCove SDK, но измените минимальные и максимальные значения, используемые для размеров буфера, вы можете сделать следующее при настройке BCOVPlaybackController
:
// Create mutable dictionary to hold new values
if var options = playbackController . options {
// Set new values in dictionary
options [ kBCOVBufferOptimizerMethodKey ] = BCOVBufferOptimizerMethod . default . rawValue
options [ kBCOVBufferOptimizerMinimumDurationKey ] = minValue
options [ kBCOVBufferOptimizerMaximumDurationKey ] = maxValue
// Set new dictionary in your playback controller
playbackController . options = options
}
Эти параметры должны быть установлены перед вызовом playbackController.setVideos()
.
min
и max
значения:
AVPlayer
может буферировать данные, которые никогда не просматриваются.AVPlayerItem
, которое говорит AVPlayer
определить свой собственный размер буфера.Если вы не хотите, чтобы оптимизация буфера была активна в вашем текущем сеансе воспроизведения, вы можете использовать ту же метод, но установить метод оптимирования на «нет» следующим образом:
// Create mutable dictionary to hold new values
if var options = playbackController . options {
// Set new values in dictionary
options [ kBCOVBufferOptimizerMethodKey ] = BCOVBufferOptimizerMethod . none
// Set new dictionary in your playback controller
playbackController . options = options
}
С помощью метода, установленного .none
, iOS будет поддерживать полный контроль над размер прямой буферы.
Если вы хотите установить свой собственный размер буфера для воспроизведения, сначала выключите оптимизацию буфера, как описано в предыдущем разделе. Затем вы можете реализовать следующий метод делегата BCOVPlaybackController
:
func playbackController ( _ controller : BCOVPlaybackController , didAdvanceTo session : BCOVPlaybackSession ) {
if let currentItem = session . player . currentItem {
// Set your preferredForwardBufferDuration value here.
currentItem . preferredForwardBufferDuration = newPreferredForwardBufferDurationValue
}
}
Если вы хотите с течением времени динамически изменить размер буфера, вы можете установить 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 специально поместила «Preferred» в preferredForwardBufferDuration
, потому что вы можете установить любую ценность, которую вы хотите, но, как правило, игрок AVPlayer
будет использовать его только в качестве руководства. Также имейте в виду, что установление его до нуля возвращает полное управление размером буфера в AVPlayer
.
Вы можете использовать AvPlayerviewController вместо AvPlayerLayer, используемого классом BCOVPlaybackSession. Использование AvPlayerviewController позволяет игроку использовать нативные элементы управления iOS и игрока TVOS, но есть ограничения для этого подхода (см. Ниже).
Чтобы использовать AvPlayerviewController, вы можете установить свойство словаря BcovPlaybackController под названием 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
}
Значение по умолчанию KbcovavPlayerViewControllerCompatibility - это false
, что означает, что BcovPlaybackController, созданный без этого свойства словаря.
Плагины BrightCove IMA, Freewheel, Pulse и SSAI AD совместимы при использовании AvPlayerviewController. Вы можете использовать contentOverlayView
AvPlayerViewController для представления для отображения рекламы (не применимо к 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
}
При использовании AvPlayerviewController с плагином BrightCove IMA и рекламой с кнопкой «Узнайте больше», вам нужно будет создать дополнительный UiView для использования в качестве представления контейнера. Это связано с тем, что contentOverlayView
от AvPlayerViewController не является интерактивным, поэтому попытка нажать кнопку «Учить больше» не будет иметь никакого эффекта. Вы можете использовать playbackController:playbackSession:didEnterAdSequence:
и playbackController:playbackSession:didExitAdSequence:
Делегируйте методы, чтобы показать и скрыть представление вашего рекламного контейнера.
При использовании IMA, Freewheel, Pulse или SSAI -плагинов на TVOS будет создан массив AVInterstitialTimeRange
для каждой точки объявления и установлена на interstitialTimeRanges
соответствующего AVPlayerItem
. Для плагинов IMA, Freewheel и Pulse вы захотите создать жест воспроизведения/паузы, чтобы при активном рекламе вы могли правильно сделать паузу и возобновить объявление и не повлиять на воспроизведение самого видео. Вот пример:
func setUpAdPlayPauseGesture ( ) {
let playPauseGesture = UITapGestureRecognizer ( target : self , action : #selector ( playPauseAd ( _ : ) ) )
playPauseGesture . allowedPressTypes = [ NSNumber ( value : UIPress . PressType . playPause . rawValue ) ]
avpvc . view . addGestureRecognizer ( playPauseGesture )
self . playPauseGesture = playPauseGesture
}
@ objc
func playPauseAd ( _ gesture : UITapGestureRecognizer ) {
if insideAdSequence {
if adPlaying {
playbackController ? . resumeAd ( )
adPlaying = false
} else {
playbackController ? . pauseAd ( )
adPlaying = true
}
} else {
if avpvc . player ? . rate == 0 {
playbackController ? . play ( )
} else {
playbackController ? . pause ( )
}
}
}
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didEnterAdSequence adSequence : BCOVAdSequence ) {
insideAdSequence = true
}
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didExitAdSequence adSequence : BCOVAdSequence ) {
insideAdSequence = false
}
Для отображения рекламного наложения, например, обратного отсчета, см. В разделе поддержки AvPlayerviewCeerTroller плагина рекламного плагина, который вы используете для некоторого руководства.
Обратите внимание, что совместимость SSAI AVPlayerViewController
специфична для TVOS из -за наличия AVInterstitialTimeRange
. Вы все равно сможете воспроизводить iOS, однако продолжительность видео будет включать продолжительность всех рекламных объявлений.
У нас есть образцы проектов, демонстрирующих использование AvPlayerviewController с SDK BrightCove IOS. Вы можете найти образец iOS Project здесь и образец TVOS Project здесь.
При использовании AvPlayerviewController события Video_Engagement, отправленные на сервер BrightCove Analytics, сообщают 0 для Player_width и Player_height.
Если вы используете службу авторизации воспроизведения, вам необходимо использовать сервис воспроизведения BCOVPlaybackService.ConfigurationKeyAuthToken
Configuration.
// 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
...
}
ПРИМЕЧАНИЕ. В случае плейлистов все видео в списке воспроизведения должны использовать одинаковый токен. В последующем выпуске будет возможно назначение другого токена каждому видео в списке воспроизведения. Вы будете нести ответственность за поддержание картирования между видео идентификатором и токеном.
Voiceover поддерживается без ящика для управления воспроизведением. По умолчанию, если голосование включено, представление управления BCOVPlayerui не будет автоматическим. Использование жеста активации с двойным нажатием в представлении контроллера воспроизведения переключит видимость управляющего представления. Существует связанная accessibilityHint
, которая установлена на представление контроллера воспроизведения. accessibilityLabel
каждого управления BCOVPlayerUI может быть настроена в вашем приложении.
Чтобы изменить 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
к нынешней меток времени и продолжительности, а также слайдер Progress, например:
playerView . controlsView . durationLabel . accessibilityLabelPrefix = " Total Time "
playerView . controlsView . currentTimeLabel . accessibilityLabelPrefix = " Current Time "
playerView . controlsView . progressSlider . accessibilityLabel = " Timeline "
Вы можете предоставить дополнительные языковые локализации, которые SDK BrightCove не поддерживает.
+
под разделом «Localizations». Чтобы определить прокси -домен для услуг воспроизведения, серверов метрик и аналитики в Китае, установите свойство chinaProxyDomain
в синглтоне BCOVGlobalConfiguration
на полностью квалифицированное доменное имя. Например:
BCOVGlobalConfiguration . sharedConfig . chinaProxyDomain = " host.mydomain.com "
Обязательно установите доменное имя Proxy, прежде чем использовать любые другие службы нативного игрока SDK. Для получения подробной информации обратитесь к ссылке на класс BCOVGlobalConfiguration .
В зависимости от того, как вам нужно выполнять ваше приложение, когда дело доходит до воспроизведения аудио, вы можете настроить Avaudiosession в соответствии с вашими конкретными потребностями. Например, если вы хотите поддержать AirPlay 2 и несколько аудио -маршрутов, см. В разделе AirPlay этого ReadMe.
Основная аваудиоция может быть настроена так:
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
}
Эта конфигурация обычно можно выполнять в application:didFinishLaunchingWithOptions:
Метод. Могут быть ситуации, когда вам нужна более сложная конфигурация Avaudiosession, например, если вы хотите, чтобы звук из других приложений был услышан, когда звук в вашем приложении приглушен. В этой ситуации вы можете настроить Avaudiosession в контроллере представления, который имеет доступ к вашему текущему AvPlayer. Например:
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 здесь.
SDK BrightCove Player поддерживает только аудио-потоки и включает в себя несколько функций только для аудио. Если вы настроили изображение постера для вашего видео, то изображение будет отображаться в contentOverlayView
вашего BCOVPUIPlayerView
. Вы можете настроить UIViewContentMode
представления с изображением плаката, используя свойство contentModeForPosterImage
на BCOVPUIPlayerViewOptions
, значение по умолчанию - UIViewContentModeScaleAspectFit
.
Вы также можете постоянно держать контроль игрока в любое время, в этом случае вы можете включить keepControlsVisible
на BCOVPUIPlayerViewOptions
.
Если вы не хотите отображать изображение плаката или просто хотите более компактный вид воспроизведения, вы можете установить высоту вашего мнения BCOVPUIPlayerView
стандартная планировка.
Существует три предварительно сконфигурированные только BCOVPUIBasicControlView
макеты, которые вы можете использовать, если вы не используете automaticControlTypeSelection
:
basicControlViewWithAODLayout
basicControlViewWithLiveAudioLayout
basicControlViewWithLiveDVRAudioLayout
Вы также можете быть уведомлены, если поток является только для аудио или видео+аудио с playbackController:playbackSession:determinedMediaType
Method:
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
}
}
Наш видеоконтрадбазический игрок поддерживает отображение информации о медиа на экране блокировки, центра управления и AirPlay. Смотрите класс NowPlayingHandler
для деталей реализации.
Видео -бампер - это короткий актив, обычно 10 секунд или меньше, который играет перед всеми другими медиа и обычно показывает бренд или компанию, которую представляет ваше видео. Игрок запросит бампер из API воспроизведения, как любое другое видео, и вставит его перед рекламой и контентом.
Бамперы являются функцией на уровне игрока, то есть данный игрок может быть связан только с одним бампером. Плейлисты делятся одним и тем же видео. Есть два способа настроить игрока для воспроизведения видео на бампере:
bumperID
. Идентификатор видео, чтобы найти. // 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
должен быть действительным видеоидентификатором.
ПРИМЕЧАНИЕ. BummerID проходит через пользовательские поля (поле bumper_id
) приоритет над любым идентификатором в службе воспроизведения.
Управление воспроизведения может быть скрыто, пока играет бампер.
let options = BCOVPUIPlayerViewOptions ( )
options . automaticControlTypeSelection = true
options . showBumperControls = false
let playerView = BCOVPUIPlayerView ( playbackController : nil , options : options , controlsView : nil )
Если параметр automaticControlTypeSelection
установлен на true
, макет для бампера будет адаптироваться к контенту (только видео или только аудио). basicControlViewWithVODLayout
и basicControlViewWithAODLayout
, разработанные для бамперов, Live
или LiveDVR
макеты недоступны. Элементы управления воспроизведением имеют уникальный вид, когда активный бампер:
Поддержка интерактивности интегрирована в Core BrightCovePlayersDK Framework. Для получения полной информации об использовании интерактивности с SDK Native Player BrightCove см. В Руководстве по интерактивности.
Если контент упакован как MP4, вы можете вставить URL -адрес непосредственно в большинство веб -браузеров, и видео должно воспроизводиться (или загружать в вашу файловую систему, где вы можете воспроизводить его локально). Если содержимое упаковано как HLS, вы можете использовать QuickTime Player для его тестирования: выберите File -> Open Location…
и вставить в URL -адрес плейлиста .m3u8
, и видео должно воспроизводиться.
Это распространенный симптом, который называется основным методом uikit или Avfoundation из нитью только для нити из нити, не относящейся к мэлю. Методы делегата на BCOVPlaybackControllerDelegate
всегда вызываются в основной потоке.
Это сообщение указывает, что политика выбора источника по умолчанию не может определить, какой источник выбрать. Политика по умолчанию выбирает первый источник, deliveryMethod
, kBCOVSourceDeliveryHLS
(«HLS»). Если источник HLS не найден, его поведение резервного отслеживания выберет первый источник, deliveryMethod
которого - kBCOVSourceDeliveryMP4
(«MP4»). Если в видео нет источника с deliveryMethod
«HLS» или «MP4», политика выберет первый источник видео (независимо от deliveryMethod
). Если вы не довольны его выбором, вы можете использовать -[BCOVPlayerSDKManager createBasicSessionProviderWithOptions:]
и пройти в экземпляре BCOVBasicSessionProviderOptions
с набором собственности на нестандартную sourceSelectionPolicy
. При создании видео и источников вручную убедитесь, что источники создаются с помощью соответствующего deliveryMethod
.
API, который контролирует, издает ли приложение Audio в приложениях для iOS, является API Avaudiosession. Аудиосессия является глобальной для приложения, что означает, что его конфигурация влияет как на звуки, излучаемые AvPlayers, созданными игроком SDK, так и другими звуками, которые может издать приложение. 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.