AVPlayerItem视频合成冻结IOS8

AVPlayerItem视频合成冻结IOS8,ios8,avplayer,freeze,avmutablecomposition,Ios8,Avplayer,Freeze,Avmutablecomposition,我正在用AVPlayer播放AVMutableVideoComposition,从IOS8开始,一切都很好。 但是现在视频开始播放,4秒或5秒后停止,比如缓冲或类似的东西,声音继续播放,当视频结束时,AVPlayer循环播放,不停播放 我没有解决这个问题的线索 任何帮助都将不胜感激 谢谢你这里也一样,我不知道它是否可以算作一个答案,但无论如何,只要使用 [AVPlayer seekToTime:AVPlayer.currentItem.duration]自己做第一个循环,避免玩家停止。这是我发现

我正在用AVPlayer播放AVMutableVideoComposition,从IOS8开始,一切都很好。 但是现在视频开始播放,4秒或5秒后停止,比如缓冲或类似的东西,声音继续播放,当视频结束时,AVPlayer循环播放,不停播放

我没有解决这个问题的线索

任何帮助都将不胜感激


谢谢你

这里也一样,我不知道它是否可以算作一个答案,但无论如何,只要使用
[AVPlayer seekToTime:AVPlayer.currentItem.duration]自己做第一个循环,避免玩家停止。这是我发现的唯一方法。

我遇到了同样的问题,我用这种方法解决了它。。 而不是直接将视频合成应用于AVPlayerItem。。我使用AVAssetExportSession导出视频以应用视频合成,这反过来会给我一个Url,其中包含应用了所有视频合成的视频,现在我可以使用此内容Url在AVPlayer上播放视频。。 这很有魅力。。 导出视频需要时间,但由于现在渲染视频合成并不是在进行中,因此工作会很顺利

以下代码可用于导出视频

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);

  }
});
}];

我也有同样的问题,但我找到了解决办法

您应该在playerItem的状态更改为.ReadyToPlay后播放

我也回答说,这个问题和你的问题是类似的

请参阅下文

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()
}       
func startVideoPlayer(){
让playerItem=AVPlayerItem(资产:self.composition!)
playerItem.videoComposition=self.videoComposition!
let player=AVPlayer(playerItem:playerItem)
player.actionAtItemEnd=.None
videoPlayerLayer=AVPlayerLayer(播放器:播放器)
videoPlayerLayer!.frame=self.bounds
/*添加playerItem的观察者*/
player.addObserver(self,forKeyPath:“player.currentItem.status”,选项:。新建,上下文:nil)
NSNotificationCenter.defaultCenter().addObserver(self,选择器:“PlayerItemDidReachen:”,名称:AVPlayerItemDidPlayToEndTimeNotification,对象:playerItem);
self.layer.addSublayer(videoPlayerLayer!)
}
重写func observeValueForKeyPath(键路径:String?,对象对象的类型:AnyObject?,更改:[String:AnyObject]?,上下文:UnsafeMutablePointer){
如果keyPath!=nil&&keyPath!==“player.currentItem.status”{
如果让newValue=更改?[NSKeyValueChangeNewKey]{
如果AVPlayerStatus(rawValue:newValue as!Int)=.ReadyToPlay{
playVideo()/*状态更改为.ReadyToPlay后播放*/
}
}
}否则{
super.observeValueForKeyPath(键路径,of对象:object,change:change,context:context)
}
}    
func PlayerItemDidReachen(通知:NSNotification){
让playerItem=notification.object为!AVPlayerItem
playerItem.seekToTime(kCMTimeZero)
播放视频()
} 
func播放视频(){
videoPlayerLayer?.player!.play()
}       

我也遇到了同样的问题。可能是IOS 8的问题。我仍然没有得到任何解决方案。。。。。!!!