Paso a paso: Aplicación de video de TV simple usando Swift

En este tema, aprenderá a crear una aplicación de reproducción de video simple usando Brightcove Player SDK para tvOS que se podrá reproducir en un Apple TV o en el simulador de Xcode. Lo construirás utilizando el lenguaje de programación Swift.

Resumen

Este ejemplo reproduce un video devuelto por API de reproducción de Brightcove , que es la API más reciente y recomendada para recuperar contenido de su biblioteca de Video Cloud.

Este ejemplo reproduce videos de una matriz interna de archivos de video.

Para utilizar la API de reproducción, necesitará una clave de política. Si no está familiarizado con las claves de política, consulte la Descripción general de la API de políticas.

Empezar

Siga los pasos a continuación para familiarizarse con la configuración de un proyecto de aplicación que utilice Brightcove Player SDK para tvOS. Puede ver el código completo para cada uno de los siguientes:

  1. Delegado de aplicaciones
  2. Controlador de vista

Hay dos formas de probar este ejemplo:

Descarga la muestra

Descarga todo el proyecto de Xcode para experimentar.

  1. Clona o descarga el SDK nativo para muestras de iOS a su sistema local.
  2. Navega al Reproductor / AppleTV / swift aplicación de muestra.
  3. Ejecutar el pod install mando.
  4. Abra y ejecute el espacio de trabajo recién creado.

Para obtener más detalles, consulte la Ejecución de aplicaciones de muestra para el SDK nativo para iOS / tvOS documento.

Cree la aplicación siguiendo los pasos de esta guía

Siga los pasos a continuación para familiarizarse con la configuración de un proyecto de aplicación que utilice Brightcove Player SDK para tvOS. Puede ver el código completo para cada uno de los siguientes:

  1. Delegado de aplicaciones
  2. Controlador de vista

Crea el proyecto

Configura un proyecto en Xcode. Luego, agregue el SDK junto con las dependencias al proyecto.

Configurar el proyecto Xcode

Cree un nuevo proyecto de Xcode para la aplicación.

  1. Inicie la creación de un nuevo proyecto de tvOS en Xcode. Seleccione Crea un nuevo proyecto de Xcode.

    Crear proyecto
    Crear proyecto
  2. Elija tvOS y luego App para la plantilla. Haz clic en Siguiente.

    Elija la plantilla del proyecto
    Elija la plantilla del proyecto
  3. Configure la información del proyecto de la siguiente manera:

    • Nombre del producto: Reproducción de video simple
    • Equipo: ninguno

      El campo Equipo es opcional. Si desea distribuir su aplicación en la App Store, deberá seleccionar un equipo al que pertenezca a través del Programa de desarrolladores de Apple. Se requiere el nombre del equipo para la firma de código. En este ejemplo, seleccionaremos ninguno.

    • Identificador de la organización: com.your-company-name
      Esto hace que el nombre del producto sea único para la tienda de aplicaciones.
    • Interfaz: Storyboard

      Utilice la interfaz Storyboard o SwiftUI.

    • Idioma: Rápido
    Agregar información del proyecto
    Agregar información del proyecto

    Haz clic en Siguiente.

  4. Elija la ubicación donde desea guardar su proyecto y haga clic en Crear .

    Crea el proyecto
    Crea el proyecto
  5. Ahora cierre el proyecto (sí, ciérrelo, ¡esto es importante!)

Agregue el SDK y sus dependencias a su proyecto

La forma más fácil de agregar el SDK y sus dependencias a su proyecto es usar CocoaPods.

