初歩的ミスのエラー
iPadでUIImagePickerControllerで選択後UIAlertViewを呼び出すと出る
iPhoneでは出なかったので原因を特定するのに少し時間かかりました
iPadではUIPopoverController使っているからdismissPopoverAnimated:で閉じてからUIAlertViewを呼び出さないと駄目です
iPhoneはモーダルで呼び出しているのでエラーが出なかった
iPhoneとiPadでは挙動が違う
iPhoneだとモーダルビュー
iPadだとポップオーバービュー
キャンセルされた時の挙動も
ボタンとかメニュー押された時以外でポップオーバー表示する時に作成に基準となるCGRectが必要なのだが

[UIPopoverController* presentPopoverFromRect:CGRectMake(0, 0, 1, 1) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

これで左上詰めで作ってくれます
動画からイメージを切り出してテクスチャとしてポリゴンに貼る
つまりAVAssetImageGeneratorとGLKTextureLoaderを組み合わせるのが1番簡単
前回ではCADisplayLinkを一つ使ってやってましたが3つ使うのが1番ヌルヌルに動くって事が分かりました
CGImage作るだけ、GLKTextureInfo作るだけ、実際にテクスチャを更新するだけ
3つ使う事によってスレッドが待っているだけの時間が減りスムーズに動きます
GLKTextureLoaderを[[GLKTextureLoader alloc] initWithSharegroup:(EAGLSharegroup *)]で作成すると
非同期にGLKTextureInfoを作成出来ます
__block BOOL isMaking; //メンバ変数で宣言
isMaking = YES;
[textureLoader textureWithCGImage:(CGImageRef nonnull)cgImage
options:(NSDictionary NSNumber *> * nullable)textureOperations
queue:(dispatch_queue_t nullable)queue
completionHandler:^(GLKTextureInfo *textureInfo, NSError *outError){
if(outError == NULL){ //GLKTextureInfoが作成されればエラーオブジェクトは空になる
//何らかの処理
isMaking = NO;
}
}];

気を付けなくてはならないのが非同期なので作成中にまた呼ばれる可能性があると言う事です
そこで__block付けたフラグを使って作成前に有効にし(例えばBOOL型でYES)
作成が成功した時点で無効にし(例えばBOOL型でNO)二重に関数が実行されるのを防ぎます
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以上にした方がいいです
キーとか特に取得しないでシンプルに作りたい場合

AVURLAsset *avURLAsset = [[AVURLAsset alloc] initWithURL:URL options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]];

AVMutableComposition *avMutableComposition = [AVMutableComposition composition];

[avMutableComposition insertTimeRange:CMTimeRangeMake(kCMTimeZero,
avURLAsset.duration) ofAsset:avURLAsset atTime:kCMTimeZero error:nil];

AVAssetImageGeneraor *avAssetImageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:avMutableComposition];

だけで作れます
プレーヤーも作りたい場合は以下のコードを追加する

AVPlayerItem *avPlayerItem = [[AVPlayerItem alloc] initWithAsset:avMutableComposition];

AVPlayer *avPlayer = [[AVPlayer alloc] initWithPlayerItem:avPlayerItem];

[avPlayer.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:&avPlayer];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidPlayToEndTime:) name:AVPlayerItemDidPlayToEndTimeNotification object:avPlayer.currentItem];

observeValueForKeyPath:関数とplayerItemDidPlayToEndTime:関数の追加も忘れずに