0

30 초당 7 초의 MOV 비디오가 있습니다. 그러나 여러 값의 코드를 반복 할 때 작동하지 않습니다. 모든 프레임을 쓸 수있을지라도 항상 7-8 개의 고유 한 프레임을 제공합니다. 요청 된 시간은 항상 다르지만 항상 실제 시간 프레임을받습니다.비디오에서 각 프레임을 추출 할 수 없습니다.

MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"video" ofType:@"MOV"]]]; 
moviePlayer.shouldAutoplay = NO; 


NSMutableArray *timesm=[[NSMutableArray alloc]init]; 
for (int i=0; i<frames; i++) { 
    CMTime firstThird = CMTimeMakeWithSeconds(videoDurationSeconds *i/(float)frames, 600); 

    [timesm addObject:[NSValue valueWithCMTime:firstThird]]; 
    double abc=firstThird.value/600; 
    UIImage *thumbnail = [moviePlayer thumbnailImageAtTime:abc timeOption:MPMovieTimeOptionExact]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"zshipra %i.jpg",i]]; 
    NSData *imageData = UIImageJPEGRepresentation(thumbnail,0.7); 
    [imageData writeToFile:savedImagePath atomically:NO]; 
} 

애플 개발자 사이트에서 다른 방법으로 시도했지만, 둘 다 7 초짜리 비디오에서 7 프레임을 제공합니다.

AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1]; 
generate1.appliesPreferredTrackTransform = YES; 
NSError *err = NULL; 
CMTime videoDuration = asset1.duration; 
float videoDurationSeconds = CMTimeGetSeconds(videoDuration); 
int frames=(int)videoDurationSeconds*30; 

NSMutableArray *timesm=[[NSMutableArray alloc]init]; 
for (int i=0; i<frames; i++) { 
    CMTime firstThird = CMTimeMakeWithSeconds(videoDurationSeconds *i/(float)frames, 600); 

    [timesm addObject:[NSValue valueWithCMTime:firstThird]]; 

} 


[generate1 generateCGImagesAsynchronouslyForTimes:timesm 
           completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) { 

    UIImage* myImage = [[UIImage alloc] initWithCGImage:image]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"ankur-%@ %i.jpg",image,(int)[[NSDate date] timeIntervalSince1970]]]; 
    NSData *imageData = UIImageJPEGRepresentation(myImage,0.7); 
    [imageData writeToFile:savedImagePath atomically:NO]; 


    NSString *requestedTimeString = (NSString *) 

    CFBridgingRelease(CMTimeCopyDescription(NULL, requestedTime)); 

    NSString *actualTimeString = (NSString *) 

    CFBridgingRelease(CMTimeCopyDescription(NULL, actualTime)); 

    NSLog(@"Requested: %@; actual %@", requestedTimeString, actualTimeString); 

    if (result == AVAssetImageGeneratorSucceeded) { 

     // Do something interesting with the image. 
    } 


    if (result == AVAssetImageGeneratorFailed) { 

     NSLog(@"Failed with error: %@", [error localizedDescription]); 
    } 

    if (result == AVAssetImageGeneratorCancelled) { 

     NSLog(@"Canceled"); 

    } 

}]; 

답변

0

코드로 테스트했습니다. 그리고 두 가지 변화로, 모든 프레임 이미지가 성공적으로 생성 된 것 같습니다.

1) 지정 허용 옵션

generate1.requestedTimeToleranceAfter = CMTimeMakeWithSeconds(1/30.0, videoDuration.timescale); 
generate1.requestedTimeToleranceBefore = CMTimeMakeWithSeconds(1/30.0, videoDuration.timescale); 

2)를 사용하여 기본 CMTime 단위가 아니라 초 단위

NSMutableArray *timesm=[[NSMutableArray alloc]init]; 
for (int i=0; i<frames; i++) { 
    CMTime firstThird = CMTimeMake(i * (videoDuration.timescale/30.0f), videoDuration.timescale); 
    [timesm addObject:[NSValue valueWithCMTime:firstThird]]; 
}