2017-03-31 20 views
1

Apple Fairplay Streaming 샘플 코드 (https://developer.apple.com/streaming/fps/)로 Fairplay 구현을 사용하고 있습니다. 온라인 페어 플레이 스트리밍과 관련된 부분 만 선택하려고했으나 지속성/오프라인 재생. 아래 코드에서 Fairplay가없는 비디오는 정상적으로 재생/일시 정지/탐색하지만, Fairplay 보호 된 비디오를 재생하면 비디오 트랙 만 올바르게 동작합니다.AVPlayer Fairplay HLS가 비디오 일시 중지시 오디오 재생을 멈추지 않습니다.

재생을 일시 중지해도 오디오 재생이 중지되지 않으며 오디오 트랙을 변경해도 이전 오디오 트랙이 중지되지 않으므로 둘 다 함께 재생되며 검색도 작동하지 않습니다.

아래의 도우미 클래스 외에도 Apple 클라이언트의 FairPlay Streaming Server SDK https://developer.apple.com/streaming/fps/에서 제공하는 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()을 두 번 호출했습니다. Grrr .. PlayerViewController의 프리젠 테이션이 완료되고 AssetPlaybackDelegate에서 콜백으로 두 번째로 실행되는 경우 AssetPlaybackManager의 KVO에 의해 트리거됩니다. 이 방법으로 플레이어 컨트롤이 비디오 재생을 중지했지만 대부분의 경우 두 번째 (오디오) 스트림이 계속 재생되었습니다. 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