CocoaPods es un administrador de dependencias que agrega bibliotecas a su proyecto. No es necesario, pero facilita la instalación. Para instalar CocoaPods, consulte las instrucciones en el CocoaPods sitio.

  1. En la carpeta de su proyecto, cree un archivo de texto sin formato llamado Podfile (sin extensión de archivo).

  2. Con un editor de texto, agregue las siguientes líneas de código al Podfile y guárdelo. Este código hace lo siguiente:

    • Línea 1: Apunta a la ubicación de GitHub para las especificaciones del pod CocoaPods
    • Línea 2: Apunta a la ubicación de GitHub para las especificaciones del pod de Brightcove
    • Línea 4: Establece pods para usar marcos en lugar de bibliotecas estáticas
    • Línea 6: Define la versión de la plataforma tvOS.
    • Líneas 8-10: Instale Brightcove Native Player SDK.

    source 'https://github.com/CocoaPods/Specs.git'
    source 'https://github.com/brightcove/BrightcoveSpecs.git'
    
    use_frameworks!
    
    platform :tvos, '16.0' # (or whatever version you want)
    
    target 'Simple-Video-Playback' do
       pod 'Brightcove-Player-Core/XCFramework'  
    end
  3. Abra una sesión de Terminal y navegue hasta su Reproducción de video simple Carpeta del proyecto Xcode.

    Sesión terminal
    Sesión terminal
  4. En la sesión de Terminal, escriba el comando

      pod install

    y presione Regreso para ejecutarlo.

    Si CocoaPods no puede encontrar una versión compatible para el pod, o no es la última versión, intente ejecutar lo siguiente en la aplicación Terminal:

      pod update

    Debería ver una serie de mensajes en el terminal que indican que Brightcove Player SDK se ha agregado a su proyecto.

  5. El pod install comando crea el .xcworkspace archivo para su proyecto.

    Observe la última línea , que es importante; a partir de este punto, debe hacer lo siguiente:

    • Abra el archivo Simple-Video-Playback.xcworkspace en Xcode
    • No use el archivo Simple-Video-Playback.xcodeproj
    Espacio de trabajo
    Espacio de trabajo

Codificar la aplicación de video

Cree el código para una aplicación de reproducción de video simple.

Establecer el comportamiento de audio para la aplicación

La sesión de audio maneja el comportamiento del audio a nivel de la aplicación. Más información sobre el AVAudioSession clase.

Para esta muestra, usaremos el reproducción categoría. Esto reproduce audio incluso cuando la pantalla está bloqueada y con el interruptor de timbre / silencio en silencio. Ya que estamos reproduciendo video, usaremos el moviePlayback modo. Para simplificar, colocaremos este código en el Delegado de la aplicación.

  1. En su proyecto, abra el archivo App Delegate (AppDelegate.swift).

  2. En el didFinishLaunchingWithOptions función, agregue código para configurar la categoría de la sesión de audio. Asegúrese de importar el AVFoundation marco de referencia.

    //
    //  AppDelegate.swift
    //  Simple-Video-Playback
    //
    //  Copyright © 2018 Brightcove. All rights reserved.
    //
    
    import UIKit
    import AVFoundation
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
      var window: UIWindow?
    
      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
            var categoryError :NSError?;
        var success: Bool;
        do {
          try AVAudioSession.sharedInstance().setCategory(.playback, mode: .moviePlayback, options: .duckOthers)
          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!)");
        }
    
        return true
      }
    
      func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
      }
    
      func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
      }
    
      func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
      }
    
      func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
      }
    
      func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
      }
    
    }

Construya el controlador de vista

Actualice la clase View Controller para reproducir un video desde Brightcove Playback API.

Actualice la clase View Controller para reproducir un video desde una URL remota.

  1. En su proyecto, abra el archivo View Controller (ViewController.swift).

Importar el SDK nativo

Aunque Brightcove Native Player SDK para iOS está escrito en Obj-C, podemos simplemente importar los módulos del marco a nuestro proyecto Swift.

  1. Debajo de lo existente import directiva, agregue lo siguiente para importar el SDK del reproductor nativo de Brightcove:

    import BrightcovePlayerSDK

Personaliza el proyecto con tus valores

Agregue valores para acceder a su cuenta de Video Cloud.

  1. Bajo la import directivas, agregue sus propios valores para lo siguiente:

    • Línea 12: Define la clave de política de la API de reproducción de Brightcove. Este ejemplo reproduce un video devuelto por API de reproducción de Brightcove , que es la API más reciente y recomendada para recuperar contenido de su biblioteca de Video Cloud. Si no está familiarizado con las claves de política, consulte la Descripción general de la API de políticas.

    • Línea 13: Define su ID de cuenta de Video Cloud
    • Línea 14: Define su ID de video de Video Cloud

    fileprivate struct playbackConfig {
      static let policyKey = "your policy key"
      static let accountID = "your account id"
      static let videoID = "your video id"
    }

