2011-11-07 13 views
6

現在、ムービークリップからフレームを抽出するアプリケーションをプログラミングしています。アプリケーションがフリーズするのを防ぐために、別のスレッドで抽出を行うように設計しました。抽出プロセス自体には多くのリソースが必要ですが、シミュレータで使用するとうまく動作します。しかし、iPad用にビルドするときに問題があります。別のアクション(私はフレームを抽出している間に私のAVプレーヤーに再生を指示している)を実行すると、スレッドが予期せず動作を停止し、それが殺されていると思います。OSによってスレッドが殺されています

私はたくさんのリソースを使っていると思いますが、完全にはわかりません。

ここに私の質問があります: 1.私のスレッドが停止しているかどうかは、どうすればわかりますか? 2.処理が過度に行われている場合、どうすればよいですか?私は実際にこの行動を実行する必要があります。相続人

使用していくつかのコードイム: をスレッドを作成するには:

[NSThread detachNewThreadSelector:@selector(startReading) toTarget:self withObject:nil];

私は、そんなに 感謝をあなたが必要とするすべての情報を投稿します!

更新 私は現在GCDを使用していますが、それは私のためのスレッドを設定します。しかし、OSは依然としてスレッドを強制終了します。

私はそれがいつ起こっているのか正確に知っています。私が[AVplayer play]に言ったとき。それはスレッドを殺す。

この問題は、のみ、実際のiPadではなく、シミュレータ

+0

質問する必要がある場合は、ディスパッチキュー(GCD)や操作キュー(NSOperationQueue)のように、より高いレベルの抽象化を使用してみてください。[スレッドから移動する](http://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/ConcurrencyandApplicationDesign/ConcurrencyandApplicationDesign.html#//apple_ref/doc/uid/TP40008091-CH100- SW8)、または[GCD](http://stackoverflow.com/questions/7941860/#7941898)または[NSOperationQueue](http://stackoverflow.com/questions/830218/)の例を探してください。それは非常に便利なものです。 – Jano

+1

あなたのアプリがクラッシュしますか?もしそうなら、クラッシュレポートは何を言いますか? AVPlayerがスレッドセーフであることは確かですか?なぜなら[AVplayer play]を呼び出してバックグラウンドスレッドで同時にアクセスすると、それが問題になるからです。 – JeanLuc

+0

抽出スレッドはバックグラウンドスレッドとして実行されていますか?私はObjective-Cを学んでいますが、バックグラウンドスレッドとして実行できるのであれば、OSによって殺されるのを助けることができます。 –

答えて

0

何かがシミュレータで動作し、デバイス上で動作しないで何が起こっているが、1つの明白な説明は確かに資源制約の問題です。しかし、時々、シミュレータは、デバイスの機能の他の側面も正確にシミュレートできません。だから私は状況に他の解釈があるのではないかと思った。 AVアセットへの限定された資産アクセスの競争になる可能性があることが私にはありました。これは、AVアセットの再生を開始すると、もはや処理することができなくなったことを意味します(そして何らかの理由でシミュレータのバグこの制限は表示されません)

AV Foundation Programming Guide, under "Playing Assets"アップル状態で:。

を最終的にあなたが資産をプレイしたいが、あなたはAVPlayerオブジェクトに直接資産を提供していません。代わりに、AVPlayerItemのインスタンスを提供します。プレイヤーアイテムは、関連付けられているアセットのプレゼンテーション状態を管理します。プレーヤーアイテムには、アセット内のトラックに対応するプレーヤーアイテムトラック(AVPlayerItemTrackのインスタンス)が含まれています。

この抽象化は、異なるプレーヤーを同時に使用して、特定のアセットを同時に再生できますが、各プレーヤーによって異なる方法で表示されることを意味します。アイテムトラックを使用すると、たとえば、再生中に特定のトラックを無効にすることができます(サウンドコンポーネントを再生したくない場合があります)。

AVPlayerItemsを使用してアセットにアクセスしていると、両方の操作を同時に行うことができますか?もしそうなら、少なくともその特定の方向は除外されます。しかし、それが問題を解決するかどうかを調べる価値がある場合があります。

わらでつかむことができます。しかし、どこかにつながる可能性があります。Appleのスレッド・プログラミング・ガイドの「スレッドのスタックサイズを設定]セクションで

+0

今私は、この資産を持つAVPlayerを開始した後、資産からフレームを読み込むとスレッドが停止しているが、どうすればそれをバイパスできるのか分かりますか? –

+0

AVPlayerItemでアセットにアクセスしていない場合は、アセットを再生する1つのAVPlayerItemインスタンスとアセットからフレームを読み込む2つ目のAVPlayerItemインスタンスを用意する必要があります。これにより、両方が同時に発生する必要があります。 –

+0

AVPlayerアセットを使用してアセットを再生していますが、フレームを読み込めません。 AVAssetReaderを使用しているそのインスタンスの場合は、アセット自体で開始されます。どのようにそれをお勧めしますか? –

0

、27ページは言う:iOS版およびMac OS X v10.5以降で

以降、 NSThreadオブジェクトを割り当て、初期化します(detachNewThreadSelectorを使用しないでください:toTarget: withObject:メソッド)

22ページにdetachNewThreadSelectorはNSThreadを使用してスレッドを作成するための方法の一つであると言うにもかかわらず。あなたのアプリで切り離されたスレッドが作成されますガイドによると

NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil]; 
[myThread start]; 

そして、それはあなたのスレッドを開始する方法の23ページで、この例を示します。この方法でスレッドを作成し、OSがスレッドを強制終了するかどうかを確認してください。ここでは参考のため

は、ガイドへのリンクです

http://developer.apple.com/library/ios/iPad/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html#//apple_ref/doc/uid/10000057i-CH15-SW2

また、29ページに言及

あなたのアプリがあなたのスレッドで自動解放プールを作成し、あなたがしているようで管理するメモリモデルを使用している場合、そのエントリルーチンが最初に行うべきことであり、同様に、スレッドが最後に行うことです。これを持っていないかどうか分からないと、あなたのスレッドを強制終了させますが、これを行うことを確認してください。

スレッドエントリルーチンでtry/catchブロックを使用すると、killの問題は解決しない可能性がありますが、スレッドでエラーが発生した場合は、アプリケーションが終了することはありません。

Duncanが言及したように、リソースの制約に役立つこの他のデザインヒントについては言及していません。ガイド18ページによると:

スレッド関連のリソースに 競合を避けるために

最も簡単かつ最も簡単な方法は、あなたのプログラムに どんなデータの独自のコピーを各スレッドを与えることです共有データ構造を避けますニーズ。パラレルコードは、スレッド間の通信とリソースの競合を最小限に抑えたときに最も効果的です。

あなたはあなたのアプリでこれを行うことができると思います。ダンカンが「AVPlayerオブジェクトに直接アセットを提供せず、代わりにAVPlayerItemのインスタンスを提供する」ことに加えて、スレッドごとに別々のインスタンスを作成し、プレーヤスレッドのAVPlayerItemインスタンスとAVPlayerItemインスタンスを1つ作成します抽出スレッド

1

同時に2つのビデオクリップをデコードしようとしているように聞こえます。 iPadのハードウェアベースのデコード機能のため、一度に1つのデコード処理しかサポートできません。新しいアイテムをプレイすると、古いアイテムはキャンセルされます。これはシミュレータで動作する理由を説明しますが、デバイスでは動作しません。

解決策としては、libav(GPL)やCoreAVC SDK(市販)などの純粋なソフトウェアデコーダに切り替えることができます。そうすれば、再生のためにHWデコーダに干渉することはありません。

関連する問題