개요
tvOS용 네이티브 SDK는 FairPlay 스트리밍과 함께 HLS를 사용하여 디지털 저작권 관리 (DRM) 보호를 지원합니다. 계정이 DRM이 활성화되고 Dynamic Delivery에 대해 구성되어 있으면 비디오를 수집 할 때 자동으로 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.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)
}
}