Crear una variable de vista

  1. En el ViewController class, agregue una variable para la vista.

    class ViewController: UIViewController {
      @IBOutlet weak var videoContainerView: UIView!

Crea el servicio de reproducción

  1. Cree una variable que defina el servicio de reproducción de Brightcove con su ID de cuenta y Clave de política. Esto se inicializará la primera vez que se llame.

    Si es nuevo en Swift, consulte la guía sobre Propiedades almacenadas perezosas.

    lazy var playbackService: BCOVPlaybackService = {
      return BCOVPlaybackService(accountId: playbackConfig.accountID, policyKey: playbackConfig.policyKey)
    }()

Crea el controlador de reproducción

  1. Cree una variable que defina el controlador de reproducción de Brightcove. Esto se creará la primera vez que se llame.

    • Líneas 28-30: configure el delegado y active las funciones de avance automático y reproducción automática.

    lazy var playbackController: BCOVPlaybackController? = {
      guard let _playbackController = BCOVPlayerSDKManager.shared().createPlaybackController() else {
        return nil
      }
      _playbackController.delegate = self
      _playbackController.isAutoAdvance = true
      _playbackController.isAutoPlay = true
    
      return _playbackController
    }()

Definir la vista del jugador

  1. Crea una función llamada createTVPlayerView como sigue:

    • Líneas 38-39: Defina la vista del jugador para que los paneles de la barra de pestañas puedan presentar otros controladores de vista.
    • Líneas 42-44: Cree la vista del reproductor y agréguela a la vista del contenedor de video.
    • Línea 47: Asocie la vista del reproductor con el controlador de reproducción.
    • Línea 49: Agrega la vista del reproductor como una subvista de la vista principal.
    • Línea 51: Apagar máscara de cambio de tamaño automático.
    • Líneas 52-57: Usar Diseño automático para definir restricciones dinámicas para la vista del jugador.

    lazy var playerView: BCOVTVPlayerView? = {
      // Set yourself as the presenting view controller
      // so that tab bar panels can present other view controllers
      let options = BCOVTVPlayerViewOptions()
      options.presentingViewController = self
    
      // Create and add to the video container view
      guard let _playerView = BCOVTVPlayerView(options: options) else {
        return nil
      }
    
      // Link the playback controller to the Player View
      _playerView.playbackController = playbackController
    
      videoContainerView.addSubview(_playerView)
    
      _playerView.translatesAutoresizingMaskIntoConstraints = false
      NSLayoutConstraint.activate([
        _playerView.topAnchor.constraint(equalTo: videoContainerView.topAnchor),
        _playerView.rightAnchor.constraint(equalTo: videoContainerView.rightAnchor),
        _playerView.leftAnchor.constraint(equalTo: videoContainerView.leftAnchor),
        _playerView.bottomAnchor.constraint(equalTo: videoContainerView.bottomAnchor)
      ])
    
      return _playerView
    }()

Crea una función de inicio

  1. Crear un initfuncionan de la siguiente manera:
    • Línea 64: Llama a la implementación de superclase de la función init ().
    • Línea 65: Opcional: Envía su ID de cuenta de Video Cloud a análisis. Esto solo es necesario si anula la BCOVVideo clase o no utilice el servicio o catálogo de Brightcove Playback.

    required init?(coder aDecoder: NSCoder)
    {
      super.init(coder: aDecoder)
      playbackController?.analytics.account = playbackConfig.accountID;
    }

Proceso después de cargar la vista

  1. En el viewDidLoad método agregue lo siguiente:

    • Línea 72: Llama al requestContentFromPlaybackService función, que definiremos en el siguiente paso.

    override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view, typically from a nib.
    
      requestContentFromPlaybackService()
    }

Solicitar contenido de la biblioteca de Brightcove

Para reproducir contenido de video, solicitará una lista de reproducción al servicio de catálogo.

  1. Crea una función llamada requestContentFromPlaybackService como sigue:

    • Líneas 75-76: devuelve un objeto de video de la API de reproducción según la identificación de video dada.
    • Línea 80: agrega el video al controlador de reproducción.
    • Línea 82: escribe un mensaje de error si no se devuelve una lista de reproducción.
    private func requestContentFromPlaybackService() {
      playbackService.findVideo(withVideoID: playbackConfig.videoID, parameters: nil) { [weak self] (video: BCOVVideo?, jsonResponse: [AnyHashable: Any]?, error: Error?) -> Void in
    
        if let _video = video {
          //  since "isAutoPlay" is true, setVideos will begin playing the content
          self?.playbackController?.setVideos([_video] as NSArray)
        } else {
          print("ViewController Debug - Error retrieving video: \(error?.localizedDescription ?? "unknown error")")
        }
      }
    }

