2012-01-18 34 views
4

如果我在啓用ARC的項目中運行以下操作,則完成處理程序不會觸發。但沒有ARC,它按預期工作。我在這裏錯過了什麼?ARC中生成CGImagesAsynchronouslyForTimes

NSURL *url = [NSURL URLWithString:@"http://media.w3.org/2010/05/sintel/trailer.mp4"]; 
AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil]; 
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
generator.appliesPreferredTrackTransform = YES; 
CMTime thumbTime = CMTimeMakeWithSeconds(5,30); 

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, 
                CGImageRef im, 
                CMTime actualTime, 
                AVAssetImageGeneratorResult result, 
                NSError *error){ 
    NSLog(@"completion handler"); 
}; 

generator.maximumSize = CGSizeMake(320, 180); 
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler]; 
+0

有同樣的問題...... /嘆氣。如果我弄清楚會不會讓你知道。 – 2012-02-09 23:23:54

回答

5

基於邁克爾指出發電機沒有得到保留,如果你簡單地「用」建成塊內的發電機無功,一切都將正常工作。

所以我想答案是...

NSURL *url = [NSURL URLWithString:@"http://media.w3.org/2010/05/sintel/trailer.mp4"]; 
AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil]; 
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
generator.appliesPreferredTrackTransform = YES; 
CMTime thumbTime = CMTimeMakeWithSeconds(5,30); 

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, 
                CGImageRef im, 
                CMTime actualTime, 
                AVAssetImageGeneratorResult result, 
                NSError *error){ 
    NSLog(@"make sure generator is used in this block and it'll work %@", generator); 
}; 

generator.maximumSize = CGSizeMake(320, 180); 
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler]; 
+0

謝謝你,你救了我很多時間 – taffarel 2013-03-11 12:48:37

+0

它處理程序中返回錯誤。 – Shamsiddin 2016-03-18 16:49:06

3

看起來像generateCGImagesAsynchronouslyForTimes不保留生成器。使發生器成爲您的實例的成員變量並分配給它。一旦我做到了,它就開始工作。該代碼將是這個樣子:

NSURL *url = [NSURL URLWithString:@"http://media.w3.org/2010/05/sintel/trailer.mp4"]; 
AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil]; 
[generator_ cancelAllCGImageGeneration]; 
generator_ = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
generator_.appliesPreferredTrackTransform = YES; 
CMTime thumbTime = CMTimeMakeWithSeconds(5,30); 

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, 
                CGImageRef im, 
                CMTime actualTime, 
                AVAssetImageGeneratorResult result, 
                NSError *error){ 
    NSLog(@"completion handler"); 
}; 

generator_.maximumSize = CGSizeMake(320, 180); 
[generator_ generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler]; 
+0

傳統上,下劃線出現在變量名稱之前。 – 2012-02-12 01:20:07

+1

我們在內部一直使用Google Objective-C風格指南,建議使用尾部下劃線:http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml#Variable_Names傳統上,Apple已爲私有框架保留了前導下劃線變量。 – 2012-02-12 02:11:23

0

的圖像生成裝置絕對由框架得到保留。不知道蘋果編程指南多久更新一次,但您可以在AV Foundation Prog中閱讀。指南,在Generating a Sequence of Images很清楚:

此外,你必須確保你保留圖像生成 直到它已完成創建圖像。