support Contact Support | system status System Status
Page Contents

    iOS: Working with Media Content

    In this topic, you will learn how to retrieve and play your videos using the Native SDK for iOS.

    Overview

    Video Cloud customers have access to their media data and metadata from Video Cloud Studio. Brightcove Player customers will supply the URL for their media content.

    Video Cloud customers

    As a Video Cloud customer, you can access your media data stored in Video Cloud Studio. For more information, see the Native Player SDK for iOS code samples.

    Retrieving media data

    You can retrieve your video and playlist data from your Video Cloud library by using the Playback API. For details about the API, see the Playback API Overview document.

    1. Use the BCOVPlaybackService class methods to retrieve your videos and playlists from Brightcove's Playback API. Your requests can supply the video/playlist ID or ReferenceID. This service will make the URL requests and parse the returned data.

    2. For this request, you will need a Policy Key. If you are not familiar with Policy Keys, see the Policy API Overview document.

      Here is an example of how to retrieve a video using the BCOVPlaybackService class in Swift:

      import UIKit
      import BrightcovePlayerSDK
      
      let kViewControllerPlaybackServicePolicyKey = "your policy key"
      let kViewControllerAccountID = "your account id"
      let kViewControllerVideoID = "your video id"
      
      class ViewController: UIViewController, BCOVPlaybackControllerDelegate {
      
      let sharedSDKManager = BCOVPlayerSDKManager.shared()
      let playbackService = BCOVPlaybackService(accountId: kViewControllerAccountID, policyKey: kViewControllerPlaybackServicePolicyKey)
      let playbackController :BCOVPlaybackController
      @IBOutlet weak var videoContainerView: UIView!
      
      required init?(coder aDecoder: NSCoder) {
        playbackController = (sharedSDKManager?.createPlaybackController())!
      
        super.init(coder: aDecoder)
      
        playbackController.delegate = self
        playbackController.isAutoAdvance = true
        playbackController.isAutoPlay = true
      }
      
      override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
      
        // Set up our player view. Create with a standard VOD layout.
        guard let playerView = BCOVPUIPlayerView(playbackController: self.playbackController, options: nil, controlsView: BCOVPUIBasicControlView.withVODLayout()) else {
            return
        }
      
        // Install in the container view and match its size.
        self.videoContainerView.addSubview(playerView)
        playerView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
          playerView.topAnchor.constraint(equalTo: self.videoContainerView.topAnchor),
          playerView.rightAnchor.constraint(equalTo: self.videoContainerView.rightAnchor),
          playerView.leftAnchor.constraint(equalTo: self.videoContainerView.leftAnchor),
          playerView.bottomAnchor.constraint(equalTo: self.videoContainerView.bottomAnchor)
        ])
      
        // Associate the playerView with the playback controller.
        playerView?.playbackController = playbackController
      
        requestContentFromPlaybackService()
      }
      
      func requestContentFromPlaybackService() {
        playbackService?.findVideo(withVideoID: kViewControllerVideoID, parameters: nil) { (video: BCOVVideo?, jsonResponse: [AnyHashable: Any]?, error: Error?) -> Void in
      
          if let v = video {
          	self.playbackController.setVideos([v] as NSArray)
          } else {
          	print("ViewController Debug - Error retrieving video: \(error?.localizedDescription ?? "unknown error")")
          }
        }
      }
      }

      For complete samples, see the following:

    3. The BCOVVideo object provides video metadata information as shown below:

      func requestContentFromPlaybackService() {
      playbackService?.findVideo(withVideoID: kViewControllerVideoID, parameters: nil) { (video: BCOVVideo?, jsonResponse: [AnyHashable: Any]?, error: Error?) -> Void in
      
        if let v = video {
      	print("video name: \(v.properties["name"] as AnyObject)")
        	print("video id: \(v.properties["id"] as AnyObject)")
        	print("video thumbnail: \(v.properties["thumbnail"] as AnyObject)")
        	print("video metadata: \(v.properties)")
      
        	self.playbackController.setVideos([v] as NSArray)
        } else {
        	print("ViewController Debug - Error retrieving video: \(error?.localizedDescription ?? "unknown error")")
        }
      }
      }

      The above print() methods return the following media information:

      Video object
      Video object

    Working with geo-filtered videos

    The Brightcove Player SDK for iOS supports geo-filtered videos.

    There are two ways you can add geo-filterings to your videos to control which countries they can (or cannot) be viewed in:

    In your iOS app, when you retrieve a video using Brightcove's BCOVPlaybackService class (Playback API) in a country which is geo-filtered for that video, you should see this message:

    Error Domain=kBCOVPlaybackServiceErrorDomain Code=3 "(null)"
    UserInfo={kBCOVPlaybackServiceErrorKeyAPIHTTPStatusCode=403,
    kBCOVPlaybackServiceErrorKeyAPIErrors=
    {type = immutable, count = 1, values = (
    0 : {type = immutable dict, count = 4,
    entries =>
    1 : message = {contents = "Access to this resource is forbidden by access policy."}
    2 : {contents = "client_geo"} = us
    4 : {contents = "error_subcode"} = {contents = "CLIENT_GEO"}
    6 : {contents = "error_code"} = {contents = "ACCESS_DENIED"}
    }
    )}}

    Brightcove Player customers

    As a Brightcove Player customer, you will supply the URL for your video assets.

    Here is an example of adding an array of videos to the playback controller and starting playback:

    import UIKit
    import BrightcovePlayerSDK
    
    let kViewControllerAccountID = "your account id" // For Brightcove registration
    
    class ViewController: UIViewController, BCOVPlaybackControllerDelegate {
      let sharedSDKManager = BCOVPlayerSDKManager.shared()
      let playbackController :BCOVPlaybackController
      @IBOutlet weak var videoContainerView: UIView!
    
      required init?(coder aDecoder: NSCoder) {
        // Create the Brightcove playback controller
        playbackController = (sharedSDKManager?.createPlaybackController())!
    
        super.init(coder: aDecoder)
    
        // Register your app with Brightcove
        playbackController.analytics.account = kViewControllerAccountID
    
        // Configure the player
        playbackController.delegate = self
        playbackController.isAutoAdvance = true
        playbackController.isAutoPlay = true
      }
    
      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://solutions.brightcove.com/bcls/assets/videos/Great_Horned_Owl.mp4")!),
                      videoWithURL(url: NSURL(string: "https://solutions.brightcove.com/bcls/assets/videos/Great_Blue_Heron.mp4")!)]
    
        // Set up the player view with a standard VOD layout.
        guard let playerView = BCOVPUIPlayerView(playbackController: self.playbackController, options: nil, controlsView: BCOVPUIBasicControlView.withVODLayout()) else {
          return
        }
    
        // Install in the container view and match its size.
        self.videoContainerView.addSubview(playerView)
        playerView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
          playerView.topAnchor.constraint(equalTo: self.videoContainerView.topAnchor),
          playerView.rightAnchor.constraint(equalTo: self.videoContainerView.rightAnchor),
          playerView.leftAnchor.constraint(equalTo: self.videoContainerView.leftAnchor),
          playerView.bottomAnchor.constraint(equalTo: self.videoContainerView.bottomAnchor)
        ])
    
        // Associate the playerView with the playback controller.
        playerView.playbackController = playbackController
    
        // Load the video array into the player and start video playback
        playbackController.setVideos(videoArray as NSArray)
        playbackController.play();
      }
    
      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!
      }
    }

    For complete samples, see the following:

    You now have a basic understanding of the Brightcove Player SDK for iOS. Next, you can walk through the steps of building an app which uses the Player SDK


    Page last updated on 12 Jun 2020