サポート問い合わせ先| システムステータス
ページコンテンツ

    ステップバイステップ:Swiftを使用したシンプルなTVビデオアプリ

    このトピックでは、Apple TV または Xcode シミュレータで再生可能な tvOS 用 Brightcove Player SDK を使用して、簡単な動画再生アプリを構築する方法について説明します。Swiftプログラミング言語を使用してビルドします。

    概要

    この例では、 Brightcove 再生 API から返された動画を再生します。これは、Video Cloud ライブラリからコンテンツを取得するための最新かつ推奨される API です。

    この例では、ビデオファイルの内部配列からビデオを再生します。

    再生 API を使用するには、ポリシーキーが必要です。ポリシーキーに慣れていない場合は、「ポリシー API の概要」を参照してください。

    はじめに

    以下の手順に従って、tvOS 用 Brightcove Player SDK を使用するアプリプロジェクトのセットアップについて理解を深めます。次の各について、完全なコードを表示できます。

    1. AppDelegate
    2. ViewController

    このサンプルを試すには、次の 2 つの方法があります。

    サンプルをダウンロードする

    実験のためにXcodeプロジェクト全体をダウンロードしてください。

    1. iOS 用ネイティブ SDK サンプルをローカルシステムに複製またはダウンロードします
    2. Player、AppleTV、Swift サンプルアプリに移動します。
    3. pod installコマンドを実行します。
    4. 新しく作成したワークスペースを開いて実行します。

    詳細については、ネイティブ SDK for iOS/tvOS 用のサンプルアプリの実行を参照してください

    このガイドの手順に従ってアプリを構築する

    以下の手順に従って、tvOS 用 Brightcove Player SDK を使用するアプリプロジェクトのセットアップについて理解を深めます。次の各について、完全なコードを表示できます。

    1. AppDelegate
    2. ViewController

    プロジェクトを作成する

    Xcodeでプロジェクトを設定します。次に、プロジェクトへの依存関係とともに SDK を追加します。

    Xcodeプロジェクトをセットアップする

    アプリ用の新しい Xcode プロジェクトを作成します。

    1. Xcodeで新しいtvOSプロジェクトの作成を開始します。[ 新しい Xcode プロジェクトを作成する ] を選択します。

      Create project
      プロジェクトを作成
    2. テンプレートの tvOS シングルビューアプリケーションを選択し、[ 次へ ] を選択します。

      Choose project template
      プロジェクトテンプレートを選択
    3. プロジェクト情報を次のように設定します。

      • 製品名:シンプルなビデオ再生
      • チーム:なし

        [チーム] フィールドはオプションです。App Storeでアプリを配布する場合は、Apple開発者プログラムを通じて所属するチームを選択する必要があります。コード署名にはチーム名が必要です。この例では、[なし] を選択します。

      • 組織名:あなたの会社名
      • 組織識別子: com.example-company
        これにより、製品名がアプリストアで一意になります。
      • 言語:スウィフト
      Add project information
      プロジェクト情報の追加
    4. プロジェクトを保存する場所を選択し、プロジェクトを作成します。

      Save the project
      プロジェクトを保存する
    5. 今すぐプロジェクトを閉じてください(はい、閉じてください。これは重要です!)

    SDK とその依存関係をプロジェクトに追加する

    SDK とその依存関係をプロジェクトに追加する最も簡単な方法は、CocoaPods を使用することです。

    CocoaPods は、プロジェクトにライブラリを追加する依存関係マネージャです。必須ではありませんが、インストールが簡単になります。CocoaPods をインストールするには、 CocoaPods サイトの手順を参照してください。

    1. プロジェクトフォルダに、 Podfile (ファイル拡張子なし) というプレーンテキストファイルを作成します。

    2. テキストエディタを使用して、Podfile に次のコード行を追加して保存します。このコードは次のことを行います。

      source 'https://github.com/brightcove/BrightcoveSpecs.git'
      
      use_frameworks!
      
      platform :tvos, '11.0' # (or whatever version you want)
      
      target 'Simple-Video-Playback' do
      	pod 'Brightcove-Player-Core/dynamic', '6.3.11'
      end
    3. ターミナルセッションを開き、シンプルビデオ再生の Xcode プロジェクトフォルダーに移動します。

      Terminal session
      ターミナルセッション
    4. ターミナルセッションで、コマンド

      pod install

      を選択し、 Return キーを押して実行します。ターミナルに、Brightcove Player SDK がプロジェクトに追加されたことを示す一連のメッセージが表示されます。

    5. 最後の行に注意してください、これは重要です—この時点から、を開く必要があります Simple-Video-Playback.xcworkspace Xcodeのファイル、いいえ NS Simple-Video-Playback.xcodeproj ファイル。pod installこのコマンドにより、.xcworkspaceプロジェクト用にこのファイルが作成されます。

    動画アプリをコーディングする

    簡単なビデオ再生アプリのコードを作成します。

    アプリのオーディオ動作を設定する

    オーディオセッションは、アプリレベルでオーディオの動作を処理します。AvaudioSessionクラスの詳細については、こちらをご覧ください。

    このサンプルでは、再生カテゴリを使用します。これにより、画面がロックされ、Ring/Silent スイッチがサイレントに設定されている場合でも、オーディオが再生されます。動画を再生しているので、 MoviePlayback モードを使用します。それを簡単に保つために、我々は、アプリケーションデリゲートにこのコードを配置します。

    1. プロジェクトで、アプリケーションデリゲートファイル ( AppDelegate.swift ) を開きます。

    2. didFinishLaunchingWithOptions関数で、オーディオセッションカテゴリを設定するコードを追加します。AVFoundationフレームワークをインポートしてください。

      //
      //  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:.
        }
      
      }

    ビューコントローラを構築する

    View コントローラクラスを更新して、Brightcove再生 API から動画を再生します。

    View Controller クラスを更新して、リモート URL からビデオを再生します。

    1. プロジェクトで、ビューコントローラーファイル ( ViewController.swift ) を開きます。

    ネイティブ SDK のインポート

    iOS 用 Brightcove ネイティブプレーヤー SDK は Obj-C で書かれていますが、フレームワークモジュールを Swift プロジェクトにインポートするだけです。

    1. import既存のディレクティブの下に以下を追加して、Brightcove ネイティブプレーヤー SDK をインポートします。

      import BrightcovePlayerSDK

    あなたの価値でプロジェクトをカスタマイズする

    Video Cloud アカウントにアクセスするための値を追加します。

    1. importディレクティブの下に、次の値を追加します。

      • 12行目です:Brightcove再生 API ポリシーキーを定義します。この例では、 Brightcove 再生 API から返された動画を再生します。これは、Video Cloud ライブラリからコンテンツを取得するための最新かつ推奨される API です。ポリシーキーに慣れていない場合は、「ポリシー API の概要」を参照してください。

      • 13行目:ビデオクラウドアカウント ID を定義します
      • 14行目:ビデオクラウドビデオ ID を定義します

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

    ビュー変数を作成する

    1. ViewControllerクラスで、ビューの変数を追加します。

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

    プレイバックサービスの作成

    1. アカウント ID とポリシーキーを使用して Brightcove プレイバックサービスを定義する変数を作成します。これは、最初に呼び出されたときに初期化されます。

      スウィフトを初めて使用する場合は、レイジーストアードプロパティに関するガイドを確認してください

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

    再生コントローラを作成する

    1. Brightcoveの再生コントローラを定義する変数を作成します。これは、最初に呼び出されたときに作成されます。

      • 28-30行:デリゲートを設定し、自動アドバンスと自動再生機能をオンにします。

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

    プレイヤービューを定義する

    1. createTVPlayerView次の名前の関数を作成します。

      • 38-39行目:タブバーパネルが他のビューコントローラを表示できるように、プレーヤービューを定義します。
      • 42-44行目は次のとおりです。プレーヤービューを作成し、ビデオコンテナビューに追加します。
      • 47行目線:プレーヤービューを再生コントローラに関連付けます。
      • 49号線:プレーヤービューをメインビューのサブビューとして追加します。
      • 51号線:自動サイズ変更マスクをオフにします
      • 52-57行目線:自動レイアウトを使用して、プレーヤービューの動的拘束を定義します。

      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
      }()

    init 関数を作成する

    1. init次のように関数を作成します。
      • 64行目です:init () 関数のスーパークラスの実装を呼び出します。
      • 65行線:オプション:Video Cloud アカウント ID を分析に送信します。これは、BCOVVideoクラスをオーバーライドするか、Brightcove Playback サービスまたはカタログを使用しない場合にのみ必要です。

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

    ビューを読み込んだ後に処理する

    1. viewDidLoadメソッドで以下を追加します。

      • 72行目です:requestContentFromPlaybackService関数を呼び出します。この関数は次のステップで定義します。

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

    Brightcoveライブラリからコンテンツをリクエストする

    ビデオコンテンツを再生するには、カタログサービスからプレイリストをリクエストします

    1. requestContentFromPlaybackService次の名前の関数を作成します。

      • 75-76行:指定されたビデオ ID に基づいて、再生 API からビデオオブジェクトを返します。
      • 80 行:再生コントローラにビデオを追加します。
      • 82 行目では、プレイリストが返されなかった場合にエラーメッセージを書き込みます。
      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")")
          }
        }
      }

    再生コントローラを拡張する

    これにより、アプリがビデオ再生イベントをリッスンして応答できるようになります。

    1. ビューコントローラを拡張して Brightcove 再生コントローラデリゲートを含めて、再生イベントをリッスンします。Swift を初めて使用する場合は、拡張機能に関するガイドを確認してください

      // 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)
        }
      }

    残り

    1. 古いバージョンの 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! ] : [])
        }
      }

    コードを見る

    これで、ビューコントローラが完成しました。ここに完全なコードがあります:

    //
    //  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! ] : [])
      }
    }

    ネイティブ SDK のインポート

    iOS 用 Brightcove ネイティブプレーヤー SDK は Obj-C で書かれていますが、フレームワークモジュールを Swift プロジェクトにインポートするだけです。

    1. import既存のディレクティブの下に以下を追加して、Brightcove ネイティブプレーヤー SDK をインポートします。

      import BrightcovePlayerSDK

    あなたの価値でプロジェクトをカスタマイズする

    Video Cloud アカウント ID の値を追加します。

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

    ビュー変数を作成する

    1. ViewControllerクラスで、ビューの変数を追加します。

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

    再生コントローラを作成する

    1. Brightcoveの再生コントローラを定義する変数を作成します。これは、最初に呼び出されたときに作成されます。

      • 22-24 行:デリゲートを設定し、自動アドバンスと自動再生機能をオンにします。

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

    プレイヤービューを定義する

    1. playerView次のように作成します。

      • 32~33行目線:タブバーパネルが他のビューコントローラを表示できるように、プレーヤービューを定義します。
      • 36~38行目は次のとおりです。プレーヤービューを作成し、ビデオコンテナビューに追加します。
      • 41行目:プレーヤービューを再生コントローラに関連付けます。
      • 43行目線:プレーヤービューをメインビューのサブビューとして追加します。
      • 45行目線:自動サイズ変更マスクをオフにします
      • 46〜51行目は次のとおりです。自動レイアウトを使用して、プレーヤービューの動的拘束を定義します。

      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
      }()

    init 関数を作成する

    1. init次のように関数を作成します。
      • 58行線:init () 関数のスーパークラスの実装を呼び出します。
      • 59行:Video Cloud アカウント ID を分析に送信します。これにより、アプリがBrightcoveに登録されます。

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

    動画を再生する

    1. viewDidLoadメソッドで以下を追加します。

      • 67-69行目は次のとおりです。URL パスを使用してビデオソースの配列を作成します。
      • 71 行目では、ビデオ配列をコントローラの再生キューに追加します。このキューは、自動的に再生を開始するように設定されています。

      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://learning-services-media.brightcove.com/videos/hls/laughing_gull/laughing_gull.m3u8")!),
                      videoWithURL(url: NSURL(string: "https://learning-services-media.brightcove.com/videos/hls/greatblueheron/greatblueheron.m3u8")!)]
      
        playbackController?.setVideos(videoArray as NSFastEnumeration);
      }

    動画ソースの配信方法を設定する

    1. BCOVSources動画に属する配信方法を設定する関数を作成します。

      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!
      }

    再生コントローラを拡張する

    これにより、アプリがビデオ再生イベントをリッスンして応答できるようになります。

    1. ビューコントローラを拡張して Brightcove 再生コントローラデリゲートを含めて、再生イベントをリッスンします。Swift を初めて使用する場合は、拡張機能に関するガイドを確認してください

      // 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)
        }
      }

    残り

    1. 古いバージョンの 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! ] : [])
        }
      }

    コードを見る

    これで、ビューコントローラが完成しました。ここに完全なコードがあります:

    //
    //  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://learning-services-media.brightcove.com/videos/hls/laughing_gull/laughing_gull.m3u8")!),
            videoWithURL(url: NSURL(string: "https://learning-services-media.brightcove.com/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! ] : [])
      }
    }

    ストーリーボードビューを接続する

    接続しますMain.storyboardで表示videoContainerプロパティ。

    1. Xcodeで、Main.storyboardファイルを開きます。

    2. コンパニオンビューで、ビューコントローラシーンを展開し、[ ビューコントローラ ] メニューを展開し、 View オブジェクトを公開します。

      Storyboard view
      ストーリーボードビュー
    3. アシスタントエディタを表示し、ViewController.swiftファイルを開きます。

      Assistant editor
      アシスタントエディタ
    4. @IBOutletの隣にある開いた円を選択しvideoContainerView、それを Viewオブジェクトにドラッグしてこれらのコンポーネントを接続します。

      Connect the view
      ビューを接続する

    メディアセキュリティの管理

    アプリトランスポートセキュリティ (ATS) は、アプリと Web サービスの間の安全な接続を強制します。Apple の iOS 9 SDK のリリースで、 App Transport Security (ATS) と呼ばれる新機能が追加されました。

    1. アプリには、次のいずれかの状況が適用されます。

      • デフォルトでは、iOS 用 Brightcove ネイティブ SDK はソース選択ポリシーを使用して HTTP ソース上で HTTPS を選択するため、ATS を有効にしてアプリを構築できます。

        それで、あなたはあなたのアプリを実行する準備ができています。


      • HTTP ソースを使用している場合や、アプリで他の HTTP 呼び出しがある場合、次のエラーメッセージが表示されることがあります。

        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.

        つまり、ATS は有効ですが、システムが ATS 要件を満たすように構成されていません。この状況を修正するには、アプリトランスポートセキュリティ (ATS) を使用する」ドキュメントを参照してください。

    アプリを実行する

    アプリは、Apple TV または Xcode シミュレータでビルドして実行する準備ができました。リモコンを使用して、指定されたビデオを再生してナビゲートできるはずです。

    Apple TV sample
    アップルテレビのサンプル

    アップルのテレビのUIコントロール

    これで、ビデオ情報、字幕、オーディオのトップバー表示など、Apple TV の再生コントロールについてもっと学ぶ準備ができました。詳細については、「 tvOS 用のネイティブ SDK を使用する Apple TV UI コントロール」を参照してください。

    独自のカスタムトップバー項目ビューの作成方法の詳細については、 Apple TV Player のサンプルを参照してください


    ページの最終更新日04 Oct 2021