Extienda el controlador de reproducción

Esto permite que su aplicación escuche y responda a eventos de reproducción de video.

  1. Extienda el controlador de vista para incluir el delegado del controlador de reproducción de Brightcove y escuche los eventos de reproducción. Si es nuevo en Swift, consulte la guía sobre Extensiones.

    // MARK: - BCOVPlaybackControllerDelegate
    extension ViewController: BCOVPlaybackControllerDelegate {
    
      func playbackController(_ controller: BCOVPlaybackController!, didAdvanceTo session: BCOVPlaybackSession!) {
        NSLog("ViewController Debug - Advanced to new session.")
      }
    
      func playbackController(_ controller: BCOVPlaybackController!, playbackSession session: BCOVPlaybackSession!, didReceive lifecycleEvent: BCOVPlaybackSessionLifecycleEvent!) {
        NSLog("Event: %@", lifecycleEvent.eventType)
      }
    }

El resto

  1. Cree funciones para manejar anulaciones de enfoque para versiones anteriores de tvOS.

    // MARK: - UIFocusEnvironment overrides
    extension ViewController {
    
      // Focus Environment override for tvOS 9
      override var preferredFocusedView: UIView? {
          return playerView
      }
    
      // Focus Environment override for tvOS 10+
      override var preferredFocusEnvironments: [UIFocusEnvironment] {
          return (playerView != nil ? [ playerView! ] : [])
      }
    }

Ver el código

El controlador de vista ahora está completo. Aquí está el código completo:

//
//  ViewController.swift
//  Simple-Video-Playback
//
//  Copyright © 2018 Brightcove. All rights reserved.
//

import UIKit
import BrightcovePlayerSDK

fileprivate struct playbackConfig {
  static let policyKey = "your policy key"
  static let accountID = "your account id"
  static let videoID = "your video id"
}

class ViewController: UIViewController {
  @IBOutlet weak var videoContainerView: UIView!

  lazy var playbackService: BCOVPlaybackService = {
      return BCOVPlaybackService(accountId: playbackConfig.accountID, policyKey: playbackConfig.policyKey)
  }()

  lazy var playbackController: BCOVPlaybackController? = {
      guard let _playbackController = BCOVPlayerSDKManager.shared().createPlaybackController() else {
        return nil
      }
      _playbackController.delegate = self
      _playbackController.isAutoAdvance = true
      _playbackController.isAutoPlay = true

      return _playbackController
  }()

  lazy var playerView: BCOVTVPlayerView? = {
    // Set yourself as the presenting view controller
    // so that tab bar panels can present other view controllers
    let options = BCOVTVPlayerViewOptions()
    options.presentingViewController = self

    // Create and add to the video container view
    guard let _playerView = BCOVTVPlayerView(options: options) else {
      return nil
    }

    // Link the playback controller to the Player View
    _playerView.playbackController = playbackController

    videoContainerView.addSubview(_playerView)

    _playerView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
      _playerView.topAnchor.constraint(equalTo: videoContainerView.topAnchor),
      _playerView.rightAnchor.constraint(equalTo: videoContainerView.rightAnchor),
      _playerView.leftAnchor.constraint(equalTo: videoContainerView.leftAnchor),
      _playerView.bottomAnchor.constraint(equalTo: videoContainerView.bottomAnchor)
    ])

    return _playerView
  }()

  required init?(coder aDecoder: NSCoder)
  {
    super.init(coder: aDecoder)
    playbackController?.analytics.account = playbackConfig.accountID; // Optional
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    requestContentFromPlaybackService()
  }

  private func requestContentFromPlaybackService() {
    playbackService.findVideo(withVideoID: playbackConfig.videoID, parameters: nil) { [weak self] (video: BCOVVideo?, jsonResponse: [AnyHashable: Any]?, error: Error?) -> Void in

      if let _video = video {
        //  since "isAutoPlay" is true, setVideos will begin playing the content
        self?.playbackController?.setVideos([_video] as NSArray)
      } else {
        print("ViewController Debug - Error retrieving video: \(error?.localizedDescription ?? "unknown error")")
      }
    }
  }
}

// MARK: - BCOVPlaybackControllerDelegate
extension ViewController: BCOVPlaybackControllerDelegate {

