2013-04-25 16 views
12

ユーザーの約10%にクラッシュしましたが、再現できず、正確にわかりませんこれが起こるとき。クラッシュ - [AVPlayerItem _attachToPlayer:] AVPlayerItemを複数のAVPlayerインスタンスに関連付けることはできません

Crashlyticsは、アプリケーションが集中していないクラッシュしているユーザーの約半数を報告しています。バックグラウンドオーディオやAirPlayを実行します。アプリケーションは、HLSビデオストリームを再生し、バックグラウンド時にオーディオ専用バージョンに切り替えます。

何が間違っているのか、または私のシングルトンPlayerクラスから複数のAVPlayerインスタンスが存在するのはなぜですか?

ありがとうございます! MovieViewControllerが作成された場合

Exception Type: 
NSInvalidArgumentException 
Reason: 
An AVPlayerItem cannot be associated with more than one instance of AVPlayer 
Fatal Exception 
Latest Crash: 4/06/2013 at 8:48:46 UTC+0200 
0 CoreFoundation __exceptionPreprocess + 162 
1 libobjc.A.dylib objc_exception_throw + 30 
2 AVFoundation -[AVPlayerItem _attachToPlayer:] + 188 
3 AVFoundation -[AVPlayer _attachItem:andPerformOperation:withObject:] + 336 
4 AVFoundation -[AVPlayer _insertItem:afterItem:] + 26 
5 AVFoundation -[AVQueuePlayer insertItem:afterItem:] + 136 
6 MediaPlayer __block_global_4 + 520 
7 
... 
libdispatch.dylib _dispatch_call_block_and_release + 10 
14 
+1

ドロップまたは低接続後に再接続しようとするとクラッシュする可能性がありますか? – Winston

+0

Crashlyticsのこの同じ問題をアプリで見ても、問題を追跡していない。これは私たちの最高のiOS 7のクラッシュの1つであり、私たちのために97%のユーザーがアプリを集中しています。 – ToddH

+0

同じログで何千ものクラッシュが発生しています。私たちのアプリにはムービープレーヤーがないので、ユーザーがアプリ内ブラウザーでムービーを見たときに起こります。私たちは、動画の前に広告を表示する動画(たとえばDailyMotion)に問題を追跡した後、広告プレーヤーから実際のプレーヤーに切り替えるとクラッシュが発生すると考えています。我々のコードではないので、修正することができませんでした。私はそれがiOS7のバグだと思う。 – Accatyyc

答えて

1

は...この問題の原因を発見し、それが現在、「遊び」メソッドは、この例外にアプリがクラッシュします呼び出し(すなわち状態!= MPMovieLoadStatePlayableまたはMPMovieLoadStatePlaythroughOK)をバッファリングです。

+0

私は、バッファリングしていないときにのみコールプレイにアプリを更新しましたが、クラッシュがまだ入ってくる、まだ自分自身を再現することはできません。 – THM

5

新しいURLを設定する前に、再生を明示的に停止することによって解決されるようです。

[moviePlayer stop]; 
moviePlayer.movieSourceType = MPMovieSourceTypeStreaming; 
[moviePlayer setContentURL:[NSURL URLWithString:[videos objectForKey:quality]]]; 
1

あなたは動画のURLの確認タイプではありません場合は、不明に設定されたソースの種類をフェッチうとしているのSourceType

moviePlayerController_ = [[MPMoviePlayerViewController alloc] init]; 
moviePlayerController_.movieSourceType = MPMovieSourceTypeStreaming; 
[moviePlayerController_.moviePlayer setContentURL:url]; 
0

後ContentURLを設定してみてください。これはすべての場合に有効です。

moviePlayerController = [[MPMoviePlayerViewController alloc] init]; 
moviePlayerController.movieSourceType = MPMovieSourceTypeUnknown; 
[moviePlayerController.moviePlayer setContentURL:url]; 
0

考慮すべき事柄のカップル:

  1. プレーヤーアイテムとプレイヤー間のプロキシはAVPlayerのインスタンスによってプレイヤーのアイテムへのアクセスを制御するための手段を提供します。

  2. 関連付けられた参照は、カテゴリを介して特定のクラスに追加されたプロパティの格納を可能にします。そのため、プレイヤーアイテムクラスのカテゴリを作成することができます。このカテゴリは、プレイヤーアイテムがAVPlayerに割り当てられるたびに設定される単一のプロパティ(たとえば、説明文字列)で構成されます。プレーヤーアイテムが他のプレイヤーに割り当てられていないことを確認するには、AVPlayerに保存されている説明と、問題のプレイヤーが返すものを単純に比較します。

関連する問題