2016-07-19 2 views
2

내 프로젝트에서 Kolada보기 (here)을 사용하여 카드 스택을 표시하고 각 카드에 비디오가 표시됩니다. 때로는 다음 비디오를로드 할 때 내 AVPlayer이 비디오 재생에 실패하면 첫 번째 프레임 만 표시되고 멈 춥니 다. 나는 여러 개의 관찰자를 사용하여 비디오가 실제로 재생 될 때를 추적합니다. 재생이 계속되면 추적합니다. 관측자가 제대로 할당을 해제하지 않은 경우 재생이 중단 될 수 있습니까? 그렇지 않은 경우 AVPlayer의 재생이 멈추게하려면 어떻게해야합니까?AVPlayer가 재생되지 않습니다.

업데이트 : playbackLikelyToKeepUp은 가끔 호출되지 않으며, 이런 일이 발생하면 AVPlayer은 플레이어 항목을 변경하더라도 다시 호출하지 않습니다. 따라서 비디오 재생이 다시 시작되지 않습니다.

init(frame: CGRect, mediaURL: NSURL, thumbURL: NSURL?, isLoop: Bool) { 
    self.mediaURL = mediaURL 
    self.isLoop = isLoop 

    let asset = AVAsset(URL: mediaURL) 
    let item = AVPlayerItem(asset: asset) 
    player = AVPlayer(playerItem: item) 
    player!.actionAtItemEnd = .None 

    super.init(frame: frame) 

    asset.loadValuesAsynchronouslyForKeys(["duration"], completionHandler: {() -> Void in 
     var error: NSError? 
     let keyStatus: AVKeyValueStatus = asset.statusOfValueForKey("duration", error: &error) 
     switch (keyStatus) { 

     case .Loaded: 
      let duration: CMTime = asset.duration 
      self.currentDuration = duration 
      self.delegate?.updateDuration() 
     default: 
      break 
     } 

    }) 

    NSNotificationCenter.defaultCenter().addObserver(
     self, 
     selector: #selector(MediaPlayerView.playerItemDidReachEnd(_:)), 
     name: AVPlayerItemDidPlayToEndTimeNotification, 
     object: player!.currentItem) 

    self.timeObserver = self.player!.addPeriodicTimeObserverForInterval(CMTimeMakeWithSeconds(1.0/30.0, Int32(NSEC_PER_SEC)), queue: nil, usingBlock: { 
     [weak self] (time) -> Void in 

     if time.value > 0 { 
      self?.spinnerView?.stopAnimating() 
      if(self?.player != nil){ 
       if(self?.player!.rate > 0){ 
        self?.placeholderImageView?.hidden = true 
       } 
      } 

      let timeInSeconds = CMTimeGetSeconds(time) 
      self?.delegate?.playbackReachedTime(timeInSeconds) 

     } 
    }) 

    player!.currentItem?.addObserver(self, forKeyPath: playbackLikelyToKeepUp, options: .New, context: &observationContext) 
    player!.addObserver(self, forKeyPath: "rate", options: .New, context: &observationContext) 

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(MediaPlayerView.playerIsTapped(_:))) 
    addGestureRecognizer(tapGesture) 
} 
+0

은 ViewController의 초기화 프로그램입니까? –

+0

그 avplayer는 하나의 인스턴스로, 하나의 옵저버는 모든 카드보기에서 비디오의 끝을 추적합니다. –

+0

다음 비디오를로드 할 때 이전 비디오를 제거 했습니까? – Godinall

답변

2

AVPlayer 객체의 기존 인스턴스에서 replaceCurrentItemWithPlayerItem을 사용하고이 값을 nil로 설정하면 제거됩니다.

+0

골드 대답 .... –

관련 문제