내 프로젝트에서 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)
}
은 ViewController의 초기화 프로그램입니까? –
그 avplayer는 하나의 인스턴스로, 하나의 옵저버는 모든 카드보기에서 비디오의 끝을 추적합니다. –
다음 비디오를로드 할 때 이전 비디오를 제거 했습니까? – Godinall