58

のサブクラスを使用しており、ストリーミング URL を使用してAVQueuePlayer新規追加するAVPlayerItemと、アプリが約 1 ~ 2 秒間フリーズします。フリーズするとは、UI へのタッチに反応しないことを意味します。また、既に再生中の曲をキューに追加するとAVQueuePlayer、最初の曲のストリーミング中に曲のプリロードが自動的に開始されます。これにより、最初の曲を追加したときと同じように、アプリは 2 秒間 UI のタッチに反応しなくなりますが、曲はまだ再生されています。つまりAVQueuePlayer、明らかな「フリーズ」を引き起こしているメインスレッドで何かをしていることを意味します。

insertItem:afterItem:を追加するために使用していAVPlayerItemます。テストして、これが遅延の原因となっている方法であることを確認しました. たぶん、キューに追加した瞬間にAVPlayerItemアクティブ化されたときに何かが起こる可能性があります。AVQueuePlayer

このメソッド呼び出しを使用してストリーミング URL を取得するために、Dropbox API v1 ベータ版を使用していることを指摘する必要があります。

[[self restClient] loadStreamableURLForFile:metadata.path];

次に、ストリーム URL を受信したらAVQueuePlayer、次のように送信します。

[self.player insertItem:[AVPlayerItem playerItemWithURL:url] afterItem:nil];

私の質問は次のとおりです。これを回避するにはどうすればよいですか? の助けを借りずに、自分でオーディオ ストリームのプリロードを行う必要がありAVPlayerますか? もしそうなら、どうすればいいですか?

ありがとう。

4

3 に答える 3

81

playerItemWithURL同期は使用しないでください。URL を含む応答を受け取ったら、次のことを試してください。

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
NSArray *keys = @[@"playable"];

[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^() {
    [self.player insertItem:[AVPlayerItem playerItemWithAsset:asset] afterItem:nil];
}];
于 2012-08-03T10:28:02.973 に答える