ビデオの再生開始時にavplayerのスクリーンショットを作成しようとしているので、このコードをバックグラウンドで高速に実行する必要があるため、メインスレッドをブロックせず、他のコントロールが同時に高速で実行され、そのコードGCD形式を実行しようとすると、できません実行して、配列に追加した場所で停止するように助けてください(配列にUIImageオブジェクトを追加しています)...
if (isCaptureScreenStart)
{
if (CMTimeGetSeconds([avPlayer currentTime])>0)
{
if (avFramesArray!=nil)
{
queue = dispatch_queue_create("array", NULL);
dispatch_sync(queue, ^{
[avFramesArray addObject:[self screenshotFromPlayer:avPlayer maximumSize:avPlayerLayer.frame.size :CMTimeGetSeconds([avPlayer currentTime])]];//stop at this line
NSLog(@"count:%d",[avFramesArray count]);
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"Frame are created:%d",[avFramesArray count]);
if ([avFramesArray count]==0)
{
NSLog(@"Frame are over");
}
});
});
}
}
}
dispatch_release(queue);
編集:
私はdispatch_group_async
今このブロックを使用する必要があると思います..使用方法のガイドラインを教えてください:
if (isCaptureScreenStart)
{
if (CMTimeGetSeconds([avPlayer currentTime])>0)
{
if (avFramesArray!=nil) {
dispatch_group_async(serial_group1, serial_dispatch_queue1, ^{
[avFramesArray addObject:[self screenshotFromPlayer:avPlayer maximumSize:avPlayerLayer.frame.size :CMTimeGetSeconds([avPlayer currentTime])]];
});
}
}
dispatch_group_notify(serial_group1, serial_dispatch_queue1, ^{
NSLog(@"task competed");
});
}
今、私はこのブロックを使用していますが、上記の実行は論争の的となっていますdispatch_suspend(serial_dispatch_queue1);
。その停止を使用すると、再びブロックの実行を開始する必要があり、使用する必要があるものをdispatch_resume(serial_dispatch_queue1);
再度ロードしてみましたが、システムはクラッシュを示します