2017-03-31 4 views
1

J'utilise l'implémentation de Fairplay selon l'exemple de code Fairplay Streaming d'Apple au https://developer.apple.com/streaming/fps/, bien que j'ai essayé de ne choisir que les parties liées à la diffusion en ligne Fairplay, pas la persistance/lecture hors ligne. Dans le code ci-dessous une vidéo sans Fairplay joue/pause/recherche normalement, mais quand je joue une vidéo protégée par Fairplay, seule la piste vidéo se comporte correctement. La suspension de la lecture n'arrêtera pas la lecture audio, la modification de la piste audio n'arrêtera pas la piste audio précédente, donc les deux jouent ensemble et peut-être que la recherche ne fonctionne pas non plus.AVPlayer Fairplay HLS n'arrêtera pas la lecture audio lorsque la vidéo est en pause

Outre cette classe d'aide ci-dessous, j'ai AssetLoaderDelegate et AssetPlaybackManager à partir de l'exemple de code client d'Apple FairPlay Streaming Server SDK https://developer.apple.com/streaming/fps/ et je l'ai mis à jour le code pour gérer la CPS/CKC pour notre fournisseur de clés DRM. Ai-je manqué d'implémenter une partie importante du code pour gérer l'audio pour le streaming FPS? Pouvez-vous s'il vous plaît me diriger dans la bonne direction? Merci beaucoup.

class PlayHelper { 

    static let shared = PlayHelper() 

    fileprivate var playerViewController: PlayerViewController? 

    init() { 

     AssetPlaybackManager.sharedManager.delegate = self 
    } 

    // Play video without DRM 
    func playVideo(from urlString: String, at context: UIViewController) { 

     guard let videoURL = URL(string: urlString) else { 
      Log.error("Video URL can't be created from string: \(urlString)") 
      return } 

     let player = AVPlayer(url: videoURL) 

     let playerViewController = PlayerViewController() 
     playerViewController.player = player 

     context.present(playerViewController, animated: true) { 
      playerViewController.player?.play() 
     } 
    } 

    // Play FPS video 
    func playFpsVideo(with asset: AVURLAsset, at context: UIViewController) { 

     // Cleanup, should be done when playerViewController is actually dismissed 
     if self.playerViewController != nil { 
      // The view reappeared as a results of dismissing an AVPlayerViewController. 
      // Perform cleanup. 
      AssetPlaybackManager.sharedManager.setAssetForPlayback(nil) 
      self.playerViewController?.player = nil 
      self.playerViewController = nil 
     } 

     let item = AVPlayerItem(asset: asset) 

     let player = AVPlayer(playerItem: item) 

     // Customize player 
     player.appliesMediaSelectionCriteriaAutomatically = true 

     let playerViewController = PlayerViewController() 
     playerViewController.player = player 

     self.playerViewController = playerViewController 

     context.present(playerViewController, animated: true) { 
      playerViewController.player?.play() 
     } 
    } 

    // Stop video 
    func stop() { 

     // Cleanup, should be done when playerViewController is dismissed 
     if self.playerViewController != nil { 

      // Results of dismissing an AVPlayerViewController, perform cleanup 
      AssetPlaybackManager.sharedManager.setAssetForPlayback(nil) 
      self.playerViewController?.player = nil 
      self.playerViewController = nil 
     } 
    } 
} 


// MARK: - Extend `PlayHelper` to conform to the `AssetPlaybackDelegate` protocol 

extension PlayHelper: AssetPlaybackDelegate { 

    func streamPlaybackManager(_ streamPlaybackManager: AssetPlaybackManager, playerReadyToPlay player: AVPlayer) { 

     player.play() 
    } 

    func streamPlaybackManager(_ streamPlaybackManager: AssetPlaybackManager, playerCurrentItemDidChange player: AVPlayer) { 

     guard let playerViewController = playerViewController, player.currentItem != nil else { return } 

     playerViewController.player = player 
    } 
} 

Je peux aussi fournir le code dans AssetLoaderDelegate et AssetPlaybackManager si nécessaire.

Répondre

1

Mon mauvais. J'ai appelé play() deux fois dans le code ci-dessus ... Grrr .. Une fois lorsque la présentation du PlayerViewController terminé et la deuxième fois dans le rappel de AssetPlaybackDelegate qui est déclenché par KVO dans AssetPlaybackManager. De cette façon, les commandes du lecteur ont cessé de lire la vidéo, mais très probablement un deuxième flux (audio) était encore en train de jouer. J'ai supprimé le rappel play() dans playerReadyToPlay et maintenant tous les contrôles dans le lecteur fonctionnent comme prévu. Je peux faire une pause, reprendre, chercher, changer les pistes audio.

+0

Je veux que le code joue au contenu FairPlay dans l'application iOS. Pourriez-vous s'il vous plaît m'aider à résoudre le problème? – Saty

+0

Il existe un bon exemple de code de l'application client fournie par Apple dans le cadre du SDK Fairplay Streaming Server: https://developer.apple.com/streaming/fps/ Cela devrait être votre point de départ. –

+0

@MartinKoles: Je ne parviens pas à télécharger l'exemple de code à partir de developer.apple.com/streaming/fps, car il montre une erreur interdite. Nous essayons de mettre en œuvre un lecteur qui devrait fonctionner à travers les navigateurs et il devrait jouer le contenu crypté. Je voudrais savoir les détails comme ce que nous devons faire quand nous obtenons l'événement «WebKitNeedKey», pouvons-nous ignorer le deuxième événement WebKitNeedKey. Pourriez-vous s'il vous plaît fournir l'exemple de code si vous avez? – kadina