AVAssetImageGeneratorとAVPlayerは相性悪いです
再生終了時に画像取れない時があってAVPlayerItemDidPlayToEndTimeNotificationでseekToTime:kCMTimeZeroしても駄目です
AVAudioPlayer.currentTimeで同期取るのが良いと思います
幸い.mp4の動画ならAVAudioPlayerでも開けますので
copyCGImageAtTime:はメインスレッドで走る為もしGLKViewControllerのupdateやCADisplayLink、NSTimerなどで使用するとフレームレートが落ちます
generateCGImagesAsynchronouslyForTimes:は別スレッドで動くのですがブロック構文なのでアクセス自由度が下がります
可変な配列を用意して
NSMutableArray *mutableArray;
mutableArray = [NSMutableArray array];
//ループなどで
if (mutableArray.count) {
//配列からイメージを取り出す
CGImageRef image = [[_cgImageMutableArray lastObject] CGImage];
//何かしらの処理等
//配列を空にする
[mutableArray removeAllObjects];
} else if(!mutableArray.count){ //配列が空ならばイメージを生成する
[avAssetImageGenerator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:CMTimeMakeWithSeconds(avAudioPlayer.currentTime, 600)]] completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
//配列に生成されたイメージを追加する
[mutableArray addObject:[UIImage imageWithCGImage:image]];
}];
}
これで作成されたイメージが使用されるまで次のイメージを作成しない感じになります
ですがやはり重い処理なのでCADisplayLinkなどで使用する場合frameIntervalを3以上にした方がいいです