2012-04-19 14 views
3

ムービーのすべてのフレームを私に与えることはできませんAVAssetImageGeneratorAVAssetImageGeneratorにムービーのすべてのフレームを渡すことはできません

このコードを使用する:

NSString *path = [[NSBundle mainBundle] pathForResource:@"video" ofType:@"mov"]; 
NSURL *url=[NSURL fileURLWithPath:path]; 
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; 
self.asset=[[AVURLAsset alloc] initWithURL:url options:options]; 

NSMutableArray *thumbTimes=[NSMutableArray arrayWithCapacity:asset.duration.value]; 
for(int t=0;t < asset.duration.value;t++) { 
    CMTime thumbTime = CMTimeMake(t,asset.duration.timescale); 
    NSValue *v=[NSValue valueWithCMTime:thumbTime]; 
    [thumbTimes addObject:v]; 
} 
self.generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
self.generator.appliesPreferredTrackTransform=TRUE; 
self.generator.requestedTimeToleranceAfter=kCMTimeZero; 
self.generator.requestedTimeToleranceBefore=kCMTimeZero; 


AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ 
    if (result != AVAssetImageGeneratorSucceeded) { 
     NSLog(@"couldn't generate thumbnail, error:%@", error); 
    } 
    NSLog(@"actual time: %lld/%d (requested: %lld/%d)",actualTime.value,actualTime.timescale,requestedTime.value,requestedTime.timescale); 
}; 
CGSize maxSize = CGSizeMake(320, 180); 
generator.maximumSize = maxSize; 
[generator generateCGImagesAsynchronouslyForTimes:thumbTimes completionHandler:handler]; 

は、私が取得する:あなたがコード内で見ることができるように

2012-04-19 18:55:06.801 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 0/600) 
2012-04-19 18:55:07.836 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 1/600) 
2012-04-19 18:55:08.314 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 2/600) 
2012-04-19 18:55:09.350 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 3/600) 
2012-04-19 18:55:10.186 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 4/600) 
2012-04-19 18:55:11.257 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 5/600) 
2012-04-19 18:55:11.697 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 6/600) 
2012-04-19 18:55:12.246 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 7/600) 
2012-04-19 18:55:13.255 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 8/600) 
2012-04-19 18:55:14.513 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 9/600) 
2012-04-19 18:55:15.944 OpenCVClient[77273:13b07] actual time: -9/600 (requested: 10/600) 
2012-04-19 18:55:17.230 OpenCVClient[77273:13b07] actual time: 11/600 (requested: 11/600) 
2012-04-19 18:55:17.995 OpenCVClient[77273:13b07] actual time: 11/600 (requested: 12/600) 
2012-04-19 18:55:18.716 OpenCVClient[77273:13b07] actual time: 11/600 (requested: 13/600) 
2012-04-19 18:55:19.399 OpenCVClient[77273:13b07] actual time: 11/600 (requested: 14/600) 

私は効果なしでAVURLAssetPreferPreciseDurationAndTimingKeyrequestedTimeToleranceBeforerequestedTimeToleranceAfterを設定しようとしました。

アイデア?

答えて

1

あなたのコードでは、映画のすべてのフレームを取得します。要求された時間と実際の時間の差は、ムービーフレームレートによって発生します。あなたの映画はおよそのようです。 25〜29フレーム/秒。たとえば、時間1/600sと8/600sとの間に差異フレームはありません。

-1
//loading image 
    NSString *initialURL = [NSString stringWithFormat:@"%@",[arrayURL objectAtIndex:indexPath.row]]; 
    NSURL *url=[NSURL fileURLWithPath:initialURL]; 
    NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; 
    self.asset=[[AVURLAsset alloc] initWithURL:url options:options]; 

    NSMutableArray *thumbTimes=[NSMutableArray arrayWithCapacity:asset.duration.value]; 
    CMTime thumbTime = CMTimeMake(1,1); 
    NSValue *v=[NSValue valueWithCMTime:thumbTime]; 
    [thumbTimes addObject:v]; 

    self.imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    self.imageGenerator.appliesPreferredTrackTransform=TRUE; 
    self.imageGenerator.requestedTimeToleranceAfter=kCMTimeZero; 
    self.imageGenerator.requestedTimeToleranceBefore=kCMTimeZero; 


    AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ 
     if (result != AVAssetImageGeneratorSucceeded) { 
      NSLog(@"couldn't generate thumbnail, error:%@", error); 
     } 
     NSLog(@"actual time: %lld/%d (requested: %lld/%d)",actualTime.value,actualTime.timescale,requestedTime.value,requestedTime.timescale); 

     //your image view 
     imageView.image = [UIImage imageWithCGImage:im]; 
    }; 
    CGSize maxSize = CGSizeMake(320, 180); 
    imageGenerator.maximumSize = maxSize; 
    [imageGenerator generateCGImagesAsynchronouslyForTimes:thumbTimes completionHandler:handler]; 
    //loaging complete 
+0

この回答は、すべてのフレームを質問した – Shisoft

関連する問題