  func playbackController(_ controller: BCOVPlaybackController!, didAdvanceTo session: BCOVPlaybackSession!) {
    NSLog("ViewController Debug - Advanced to new session.")
  }

  func playbackController(_ controller: BCOVPlaybackController!, playbackSession session: BCOVPlaybackSession!, didReceive lifecycleEvent: BCOVPlaybackSessionLifecycleEvent!) {
    NSLog("Event: %@", lifecycleEvent.eventType)
  }
}

// MARK: - UIFocusEnvironment overrides
extension ViewController {

  // Focus Environment override for tvOS 9
  override var preferredFocusedView: UIView? {
    return playerView
  }

  // Focus Environment override for tvOS 10+
  override var preferredFocusEnvironments: [UIFocusEnvironment] {
    return (playerView != nil ? [ playerView! ] : [])
  }
}

Importar el SDK nativo

Aunque Brightcove Native Player SDK para iOS está escrito en Obj-C, podemos simplemente importar los módulos del marco a nuestro proyecto Swift.

  1. Debajo de lo existente import directiva, agregue lo siguiente para importar el SDK del reproductor nativo de Brightcove:

    import BrightcovePlayerSDK

Personaliza el proyecto con tus valores

Agregue el valor de su ID de cuenta de Video Cloud.

fileprivate struct playbackConfig {
    static let accountID = "your account id"
}

Crear una variable de vista

  1. En el ViewController class, agregue una variable para la vista.

    class ViewController: UIViewController {
      @IBOutlet weak var videoContainerView: UIView!

Crea el controlador de reproducción

  1. Cree una variable que defina el controlador de reproducción de Brightcove. Esto se creará la primera vez que se llame.

    • Líneas 22-24: configure el delegado y active las funciones de avance automático y reproducción automática.

    lazy var playbackController: BCOVPlaybackController? = {
      guard let _playbackController = BCOVPlayerSDKManager.shared().createPlaybackController() else {
        return nil
      }
      _playbackController.delegate = self
      _playbackController.isAutoAdvance = true
      _playbackController.isAutoPlay = true
    
      return _playbackController
    }()

Definir la vista del jugador

  1. Crea el playerView como sigue:

    • Líneas 32-33: Defina la vista del jugador para que los paneles de la barra de pestañas puedan presentar otros controladores de vista.
    • Líneas 36-38: Cree la vista del reproductor y agréguela a la vista del contenedor de video.
    • Línea 41: Asocie la vista del reproductor con el controlador de reproducción.
    • Línea 43: Agrega la vista del reproductor como una subvista de la vista principal.
    • Línea 45: Apagar máscara de cambio de tamaño automático.
    • Líneas 46-51: Usar Diseño automático para definir restricciones dinámicas para la vista del jugador.

    lazy var playerView: BCOVTVPlayerView? = {
      // Set yourself as the presenting view controller
      // so that tab bar panels can present other view controllers
      let options = BCOVTVPlayerViewOptions()
      options.presentingViewController = self
    
      // Create and add to the video container view
      guard let _playerView = BCOVTVPlayerView(options: options) else {
        return nil
      }
    
      // Link the playback controller to the Player View
      _playerView.playbackController = playbackController
    
      videoContainerView.addSubview(_playerView)
    
      _playerView.translatesAutoresizingMaskIntoConstraints = false
      NSLayoutConstraint.activate([
        _playerView.topAnchor.constraint(equalTo: videoContainerView.topAnchor),
        _playerView.rightAnchor.constraint(equalTo: videoContainerView.rightAnchor),
        _playerView.leftAnchor.constraint(equalTo: videoContainerView.leftAnchor),
        _playerView.bottomAnchor.constraint(equalTo: videoContainerView.bottomAnchor)
      ])
    
      return _playerView
    }()

Crea una función de inicio

  1. Crear un initfuncionan de la siguiente manera:
    • Línea 58: Llama a la implementación de superclase de la función init ().
    • Línea 59: Envía su ID de cuenta de Video Cloud a análisis. Esto registra su aplicación con Brightcove.

    required init?(coder aDecoder: NSCoder)
    {
      super.init(coder: aDecoder)
      playbackController?.analytics.account = playbackConfig.accountID;
    }

Reproducir videos

  1. En el viewDidLoad método agregue lo siguiente:

    • Líneas 67-69: Cree una variedad de fuentes de video utilizando rutas de URL.
    • Línea 71: agrega la matriz de video a la cola de reproducción del controlador, que está configurada para comenzar a reproducir automáticamente.

    override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view, typically from a nib.
    
      // create an array of videos
      var videoArray = [AnyObject]()
      videoArray = [videoWithURL(url: NSURL(string: "https://sdks.support.brightcove.com/assets/videos/hls/laughing_gull/laughing_gull.m3u8")!),
                    videoWithURL(url: NSURL(string: "https://sdks.support.brightcove.com/assets/videos/hls/greatblueheron/greatblueheron.m3u8")!)]
    
      playbackController?.setVideos(videoArray as NSFastEnumeration);
    }

