2017-02-03 1 views
0

내 플레이어 (AVPlayer) (버퍼링, 재생, 중지됨, 오류)의 상태를 얻고 해당 상태 (잠금 화면의 플레이어 포함)에 따라 UI를 업데이트하는 방법을 알고 싶습니다. 내가 정확히 그것을 어떻게해야합니까?신속한 AVPlayer 상태 수신기

다음 레이블이 포함될 수 있습니다 : "버퍼링 중 ...", "재생 중", "중지됨"또는 "오류".

MediaPlayer를 :

import Foundation 
import AVFoundation 

class MediaPlayer { 

    static let sharedInstance = MediaPlayer() 
    fileprivate var player = AVPlayer(url: URL(string: "my_hls_stream_url_here")!) 
    fileprivate var isPlaying = false 

    func play() { 
     player.play() 
     isPlaying = true 
    } 

    func pause() { 
     player.pause() 
     isPlaying = false 
    } 

    func toggle() { 
     if isPlaying == true { 
      pause() 
     } else { 
      play() 
     } 
    } 

    func currentlyPlaying() -> Bool { 
     return isPlaying 
    } 

} 

PlayerViewController :

class PlayerViewController: UIViewController { 

    @IBOutlet weak var label: UILabel! 
    @IBAction func playStopButtonAction(_ sender: UIButton) { 
     MediaPlayer.sharedInstance.toggle() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     label.text = "Disconnected" 

     do { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
      try AVAudioSession.sharedInstance().setActive(true) 

      print("Audio session ok\n") 
     } catch { 
      print("Error: Audio session.\n") 
     } 

     // Show only play/pause button on the lock screen 
     if #available(iOS 9.1, *) { 

      let center = MPRemoteCommandCenter.shared() 

      [center.previousTrackCommand, center.nextTrackCommand, center.seekForwardCommand, center.seekBackwardCommand, center.skipForwardCommand, center.skipBackwardCommand, center.ratingCommand, center.changePlaybackRateCommand, center.likeCommand, center.dislikeCommand, center.bookmarkCommand, center.changePlaybackPositionCommand].forEach { 
       $0.isEnabled = false 
      } 

      center.togglePlayPauseCommand.addTarget { (commandEvent) -> MPRemoteCommandHandlerStatus in 
       MediaPlayer.sharedInstance.toggle() 
       return MPRemoteCommandHandlerStatus.success 
      } 

      center.playCommand.addTarget { (commandEvent) -> MPRemoteCommandHandlerStatus in 
       MediaPlayer.sharedInstance.play() 
       return MPRemoteCommandHandlerStatus.success 
      } 

      center.pauseCommand.addTarget { (commandEvent) -> MPRemoteCommandHandlerStatus in 
       MediaPlayer.sharedInstance.pause() 
       return MPRemoteCommandHandlerStatus.success 
      } 

     } else { 
      // Fallback on earlier versions 
      print("Error (MPRemoteCommandCenter)") 
     } 


    } 


    override func remoteControlReceived(with event: UIEvent?) { 
     guard let event = event else { 
      print("No event\n") 
      return 
     } 
     guard event.type == UIEventType.remoteControl else { 
      print("Another event received\n") 
      return 
     } 
     switch event.subtype { 
     case UIEventSubtype.remoteControlPlay: 
      print("'Play' event received\n") 
     case UIEventSubtype.remoteControlPause: 
      print("'Pause' event received\n") 
     case UIEventSubtype.remoteControlTogglePlayPause: 
      print("'Toggle' event received\n") 
     default: 
      print("\(event.subtype)\n") 
     } 
    } 

} 

답변

0

난 당신이 AVPlayertimeControlStatus 속성을 사용할 수 있다고 생각

기본적으로, 나는 다음 있습니다. to the doc에 따르면 paused, waitingToPlayAtSpecifiedRate 일 수 있으며 기본적으로 buffering 또는 playing이라고합니다.

당신이 정말로 error 상태를해야하는 경우가 errorproperty을 관찰 할 수 있었다 또는 statuspropertyfailed로 설정되어 있는지 여부를 확인합니다.

이러한 속성에 대한 간단한 KVO 관측자는 트릭을 수행합니다.

0

AVPlayer의 "상태"속성을 사용하여 시작할 수 있습니다. 그것은 (이 문서에서 직접 촬영) 다음과 같은 값을 포함하는 열거입니다 :

  1. '알 수없는' : 그것은로드 시도하지 않았기 때문에 플레이어의 상태가 아직 알려지지 않은 것을 나타냅니다 재생을위한 새로운 미디어 리소스.

  2. 'readyToPlay' : 플레이어가 AVPlayerItem 인스턴스를 재생할 준비가되었음을 나타냅니다.

  3. '오류' : 플레이어가 오류로 인해 AVPlayerItem 인스턴스를 더 이상 재생할 수 없음을 나타냅니다.

콘텐츠가 실제로 재생되고 있는지 어떻게 알 수 있듯이 부분적으로 구현 된 것으로 보이는 것처럼 부울 검사를 사용할 수 있습니다. 일시 중지 및 중지의 경우 파일을 일시 중지 상태로 유지하고 파일을 삭제하여 두 파일을 구별 할 수 있습니다. 버퍼링

, 열거 이론적가 첨부되는 파일입니다하지만 (즉, 버퍼링)을 재생하는 것은 매우 준비가되지 않은 것을 의미한다 그 다음 readyToPlay알 수없는 또는 되지 않습니다.

+0

나는 당신이 말한대로 해봤지만 항상 "readyToPlay"를 얻는다. (1)/내가 어떻게 할 수 있는지 정확하게 보여줄 수 있습니까? KVO 사용 (# 3) : https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-XID_8 – user5195185