Brightcove fornece suporte ativo para o iOS SDK mais recente no lançamento público mais recente das seguintes versões do iOS:
Brightcove fornece suporte passivo para as seguintes versões do iOS:
O Core SDK está localizado para árabe (ar), inglês (en), francês (fr), alemão (de), japonês (ja), coreano (ko), espanhol (es), chinês simplificado (zh-Hans) e tradicional Chinês (zh-Hant). Para obter o benefício de uma localização, seu aplicativo também deve ser localizado para o mesmo idioma e localidade. Consulte a seção Localização personalizada para obter informações adicionais.
Todos os componentes do SDK – as estruturas principais e de plug-in – são lançados com o mesmo número de versão. Ao atualizar qualquer componente único, atualize todos os componentes para a mesma versão.
Para projetos que usam Xcode 12 em Apple Silicon M1 e Universal Frameworks (.framework), um erro de construção é retornado ao construir o projeto para o simulador arm64.
*ld: building for iOS Simulator, but linking in dylib built for iOS, file for architecture arm64*
Para compilar para um simulador arm64, certifique-se de que arm64
tenha sido adicionado à configuração de compilação "Arquiteturas excluídas" para Any iOS Simulator SDK
na guia "Configurações de compilação" do destino do seu aplicativo.
A versão 6.10.0 do Brightcove Player SDK adiciona subespecificações para o núcleo e cada plug-in para oferecer suporte ao XCFrameworks. O valor padrão para cada subespecificação é /XCFramework
.
Nome do podspec | Nomes de subespecificações |
---|---|
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/Estrutura 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/Estrutura Brightcove-Player-Pulse/XCFramework |
Brightcove-Player-SSAI | Brightcove-Player-SSAI/Framework Brightcove-Player-SSAI/XCFramework |
Brightcove-Player-OpenMeasurement | - |
A versão 6.12.0 do Brightcove Player SDK atualiza os podspecs Brightcove-Player-FreeWheel
e Brightcove-Player-Omniture
para instalar a versão dinâmica do BrightcovePlayerSDK
.
Nome do podspec | Tipo de estrutura | Dependência |
---|---|---|
Brightcove-Player-Core | dinâmico | - |
Brightcove-Player-DAI (disponível desde 6.12.7) | dinâmico | Brightcove-Player-Core |
Brightcove-Player-FreeWheel | dinâmico | Brightcove-Player-Core para iOS, Brightcove-Player-Core para tvOS |
Brightcove-Player-GoogleCast | estático | Brightcove-Player-Core |
Brightcove-Player-IMA | dinâmico | Brightcove-Player-Core |
Brightcove-Player-Omniture | dinâmico | Brightcove-Player-Core |
Brightcove-Player-Pulse | dinâmico | Brightcove-Player-Core |
Brightcove-Player-SSAI | dinâmico | Brightcove-Player-Core, Brightcove-Player-OpenMeasurement (apenas para medição aberta) |
Brightcove-Player-OpenMeasurement (disponível desde 6.10.0) | dinâmico | - |
O suporte para vídeos protegidos pelo FairPlay está integrado à estrutura principal do BrightcovePlayerSDK . Consulte o guia FairPlay para obter detalhes completos sobre como usar o FairPlay com o Brightcove Native Player SDK.
O suporte para legendas Sidecar está integrado à estrutura principal do BrightcovePlayerSDK . Para obter detalhes completos sobre o uso de legendas Sidecar com o Brightcove Native Player SDK, consulte o guia Sidecar Subtitles.
Desde a versão 6.0.0, o Brightcove Native Player SDK permite baixar vídeos HLS, incluindo aqueles protegidos com criptografia FairPlay, para reprodução posterior, seja online ou offline. Consulte o guia do desenvolvedor do aplicativo para obter detalhes completos:
Guia do desenvolvedor de aplicativos iOS para download de vídeos e reprodução off-line com FairPlay
O Brightcove Player SDK fornece pacotes de instalação para iOS e tvOS como bibliotecas dinâmicas empacotadas como Frameworks e XCFrameworks. A implantação é compatível com iOS 12.0 e superior.
Você pode usar CocoaPods para adicionar o Brightcove Player SDK ao seu projeto. Você pode encontrar o podspec Brightcove-Player-Core
mais recente aqui. O podspec suporta iOS e tvOS.
Ao usar Brightcove CocoaPods em seu projeto, adicione source 'https://github.com/brightcove/BrightcoveSpecs.git'
ao início de seu Podfile.
nome.
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
O Framework pode ser instalado anexando a subespecificação /Framework
ao 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
Ao atualizar sua instalação, é uma boa ideia atualizar a cópia local do seu repositório BrightcoveSpecs para que você tenha os podspecs mais recentes localmente, da mesma forma que atualizaria seu repositório mestre CococaPods. Normalmente, se você executar pod update
no Terminal, isso acontecerá automaticamente ou, alternativamente, você poderá atualizar explicitamente com pod repo update
.
Para adicionar o Brightcove Player SDK ao seu projeto manualmente:
BrightcovePlayerSDK.framework
ou BrightcovePlayerSDK.xcframework
ao seu projeto. Certifique-se de usar a versão correspondente ao seu destino, iOS ou tvOS.BrightcovePlayerSDK.framework
/ BrightcovePlayerSDK.xcframework
bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
. Marque "Executar script somente durante a instalação". Isso removerá arquiteturas desnecessárias da compilação, o que é importante para o envio da App Store. Esta etapa não é mais necessária ao usar o XCFramework.bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
. Marque "Executar script somente durante a instalação". Isso removerá arquiteturas desnecessárias da compilação, o que é importante para o envio à App Store.arm64
tenha sido adicionado à configuração de compilação "Arquiteturas excluídas" para Any iOS Simulator SDK
.Para referência, aqui estão todos os componentes do SDK e URLs correspondentes para ajudá-lo a localizar e baixar as versões mais recentes:
Componente | 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 |
Para adicionar o Brightcove Player SDK ao seu projeto com Swift Package Manager:
https://github.com/brightcove/brightcove-player-sdk-ios.git
Nota: Somente o XCFramework dinâmico é compatível com o Swift Package Manager.
O Brightcove Player SDK para iOS pode ser importado usando:
import BrightcovePlayerSDK;
Reproduzindo vídeo com o Brightcove Player SDK para 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 ( )
}
}
Você precisa evitar que o controlador seja liberado automaticamente no final do método. Uma maneira comum de fazer isso é armazenar uma referência ao controlador em uma variável de instância forte.
Desde a versão 5.1.0, o Brightcove PlayerUI está totalmente integrado à estrutura Core SDK. PlayerUI fornece um conjunto completo de controles para reprodução e publicidade, prontos para uso.
O PlayerUI é rápido de configurar, exibe controles de anúncios para SSAI, Pulse e FreeWheel e pode ser personalizado criando seus próprios layouts.
Siga as diretrizes abaixo para configurar os controles do PlayerUI.
Crie uma propriedade em seu UIViewController para acompanhar o BCOVPUIPlayerView. O BCOVPUIPlayerView conterá a visualização do controlador de reprodução e a visualização dos controles.
// PlayerUI's Player View
var playerView : BCOVPUIPlayerView ?
Crie o BCOVPUIBasicControlView e, em seguida, o BCOVPUIPlayerView. É aqui que associamos o Playback Controller (e, portanto, todos os vídeos que ele reproduz) aos controles.
// 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 )
}
Você precisará configurar o layout para a visualização do player. Você pode fazer isso com o Auto Layout ou a abordagem mais antiga do Springs & Struts.
Defina a visualização do player para corresponder ao contêiner de vídeo do seu layout ( videoView
) quando ele for redimensionado.
playerView . frame = videoView . bounds
playerView . autoresizingMask = [ . flexibleHeight , . flexibleWidth ]
Defina translatesAutoresizingMaskIntoConstraints
em BCOVPUIPlayerView como false
.
playerView . translatesAutoresizingMaskIntoConstraints = false
Em seguida, adicione as restrições ao layout; definindo as âncoras superior, direita, esquerda e inferior do seu BCOVPUIPlayerView para serem iguais às do 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 )
] )
A classe BCOVPUIPlayerViewOptions
permite personalizar algum comportamento do BCOVPlayerUI na inicialização. Você pode personalizar o seguinte:
jumpBackInterval
O tempo em segundos que o jogador irá buscar quando o botão de retroceder for pressionado.
hideControlsInterval
O tempo em segundos após o último evento de toque, antes que os controles sejam ocultados.
hideControlsAnimationDuration
O tempo em segundos que leva para os controles serem animados para ocultos.
showControlsAnimationDuration
O tempo em segundos que leva para os controles serem animados e ficarem visíveis.
learnMoreButtonBrowserStyle
Configuração que determina se tocar no botão "Saiba mais" em um anúncio exibirá o link de clique em um navegador externo (configuração padrão) ou interno.
presentingViewController
A subclasse UIViewController a ser usada para apresentar outros controladores de visualização (como o controlador de visualização de seleção de legenda oculta).
automaticControlTypeSelection
Se você deseja ou não que o BCOVPUIPlayerView
escolha um tipo BCOVPUIBasicControlView
automaticamente com base no tipo de mídia. Quando esse valor for definido como true
, a propriedade BCOVPUIBasicControlView
passada para o inicializador BCOVPUIPlayerView
será ignorada.
Fluxos de vídeo + áudio
basicControlViewWithVODLayout
basicControlViewWithLiveLayout
basicControlViewWithLiveDVRLayout
Streams somente de áudio
basicControlViewWithAODLayout
basicControlViewWithLiveAudioLayout
basicControlViewWithLiveDVRAudioLayout
NOTA: automaticControlTypeSelection
escolhe layouts daqueles fornecidos por BCOVPlayerUI e, portanto, controles e layouts personalizados serão substituídos; automaticControlTypeSelection
e personalização da UI do player são incompatíveis.
As opções podem ser definidas usando o seguinte método:
let manager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = manager . createPlaybackController ( )
let options = BCOVPUIPlayerViewOptions ( )
options . jumpBackInterval = 5
let playerView = BCOVPUIPlayerView ( playbackController : playbackController ,
options : options )
Três layouts são fornecidos para suportar diferentes tipos de vídeo:
BCOVPUIControlLayout basicVODControlLayout
é um layout básico para fluxos gerais de vídeo sob demanda.
BCOVPUIControlLayout basicLiveControlLayout
é um layout para vídeo ao vivo.
BCOVPUIControlLayout basicLiveDVRControlLayout
é um layout para transmissões de vídeo ao vivo com controles DVR.
Normalmente, você define um novo layout imediatamente após a criação do BCOVPUIPlayerView
, mas também pode definir um novo layout a qualquer momento. Por exemplo, você pode definir um novo layout VOD como este:
playerView ? . controlsView . layout = BCOVPUIControlLayout . basicVOD ( )
Além dos layouts padrão, você pode criar seus próprios layouts altamente customizados instanciando um novo BCOVPUIControlLayout
com seu próprio design. Observe , entretanto, que automaticControlTypeSelection
escolhe layouts daqueles fornecidos por BCOVPlayerUI e, portanto, controles e layouts personalizados serão substituídos; automaticControlTypeSelection
e personalização da UI do player são incompatíveis.
Primeiro, crie os controles que irão para o seu layout usando BCOVPUIBasicControlView layoutViewWithControlFromTag:width:elasticity:
. Cada controle é empacotado em um BCOVPUILayoutView
que determina o espaçamento do controle.
Você pode definir a width
de cada visualização de layout como a largura padrão (que é baseada no tipo de controle) ou pode especificar sua própria largura.
Use o argumento elasticity
para determinar o quanto a visualização de layout que contém o controle redimensiona sua largura para preencher a barra de controle.
Aqui estão alguns exemplos de criação de uma variedade de controles básicos.
// 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 )
Observe que você também pode criar uma visualização de layout vazia, na qual você pode colocar sua própria visualização (logotipo, controle, nada, etc.). Este código mostra como colocar um logotipo UIImage
dentro do logoLayoutView1 que criamos acima.
// 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 )
Agora que existem vários controles empacotados em visualizações de layout, eles são ordenados em arrays, cada um representando uma única linha de controles, ou seja, uma barra de controle. Observe que você pode ter layouts diferentes para orientações retrato e paisagem; portanto, normalmente você configurará duas matrizes diferentes de barras de controle.
No layout padrão para orientação paisagem, os controles são organizados em uma única matriz e, em seguida, essa matriz é armazenada em outra matriz que representa todo o conjunto de controles.
let standardLayoutLine1 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
currentTimeLayoutView ,
timeSeparatorLayoutView ,
durationLayoutView ,
progressLayoutView ,
spacerLayoutView1 ,
logoLayoutView1 ,
spacerLayoutView2 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView
]
let standardLayoutLines = [ standardLayoutLine1 ]
No layout compacto para orientação retrato, são criadas duas matrizes de controles, uma para cada linha. Essas matrizes são empacotadas em outra matriz que representa o layout compacto.
Observe que exatamente os mesmos objetos são usados para a maioria dos controles em cada layout. Quando isso for feito e você alternar entre as orientações retrato e paisagem, o objeto será movido para sua nova posição usando animação suave.
let compactLayoutLine1 = [
currentTimeLayoutView ,
progressLayoutView ,
durationLayoutView
]
let compactLayoutLine2 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
spacerLayoutView1 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView ,
logoLayoutView2
]
let compactLayoutLines = [
compactLayoutLine1 ,
compactLayoutLine2
]
Finalmente, agora que existem duas configurações de layout (uma para largura total e outra para largura compacta), você pode criar um novo objeto BCOVPUIControlLayout
e defini-lo na visualização de controle do player.
let customLayout = BCOVPUIControlLayout . init ( standardControls : standardLayoutLines ,
compactControls : compactLayoutLines )
playerView ? . controlsView . layout = customLayout
Se você tiver controles que precisa mostrar ou ocultar com frequência, poderá definir a propriedade removed
na visualização de layout desse controle. Depois de alterar seus controles, chame setNeedsLayout
no controlView do playerView:
logoLayoutView1 ? . isRemoved = true
playerView ? . controlsView . setNeedsLayout ( )
Também é possível customizar diversas propriedades gerais BCOVPUIControlLayout
:
controlBarHeight
define o tamanho de cada linha de controles.horizontalItemSpacing
define o espaçamento entre cada BCOVPUILayoutView
em cada barra de controle.compactLayoutMaximumWidth
determina qual conjunto de controles é usado. Se a visualização de controle for menor que compactLayoutMaximumWidth
, o conjunto de controles compactos será usado, caso contrário, os controles padrão serão usados. Para alterar o conjunto de controles exibidos, você deve criar e instalar um novo BCOVPUIControlLayout
. Novos controles podem ser instalados a qualquer momento.
Para obter mais exemplos de personalização do PlayerUI, você pode consultar o código de exemplo na pasta PlayerUI do repositório BrightcoveOS GitHub:
https://github.com/BrightcoveOS/ios-player-samples
O Brightcove Native Player SDK inclui controles integrados para reprodução em tvOS na Apple TV. Para obter detalhes completos sobre como usar a interface de usuário integrada do TV Player com o Brightcove Native Player SDK, consulte nosso guia do TV Player.
Habilite a funcionalidade AirPlay definindo a propriedade setAllowsExternalPlayback
em seu BCOVPlaybackController
como true
. O botão AirPlay será exibido nos controles de reprodução se dispositivos AirPlay forem encontrados em sua rede.
Atualmente, o IMA é o único plug-in de anúncio compatível com AirPlay e somente ao usar anúncios precedentes e/ou finais. Usar o AirPlay com os plug-ins de anúncios Pulse, SSAI ou FreeWheel pode resultar em comportamento inesperado.
Se você também deseja oferecer suporte ao AirPlay 2 e permitir que vários dispositivos sejam selecionados para saída de áudio, você terá que fazer algumas coisas adicionais. Primeiro, você precisará configurar AVAudioSession para poder definir routeSharingPolicy
. Por exemplo:
do {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , mode : . moviePlayback , policy : . longFormVideo )
} catch {
print ( " Error setting AVAudioSession category " )
}
Você também precisará configurar pelo menos um comando de reprodução via MPRemoteCommandCenter
. No mínimo, você desejará configurar pauseCommand
e playCommand
. Por exemplo:
let center = MPRemoteCommandCenter . shared ( )
center . pauseCommand . addTarget { _ in
playbackController . pause ( )