Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa touch 从队列中删除项目时,AVQueuePlayer播放冻结_Cocoa Touch_Avplayer_Avqueueplayer - Fatal编程技术网

Cocoa touch 从队列中删除项目时,AVQueuePlayer播放冻结

Cocoa touch 从队列中删除项目时,AVQueuePlayer播放冻结,cocoa-touch,avplayer,avqueueplayer,Cocoa Touch,Avplayer,Avqueueplayer,我成功地使用了队列和游戏。然而,当我通过调用方法改变玩家队列时,问题就开始了。我的假设是,只要我不触摸当前播放的项目,我就可以自由地修改这个队列,但似乎每次调用都会冻结播放一段时间 考虑以下代码段: + (void)setBranch:(BranchType)bType { NSArray* items = [dynamicMusicPlayer items]; for (AVPlayerItem* item in [items copy]) { if (item

我成功地使用了队列和游戏。然而,当我通过调用方法改变玩家队列时,问题就开始了。我的假设是,只要我不触摸当前播放的项目,我就可以自由地修改这个队列,但似乎每次调用都会冻结播放一段时间

考虑以下代码段:

+ (void)setBranch:(BranchType)bType {
    NSArray* items = [dynamicMusicPlayer items];
    for (AVPlayerItem* item in [items copy]) {
        if (item == dynamicMusicPlayer.currentItem) {
            continue; // don't remove the currently played item
        }
        [dynamicMusicPlayer removeItem:item];
    }
    [self queueNextBlockFromBranchType:bType];
    currentBranch = bType;
}
你可以从中猜到,这是一款动态音乐播放器,可以播放来自不同分支的音乐。因此,基本上,当我对删除项目的行进行注释时,它可以播放所有内容,但很明显,分支不会在我想要的时候立即更改。冻结正好发生在移除发生时,因此当前播放的项目被中断,但实际项目之间的转换是无缝的。还要注意,我的队列中从来没有超过2个项目,因此在循环中,我基本上只删除一个项目

所以,我的问题是:有没有办法避免这种冻结?首先是什么导致了冰冻


<> > >编辑< /强>,对于遇到同一问题的人,我的解决方法是停止使用AvFunt并使用它。

< P>而不是删除循环中的项,可以考虑安排<代码> NScase稍后进行。

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    // do something here
}];
例:


我不知道这是否会有帮助,但它至少会将实际的项目移除转移到设备可以决定何时运行的预定操作。

这是一个更黑客的解决方案,但它可能会有所帮助

您不必立即从
dynamicMusicPlayer
中删除该项,而可以通过将其添加到单独维护的要删除的内容列表中来将其标记为删除


然后,当
AVQueuePlayer
即将进入下一个项目时,浏览可删除项目列表并将其取出。这样,光点出现在项目之间的边界,而不是在播放期间。

不幸的是,这只会在时间上改变冻结:(对此很抱歉-我希望它能安排这样做,这样会有所帮助。另一个选择可能是安排在不同的线程上,但我怀疑这会表现得更好。不幸的是,我决定使用AVQueuePlayer的主要原因是在曲目之间进行无缝转换,而不是中断播放,因此这只会改变播放顺序。)冻结在曲目之间,这是不可接受的。事实上,我开始基于AVAudioPlayer开发自己的排队播放器,因为我已经非常失望AVQueuePlayer界面非常简约(没有音量控制等)。是的,我听到了。在开发Brightcove iOS SDK[1],我们在AVQueuePlayer上遇到了很多麻烦。它有很多奇怪的黑匣子行为,使我们无法使用。最后,我们不得不采取一种策略,为要播放的每个项目创建一个新的AVPlayer。但是,我们为什么/如何这样做的详细信息超出了此评论框的范围:)[1]
+ (void)setBranch:(BranchType)bType {
    NSArray* items = [dynamicMusicPlayer items];
    for (AVPlayerItem* item in [items copy]) {
        if (item == dynamicMusicPlayer.currentItem) {
            continue; // don't remove the currently played item
        }
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            [dynamicMusicPlayer removeItem:item];
        }];
    }
    [self queueNextBlockFromBranchType:bType];
    currentBranch = bType;
}