2012-04-19 2 views
3

AVAssetImageGenerator 영화의 모든 프레임을 제공하지 못합니다.AVAssetImageGenerator가 영화의 모든 프레임을 제공 할 수 없습니다.

이 코드를 사용 :

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) 

내가 더 효과 AVURLAssetPreferPreciseDurationAndTimingKey, requestedTimeToleranceBeforerequestedTimeToleranceAfter을 설정하기 위해 시도했습니다.

아이디어가 있으십니까?

답변

1

코드를 사용하면 모든 영화 프레임을 얻을 수 있습니다. 요청한 시간과 실제 시간의 차이는 영화 프레임 속도에 의해 발생합니다. 당신 영화에 약이있는 것 같습니다. 25-29 fps. 예를 들어 시간 1/600과 8/600 사이에는 차이 프레임이 없습니다.

-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

관련 문제