AVPlayer
アプリがバックグラウンドモードのときにiOSがアイドリングしているため、ギャップのない再生を実現しようとしています。
答える前に、はい、私はplistを変更し、オーディオセッションを適切に設定し、すべてがうまくてダンディですが、私の質問は本質的に異なっていると思います。
そのため、最初は、トラックのURLが変更されるたびに新しいAVPlayerを初期化するメソッドがクラスにありましたが、それはうまくいきましたが、バックグラウンドではそれほどうまくいきませんでしたが、AVPlayer
毎回新しいインスタンスを作成することはできませんでした。 replaceCurrentItemWithPlayerItem
AVPlayerインスタンスを存続させるなど、他のいくつかのパラダイム、またはAVQueuePlayer
。
私が直面している問題は、iOS 6では、オーディオが停止した瞬間に、一方のトラックが終了し、もう一方のトラックをロードする必要があるため、iPhoneがアプリをバックグラウンドでフリーズすることです。アプリを再びフォアグラウンドにすると、再生は正常に再開されます。
私は連続ストリームを持っていませんが、ストリーミングを開始するためにヒットする個々のURLを持っていないので、アプリをバックグラウンドでフリーズするために最小限のオーディオ中断をさせないように、戦略を使用することについて考えましAVPlayerQueue
た。insertItem:next
advanceToNextItem
ただし、オンデマンドでキューに新しいトラックを追加する必要があり、iOSがバッファリングするまでに、アプリを停止する価値があるとすでに判断しているため、問題は残ります。そのため、アプリのライフサイクルで適切な時間を必要としますinsertItem
。
次に、このKVO通知を聴こうとしていました。
[self.player.currentItem addObserver:self forKeyPath:@"playbackBufferFull" options:0 context:MyPlayerItemContext];
しかし、それは決して呼ばれません。アイデアは、currentItemのバッファがいっぱいになったことを追跡し、プレイリストに次のバッファを追加して、AVQueuePlayerがそれをプリバッファリングしようとするようにすることでした。
別のアイデアが呼び出されることはないのでplaybackBufferFull
、現在の時間/期間を取得しようとすることです。再生の90%がどこにあるかを計算し、適切な時間にイベントを発生させて、次のトラックのバッファリングを開始します。
オブジェクトの期間プロパティがプログレッシブ受信データに基づいて変更される可能性があることを考えると、それは悪い音ですか?
他にどのような戦略を取ることができますか?
ありがとう。