概覽
適用於tvOS的Native SDK使用帶有FairPlay Streaming的HLS支持數字版權管理(DRM)保護。如果您的帳戶啟用了DRM功能並配置為動態投放,則您的視頻在提取後會自動打包為DRM。
由於對受FairPlay保護的視頻的支持已集成到Brightcove Native SDK的核心框架中,因此您無需加載應用程序證書。有關詳細信息,請參閱使用 Native Player SDK 的內容安全 (DRM)文檔。
程式碼範例
要將FairPlay內容保護添加到您的Apple TV應用程序,請按照下列步驟操作:
你的代碼視圖控制器.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.shared().createPlaybackController()
var fairPlayAuthProxy: BCOVFPSBrightcoveAuthProxy?
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(accountId: 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.
// With Dynamic Delivery, you can pass nil for the publisherId and applicationId
self.fairPlayAuthProxy = BCOVFPSBrightcoveAuthProxy(publisherId: nil,
applicationId: nil)
let sdkManager = BCOVPlayerSDKManager.sharedManager()
// Create chain of session providers
let psp = sdkManager?.createBasicSessionProvider(with:nil)
let fps = sdkManager?.createFairPlaySessionProvider(withApplicationCertificate:nil,
authorizationProxy:self.fairPlayAuthProxy!,
upstreamSessionProvider:psp)
createSampleTabBarItemView()
// Create the playback controller
playbackController = (sdkManager?.createPlaybackController(with: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 createSampleTabBarItemView() {
guard let playerView = playerView, var topTabBarItemViews = playerView.settingsView.topTabBarItemViews else {
return
}
let sampleTabBarItemView = SampleTabBarItemView(size: CGSize.init(width: 620, height: 200), playerView: playerView)
// Insert our new tab bar item view at the end of the top tab bar
topTabBarItemViews.append(sampleTabBarItemView)
playerView.settingsView.topTabBarItemViews = topTabBarItemViews
}
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: - 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)
}
}