Establecer el método de entrega para las fuentes de video

  1. Cree una función que establezca el método de entrega para BCOVSources que pertenecen a un video.

    func videoWithURL(url: NSURL) -> BCOVVideo {
        // set the delivery method for BCOVSources that belong to a video
        let source:BCOVSource = BCOVSource(url: url as URL?, deliveryMethod: kBCOVSourceDeliveryHLS, properties: nil)
        let video = BCOVVideo.init(source: source, cuePoints: BCOVCuePointCollection.init(array: []), properties: [NSObject:AnyObject]())
        return video!
    }

Extienda el controlador de reproducción

Esto permite que su aplicación escuche y responda a eventos de reproducción de video.

  1. Extienda el controlador de vista para incluir el delegado del controlador de reproducción de Brightcove y escuche los eventos de reproducción. Si es nuevo en Swift, consulte la guía sobre Extensiones.

    // MARK: - BCOVPlaybackControllerDelegate
    extension ViewController: BCOVPlaybackControllerDelegate {
    
      func playbackController(_ controller: BCOVPlaybackController!, didAdvanceTo session: BCOVPlaybackSession!) {
        NSLog("ViewController Debug - Advanced to new session.")
      }
    
      func playbackController(_ controller: BCOVPlaybackController!, playbackSession session: BCOVPlaybackSession!, didReceive lifecycleEvent: BCOVPlaybackSessionLifecycleEvent!) {
        NSLog("Event: %@", lifecycleEvent.eventType)
      }
    }

El resto

  1. Cree funciones para manejar anulaciones de enfoque para versiones anteriores de tvOS.

    // MARK: - UIFocusEnvironment overrides
    extension ViewController {
    
      // Focus Environment override for tvOS 9
      override var preferredFocusedView: UIView? {
          return playerView
      }
    
      // Focus Environment override for tvOS 10+
      override var preferredFocusEnvironments: [UIFocusEnvironment] {
          return (playerView != nil ? [ playerView! ] : [])
      }
    }

Ver el código

El controlador de vista ahora está completo. Aquí está el código completo:

//
//  ViewController.swift
//  Simple-Video-Playback
//
//  Copyright © 2018 Brightcove. All rights reserved.
//

import UIKit
import BrightcovePlayerSDK

fileprivate struct playbackConfig {
  static let accountID = "1752604059001"
}

class ViewController: UIViewController {
  @IBOutlet weak var videoContainerView: UIView!

  lazy var playbackController: BCOVPlaybackController? = {
    guard let _playbackController = BCOVPlayerSDKManager.shared().createPlaybackController() else {
      return nil
    }
    _playbackController.delegate = self
    _playbackController.isAutoAdvance = true
    _playbackController.isAutoPlay = true

    return _playbackController
  }()

  lazy var playerView: BCOVTVPlayerView? = {
    // Set yourself as the presenting view controller
    // so that tab bar panels can present other view controllers
    let options = BCOVTVPlayerViewOptions()
    options.presentingViewController = self

    // Create and add to the video container view
    guard let _playerView = BCOVTVPlayerView(options: options) else {
      return nil
    }

    // Link the playback controller to the Player View
    _playerView.playbackController = playbackController

    videoContainerView.addSubview(_playerView)

    _playerView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
      _playerView.topAnchor.constraint(equalTo: videoContainerView.topAnchor),
      _playerView.rightAnchor.constraint(equalTo: videoContainerView.rightAnchor),
      _playerView.leftAnchor.constraint(equalTo: videoContainerView.leftAnchor),
      _playerView.bottomAnchor.constraint(equalTo: videoContainerView.bottomAnchor)
    ])

    return _playerView
  }()

  required init?(coder aDecoder: NSCoder)
  {
    super.init(coder: aDecoder)
    playbackController?.analytics.account = playbackConfig.accountID;
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    // create an array of videos
    var videoArray = [AnyObject]()
    videoArray = [videoWithURL(url: NSURL(string: "https://sdks.support.brightcove.com/assets/videos/hls/laughing_gull/laughing_gull.m3u8")!),
        videoWithURL(url: NSURL(string: "https://sdks.support.brightcove.com/assets/videos/hls/greatblueheron/greatblueheron.m3u8")!)]

    playbackController?.setVideos(videoArray as NSFastEnumeration);
  }

  func videoWithURL(url: NSURL) -> BCOVVideo {
    // set the delivery method for BCOVSources that belong to a video
    let source:BCOVSource = BCOVSource(url: url as URL?, deliveryMethod: kBCOVSourceDeliveryHLS, properties: nil)
    let video = BCOVVideo.init(source: source, cuePoints: BCOVCuePointCollection.init(array: []), properties: [NSObject:AnyObject]())
    return video!
  }
}

