0

我使用这种方法来生成视频的帧

-(NSMutableArray *)generateThumbnailsFromUrl:(NSURL *)videoURl{

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURl options:nil];

Float64 durationFrames = CMTimeGetSeconds([asset duration]) * 30.0;

AVMutableComposition *myComp = [AVMutableComposition composition];

AVMutableCompositionTrack *compositionVideoTrack = [myComp addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

NSError *error = nil;
BOOL ok = NO;
CGImageRef imgRef;
UIImage *currentImg;
CMTime time,startTime,endTime;
CMTimeRange myRange;
AVAssetTrack *sourceVideoTrack;

NSMutableArray* frameArray = [[NSMutableArray alloc] init];

AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:myComp];
@try {

for (int i = 0; i < floor(durationFrames); i++) {

    startTime = CMTimeMake(i, 30);
    endTime = CMTimeMake(i+1, 30);

    myRange = CMTimeRangeMake(startTime, endTime);

    sourceVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

    ok = [compositionVideoTrack insertTimeRange:myRange ofTrack:sourceVideoTrack atTime:kCMTimeZero error:&error];

    if (!ok) {
        // Deal with the error.
        NSLog(@"error %@ on %d",error,i);
    }else{
    time = CMTimeMake(0,1);

    imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&error];
    if(imgRef != nil)
    {
     currentImg = [[UIImage alloc] initWithCGImage:imgRef];

    if(currentImg!=nil)
        [frameArray addObject:currentImg];
    }
}
        currentImg=nil;
        CGImageRelease(imgRef);
        ok=NO;
    }
}
    @catch (NSException *exception) {
        NSLog(@"exption is %@",exception);
    }
return frameArray;}

但我在这条线上有一个严重的问题imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&error];

有时在执行过程中冻结在这里,无一例外,结果并没有继续执行! 任何人都可以帮助我或向我解释问题吗?

有没有办法检查命令的执行是否更具体时间并终止该命令?

4

1 回答 1

0

根据这个解决方案

你可以

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

      if (result == AVAssetImageGeneratorSucceeded)
      {
         UIImage *generatedImage = [[UIImage alloc] initWithCGImage:image];

         [imagesArray addObject:generatedImage];
     }
   }];
于 2014-06-18T21:14:39.063 回答