2017-03-31 168 views
1

虽然我试图仅选择与Online Fairplay Streaming相关的部分,但不是持久性/离线播放。在下面的代码中,没有Fairplay的视频播放/暂停/寻找正常,但是当我播放Fairplay保护的视频时,只有视频轨道的行为正确。当视频暂停时,AVPlayer Fairplay HLS不会停止音频播放

暂停播放不会停止音频播放,更改音轨不会停止以前的音轨,因此两个播放在一起,也许寻找也不起作用。

而且低于此辅助类,我有AssetLoaderDelegateAssetPlaybackManager从FairPlay的流媒体服务器SDK https://developer.apple.com/streaming/fps/的苹果客户端示例代码,我已经更新了代码来处理SPC/CKC我们的DRM密钥提供者。

我是否想要实现一些重要部分的代码来处理FPS Streaming的音频?你能指点我正确的方向吗?非常感谢。

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 
    } 
} 

如果需要,我还可以在AssetLoaderDelegateAssetPlaybackManager中提供代码。

回答

1

我的不好。我在上面的代码中调用了play()两次... Grrr ..一次当PlayerViewController的表示完成时,第二次从AssetPlaybackDelegate回调,由KVO在AssetPlaybackManager触发。这样玩家控制停止播放视频,但很可能第二个(音频)流仍然在那里播放。我删除了playerReadyToPlay回调中的play(),现在播放器中的所有控件都按预期工作。我可以暂停,恢复,寻找,更改音轨。

+0

我想让代码在iOS应用中播放FairPlay内容。你能帮我解决这个问题吗? – Saty

+0

作为Fairplay Streaming Server SDK的一部分,Apple提供了一个很好的客户端应用示例代码:https://developer.apple.com/streaming/fps/这应该是您的出发点。 –

+0

@MartinKoles:我无法从developer.apple.com/streaming/fps下载示例代码,因为它显示禁止的错误。我们试图实现一个应该在浏览器上工作的播放器,并且它应该播放加密的内容。我想知道当我们得到'WebKitNeedKey'事件时我们需要做的细节,我们可以忽略第二个WebKitNeedKey事件。如果您有,请提供示例代码吗? – kadina