// MARK: - BCOVPlaybackControllerDelegate
extension ViewController: BCOVPlaybackControllerDelegate {

  func playbackController(_ controller: BCOVPlaybackController!, didAdvanceTo session: BCOVPlaybackSession!) {
    NSLog("ViewController Debug - Advanced to new session.")
  }

  func playbackController(_ controller: BCOVPlaybackController!, playbackSession session: BCOVPlaybackSession!, didReceive lifecycleEvent: BCOVPlaybackSessionLifecycleEvent!) {
    NSLog("Event: %@", lifecycleEvent.eventType)
  }
}

// MARK: - UIFocusEnvironment overrides
extension ViewController {

  // Focus Environment override for tvOS 9
  override var preferredFocusedView: UIView? {
    return playerView
  }

  // Focus Environment override for tvOS 10+
  override var preferredFocusEnvironments: [UIFocusEnvironment] {
    return (playerView != nil ? [ playerView! ] : [])
  }
}

Conectar la vista del guión gráfico

Conecta el Main.storyboard ver con el videoContainer propiedad.

  1. En el Xcode, abra el Main.storyboard expediente.

  2. En la vista complementaria, expanda el Ver escena del controlador y luego el Ver controlador menú para exponer el Vista objeto.

    Vista de guión gráfico
    Vista de guión gráfico
  3. Haga clic en Agregar editor a la derecha y abra el ViewController.swift archivo.

    Editor asistente
    Editor asistente
  4. Seleccione el círculo abierto junto al @IBOutlet Para el videoContainerView y arrástrelo al Vista objeto para conectar estos componentes.

    Conecta la vista
    Conecta la vista

Gestionar la seguridad de los medios

App Transport Security (ATS) aplica conexiones seguras entre su aplicación y los servicios web. Con el lanzamiento de Apple del SDK de iOS 9, una nueva función llamada Seguridad de transporte de aplicaciones (ATS) fue añadido.

  1. Una de las siguientes situaciones se aplicará a su aplicación:

    • De forma predeterminada, Brightcove Native SDK para iOS utiliza una política de selección de fuente para elegir HTTPS sobre fuentes HTTP, por lo que puede crear sus aplicaciones con ATS habilitado.

      Eso es todo, está listo para ejecutar su aplicación.


    • Si está utilizando fuentes HTTP o tiene otras llamadas HTTP en su aplicación, puede encontrar el siguiente mensaje de error:

      App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
      Temporary exceptions can be configured via your app's Info.plist file.

      Esto significa que ATS está habilitado, pero su sistema no está configurado para cumplir con los requisitos de ATS. Para solucionar esta situación, consulte la Trabajar con App Transport Security (ATS) documento.

Ejecutar la aplicación

La aplicación está lista para compilarse y ejecutarse en un Apple TV o en Xcode Simulator. Debería poder reproducir y navegar por el video especificado usando el control remoto.

Muestra de Apple TV
Muestra de Apple TV

Controles de la interfaz de usuario de Apple TV

Ahora, está listo para obtener más información sobre los controles de reproducción de Apple TV, incluida la vista de la barra superior para información de video, subtítulos y audio. Para obtener más información, consulte el Controles de la interfaz de usuario de Apple TV con el SDK nativo para tvOS documento.

Para obtener detalles sobre cómo crear su propia vista de elementos de la barra superior personalizada, consulte la Ejemplo de reproductor de Apple TV.