0

AVQueuePlayer を使用してAVPlayerItemsをキューに入れ、再生しました。ただし、 removeItem:メソッドを呼び出してプレーヤーのキューを変更すると、問題が発生します。現在再生中のアイテムに触れない限り、このキューを自由に変更できると想定していましたが、removeItem:を呼び出すたびに再生が一瞬フリーズするようです。

次のコード スニペットを検討してください。

+ (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 つ以上のアイテムがあることはないので、ループでは基本的に 1 つのアイテムのみを削除することに注意してください。

だから、私の質問は次のとおりです。このフリーズを回避する方法はありますか? そして、そもそも何がフリーズを引き起こしているのでしょうか?

編集同じ問題に遭遇した人々にとって、私にとっての解決策は、AVFoundationの使用をやめ、代わりにOrigamiEngineを使用することでした.

4

2 に答える 2

0

ループ内のアイテムを削除する代わりに、NSOperation後で実行するようにスケジュールすることを検討できます。

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

元:

+ (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;
}

これが役立つかどうかはわかりませんが、少なくとも実際のアイテムの削除を、デバイスがいつ実行するかを決定できるスケジュールされた操作にシフトします.

于 2013-05-23T20:39:29.590 に答える
0

これははるかにハックなソリューションですが、役立つ場合があります。

アイテムをdynamicMusicPlayerすぐに削除するのではなく、個別に管理されている削除対象リストに追加して、削除のマークを付けることができます。

次に、AVQueuePlayerが次のアイテムに進もうとしているときに、削除可能なアイテムのリストを一掃し、それらを取り出します。そうすれば、再生中ではなくアイテム間の境界でブリップが発生します。

于 2013-05-24T19:59:41.593 に答える