最近、仕事で BrightcovePlayer SDK を触る機会がありました。
その際ネット上の関連サンプルを調べたところ、ほとんど Objective-C で書かれたものだったため、今回は Swift でカスタマイズする方法についてまとめてみました。
SDK の追加
BrightcovePlayer SDK がサポートする iOS バージョンは iOS8 以降です。
SDK を CocoaPods から追加する場合、 CocoaPods のバージョンは 1.0 以降が必要です。
Podfile は以下のように書きます。
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' use_frameworks! target 'iOS_Customize_Player_UI' do pod 'Brightcove-Player-SDK/dynamic' end
動画の再生
こちらのサンプルを参照して、 Swift のソースコードを作成します。
そのコードが以下になります。
import BrightcovePlayerSDK class ViewController: UIViewController, BCOVPlaybackControllerDelegate, BCOVPUIPlayerViewDelegate { @IBOutlet weak var videoView: UIView! var catalogService: BCOVCatalogService! public var playbackController: BCOVPlaybackController! var playerView: BCOVPUIPlayerView! private static let kViewControllerCatalogToken = "YOUR_TOKEN" private static let kPlaylistID = "YOUR_ID" override func viewDidLoad() { super.viewDidLoad() let manager: BCOVPlayerSDKManager = BCOVPlayerSDKManager.shared() self.playbackController = manager.createPlaybackController() self.playbackController.delegate = self self.playbackController.isAutoAdvance = true self.playbackController.isAutoPlay = true self.playbackController.setAllowsExternalPlayback(true) let options = BCOVPUIPlayerViewOptions.init() options.presentingViewController = self options.hideControlsInterval = 120.0 options.hideControlsAnimationDuration = 1.0 let controlView = BCOVPUIBasicControlView.init() self.playerView = BCOVPUIPlayerView.init(playbackController: nil, options: options, controlsView: controlView) self.playerView.playbackController = self.playbackController self.playerView.delegate = self self.playerView.frame = self.videoView.bounds self.playerView.autoresizingMask = [.flexibleWidth, .flexibleHeight] self.videoView.addSubview(self.playerView) //再生 self.catalogService = BCOVCatalogService.init(token: ViewController.kViewControllerCatalogToken) self.catalogService.findPlaylist( withPlaylistID: ViewController.kPlaylistID, parameters: [:], completion: { playlist,jsonResponse, error in guard playlist != nil else { return } self.playbackController.setVideos(playlist) } ) } }
この時点でプレーヤの UI は未設定なので動画画面には何も表示されず、ただ指定した動画だけが流れるようになっています。
デフォルト UI
BrightcovePlayer のデフォルトで 3 種類の layout が用意されています。 そのデフォルトレイアウトは BCOVPUIPlayerView の controlsView プロパティで設定することができます。
let newControlLayout = BCOVPUIControlLayout.basicVOD() self.playerView.controlsView.layout = newControlLayout
デフォルト UI は以下に示す 3 種類の見た目になります。
BCOVPUIControlLayout.basicVOD()
BCOVPUIControlLayout.basicLive()
BCOVPUIControlLayout.basicLiveDVR()
カスタマイズ UI の作成
今回は UIView のコントロール画面を作って、それを動画画面に addSubview で上に載せるという UI を作成しようと思います。 そのために ControlsView.xib というファイルを作りました。
ControlsView の初期化はクラス ControlsView の中で、
static func newInstance() -> ControlsView { return UINib(nibName: "ControlsView", bundle: nil) .instantiate(withOwner : nil, options: nil).first as! ControlsView }
で実現します。
カスタマイズ UI を追加すること自体は難しくないと思いますが、 UI の各ボタンが操作されたときにプレーヤにどうやってその反応を通達するのかという問題があります。 それの解決方法は BCOVPlaybackController#addSessionConsumer : で、カスタマイズ UI のクラスのインスタンスを登録します。
//デフォルト UI を非表示にする let newControlLayout: BCOVPUIControlLayout? = nil self.playerView.controlsView.layout = newControlLayout let controlsView = ControlsView.newInstance() self.videoView.addSubview(controlsView) self.playbackController.add(controlsView)
こうすると、 playbackSession : で始まるものは BCOVPlaybackSession プロトコルに準拠したインスタンスが取れます。
func playbackSession(_ session: BCOVPlaybackSession!, didChangeDuration duration: TimeInterval) { let player: AVPlayer = session.player }
ここでなんと! BCOVPlaybackSession#player で AVPlayer の参照が取れます! AVPlayer の使い方について言及することはやめておきますが、これで色々とプレーヤに対して指示を出すことができるようになりました。
まとめ
いかがだったでしょうか。 思ったより簡単に使えるライブラリですね。
BrightcovePlayer SDK について興味のある方、ぜひ 以下の公式サイトをご参照ください。 SDK に統合された各プラグインの基本機能を示すサンプルもあります。