2016-11-04 5 views
2

コールバックにAVPlayerとAVSynchronizedLayerを返すクラスがあります。 AVPlayerを使用してAVPlayerLayerを初期化すると、クラッシュします(シミュレータでのみ発生します)。コードは次のようになります。AVPlayerLayerを作成するとシミュレータがクラッシュする

self.projectPlayer = [[MYMobilePlayer alloc] init]; 
    [self.projectPlayer setDelegate:self]; 
    [self.projectPlayer returnPlayerForProjectScene:self.projectScene andCallback:^(NSError *error, AVPlayer *player, AVSynchronizedLayer *syncLayer) { 


     self.syncLayer = syncLayer; 
     AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; 
     NSLog(@"%@",playerLayer); // Also crashes if I assign to private member variable 
     // More code that uses the playerLayer - not needed to illustrate the problem 

    }]; 

コールバックで返されるオブジェクトが正しいので、私は、私が作成し、それらを返すコードを表示する必要はないと思います。

スタックトレースは以下のとおりです(あまり参考にならない)。

enter image description here

ここで起きているかもしれないものを任意のアイデア?

答えて

0

UIKitコードは常にメインスレッドで呼び出す必要があります。あなたのreturnPlayerForProjectSceneコールバックが他のビデオ処理スレッドで起こっています。メインのキューに問題のコードを送信すると、クラッシュが修正されるはずです。

[self.projectPlayer returnPlayerForProjectScene:self.projectScene andCallback:^(NSError *error, AVPlayer *player, AVSynchronizedLayer *syncLayer) { 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     self.syncLayer = syncLayer; 
     AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; 
     NSLog(@"%@",playerLayer); // Also crashes if I assign to private member variable 
     // More code that uses the playerLayer - not needed to illustrate the problem 

    }); 
}]; 
+0

ありがとうございました。あなたの答えは@リズミックフィストマンです。私はそれを試みたが、残念ながらそれを修正していない。ただ、AVPlayerLayerをインスタンス化するだけで十分です。 –

+0

あああまりにも悪いですが、右のスレッドで 'AVPlayerLayer'をインスタンス化しようとしているのでスタックトレースは変わりますか? –

+0

残念ながら、スタックトレースは同じです。と同じスレッド(com.apple.coremedia.videoprocessor)で起こっている –

関連する問題