2017-03-31 28 views
1

AppleのFairplayストリーミングサンプルコードhttps://developer.apple.com/streaming/fps/でFairplayの実装を使用していますが、オンラインフェアプレーストリーミングに関連する部分のみを選択しようとしました。オフライン再生。以下のコードでは、Fairplayのないビデオは通常再生/一時停止/シークしますが、Fairplayの保護されたビデオを再生すると、ビデオトラックのみが正しく動作します。AVPlayer Fairplay HLSは、ビデオが一時停止してもオーディオ再生を停止しません

再生を一時停止してもオーディオ再生は停止しません。オーディオトラックを変更しても前のオーディオトラックは停止しないため、両方が一緒に再生され、シークも機能しません。

以下、このヘルパークラスのほかに、私はFairPlayのストリーミングサーバSDK https://developer.apple.com/streaming/fps/のAppleのクライアントのサンプルコードからAssetLoaderDelegateAssetPlaybackManagerを持っていると私はDRMキープロバイダのためのSPC/CKCを処理するコードを更新しました。

FPSストリーミング用のオーディオを処理するコードの重要な部分を実装していませんでしたか?私を正しい方向に向けることができますか?どうもありがとう。

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()を2回呼び出しました... Grrr .. PlayerViewControllerのプレゼンテーションが完了し、AssetPlaybackDelegateからのコールバックで2度目はKVOによって引き起こされます。これはAssetPlaybackManagerです。この方法で、プレーヤーコントロールはビデオの再生を停止しましたが、おそらく2番目の(オーディオ)ストリームがまだ再生されていました。 playerReadyToPlayコールバックのplay()を削除しました。これで、Playerのすべてのコントロールが正常に動作します。私は一時停止、再開、シーク、オーディオトラックの変更ができます。

+0

iOSアプリケーションでFairPlayコンテンツを再生するコードが必要です。あなたは問題を解決するのに私を助けてくれますか? – Saty

+0

Fairplay Streaming Server SDKの一部としてAppleが提供するクライアントアプリケーションのサンプルコードがあります:https://developer.apple.com/streaming/fps/これが出発点です。 –

+0

@MartinKoles:禁止されているエラーが表示されているため、developer.apple.com/streaming/fpsからサンプルコードをダウンロードすることができません。私たちは、ブラウザを越えて動作するはずのプレーヤを実装しようとしており、暗号化されたコンテンツを再生する必要があります。私は 'WebKitNeedKey'イベントを取得したときに行う必要があるような詳細を知りたいので、2番目のWebKitNeedKeyイベントを無視できますか?もしあなたが持っている場合は、サンプルコードを提供していただけますか? – kadina

関連する問題