概要
TVOS 用ネイティブ SDK は、FairPlay ストリーミングで HLS を使用したデジタル著作権管理 (DRM) 保護をサポートします。アカウントが DRM 対応で動的配信用に構成されている場合、動画は取り込むときに自動的に DRM 用にパッケージ化されます。
Fairplay で保護された動画のサポートは Brightcove Native SDK のコアフレームワークに統合されているため、アプリケーション証明書を読み込む必要はありません。詳細については、ネイティブプレーヤーの SDK を使用したコンテンツセキュリティ (DRM) ドキュメントを参照してください。
コードサンプル
Apple TV アプリに FairPlay コンテンツ保護を追加するには、次の手順に従います。
- Apple TV の基本的なサンプルアプリから始めます。
- アプリに FairPlay ライセンスコードを追加します。これは、基本的な FairPlay サンプルに記載されています。
ViewController.swift ファイルのコードは、次のようになります。
//
// ViewController.swift
// Fairplay-Video-Playback
//
// Copyright © 2019 Brightcove. All rights reserved.
//
import UIKit
import BrightcovePlayerSDK
// This example is for content using Dynamic Delivery. Because of this, you do NOT need to specify your FairPlay Application ID or the FairPlay Publisher ID.
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!
var playbackController: BCOVPlaybackController = BCOVPlayerSDKManager.sharedManager().createPlaybackController()
// With Dynamic Delivery, you can pass nil for the publisherId and applicationId
let fairPlayAuthProxy = BCOVFPSBrightcoveAuthProxy(withPublisherId: nil, applicationId: nil)
lazy var playerView: BCOVTVPlayerView? = {
// Set ourself 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
}()
lazy var playbackService: BCOVPlaybackService = {
return BCOVPlaybackService(withAccountId: playbackConfig.accountID, policyKey: playbackConfig.policyKey)
}()
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// With Dynamic Delivery, you don't need to load
// an application certificate. The FairPlay session will load an
// application certificate for you if needed.
// You can just load and play your FairPlay videos.
let sdkManager = BCOVPlayerSDKManager.sharedManager()
// Create chain of session providers
let psp = sdkManager.createBasicSessionProvider(withOptions: nil)
let fps = sdkManager.createFairPlaySessionProvider(withApplicationCertificate:nil,
authorizationProxy:self.fairPlayAuthProxy,
upstreamSessionProvider:psp)
// Create the playback controller
playbackController = sdkManager.createPlaybackController(withSessionProvider: fps, viewStrategy: nil)
// Configure the playback controller
playbackController.isAutoAdvance = false
playbackController.isAutoPlay = true
playbackController.delegate = self
// Link the playback controller to the Player View
playerView?.playbackController = playbackController
requestContentFromPlaybackService()
}
private func requestContentFromPlaybackService() {
let configuration = [BCOVPlaybackService.ConfigurationKeyAssetID: playbackConfig.videoID]
playbackService.findVideo(withConfiguration: configuration, queryParameters: nil) { [weak self] (video: BCOVVideo?, jsonResponse: Any?, error: Error?) -> Void in
if let _video = video {
// since "isAutoPlay" is true, setVideos will begin playing the content
self?.playbackController.setVideos([_video])
} else {
print("ViewController Debug - Error retrieving video: \(error?.localizedDescription ?? "unknown error")")
}
}
}
}
// 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! ] : [])
}
}
// 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)
}
}