2014-10-04 36 views
5

Tôi đang phát AVMutableVideoComposition với AVPlayer và vì IOS8 mọi thứ đều hoàn toàn ổn. Nhưng bây giờ video bắt đầu phát và sau 4 hoặc 5 giây, nó dừng lại, giống như bộ đệm hoặc thứ gì đó như vậy, âm thanh tiếp tục phát và khi video kết thúc vòng AVPlayer và phát lại mà không cần dừng.AVPlayerMục videoVị trí đóng băng IOS8

Tôi không có đầu mối để khắc phục vấn đề này.

Bất kỳ trợ giúp sẽ được đánh giá cao,

Cảm ơn bạn

+1

Tôi gặp vấn đề tương tự. Có thể vấn đề của nó với IOS 8. Tôi vẫn chưa nhận được giải pháp nào ..... !!! –

Trả lời

0

Tôi gặp vấn đề tương tự nhưng tôi đã nhận được giải pháp.

Bạn nên phát sau khi trạng thái của playerItem được đổi thành .ReadyToPlay.

Tôi cũng đã trả lời here, vấn đề đó tương tự như vấn đề của bạn.

Vui lòng xem như bên dưới.

func startVideoPlayer() { 
    let playerItem = AVPlayerItem(asset: self.composition!) 
    playerItem.videoComposition = self.videoComposition! 

    let player = AVPlayer(playerItem: playerItem) 
    player.actionAtItemEnd = .None 

    videoPlayerLayer = AVPlayerLayer(player: player) 
    videoPlayerLayer!.frame = self.bounds 

    /* add playerItem's observer */ 
    player.addObserver(self, forKeyPath: "player.currentItem.status", options: .New, context: nil) 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem); 

    self.layer.addSublayer(videoPlayerLayer!) 
} 

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
    if keyPath != nil && keyPath! == "player.currentItem.status" { 
     if let newValue = change?[NSKeyValueChangeNewKey] { 
      if AVPlayerStatus(rawValue: newValue as! Int) == .ReadyToPlay { 
       playVideo() /* play after status is changed to .ReadyToPlay */ 
      } 
     } 
    } else { 
     super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
    } 
}  

func playerItemDidReachEnd(notification: NSNotification) { 
    let playerItem = notification.object as! AVPlayerItem 
    playerItem.seekToTime(kCMTimeZero) 

    playVideo() 
} 

func playVideo() { 
    videoPlayerLayer?.player!.play() 
}  
0

Cùng ở đây, không biết nếu nó có thể được đếm như một câu trả lời nhưng dù sao, chỉ cần sử dụng [AVPlayer seekToTime:AVPlayer.currentItem.duration]; để làm cho vòng đầu tiên của mình và để tránh AVPlayer dừng lại. Đó là cách duy nhất tôi tìm thấy.

0

Tôi đã có cùng một vấn đề và tôi giải quyết nó theo cách này .. Thay vì áp dụng videoComposition để AVPlayerItem trực tiếp .. i xuất khẩu video của tôi sử dụng AVAssetExportSession để áp dụng videoComposition, do đó mang lại cho tôi một Url với một video có tất cả videoComposition của tôi được áp dụng và bây giờ tôi có thể sử dụng contentURL này để phát video trên AVPlayer .. Điều này hoạt động như một nét duyên dáng .. Xuất video sẽ mất thời gian nhưng hiện tại việc hiển thị thành phần video không diễn ra khi di chuyển, nó sẽ hoạt động trơn tru ..

Có thể sử dụng mã sau để xuất video ..

AVAssetExportSession *export = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPreset1280x720]; 

export.videoComposition = videoComposition; 
export.outputURL = [NSURL fileURLWithPath:[[NSTemporaryDirectory() stringByAppendingPathComponent:[NSUUID new].UUIDString] stringByAppendingPathExtension:@"MOV"]]; 
export.outputFileType = AVFileTypeQuickTimeMovie; 
export.shouldOptimizeForNetworkUse = YES; 

[export exportAsynchronouslyWithCompletionHandler:^{ 
dispatch_async(dispatch_get_main_queue(), ^{ 
    if (export.status == AVAssetExportSessionStatusCompleted) { 

    completionHander(export.outputURL, nil); 

    } else { 

    completionHander(nil, export.error); 

    } 
}); 
}];