0

我有服务器应用程序,它服务于服务器上的视频信息。其中一个请求是URL:PORT/video /:id /:time ...我分析并获取视频文件,准备时间并询问方法以生成缩略图。它在第一个5分钟内工作非常快(在200ms下生成图像),然后图像生成过程突然​​需要10秒钟...[AVFoundation]:稍后生成缩略图生成

你知道为什么吗?使用的代码:

-(NSImage *)thumbnailAt: (CMTime)  time 
       withSize: (NSSize)  size 
        error: (NSError **) error { 

    @autoreleasepool { 
     if (self.assetChanged) { 
      self.generate = [[AVAssetImageGenerator alloc] initWithAsset:_asset]; 
      self.generate.appliesPreferredTrackTransform = TRUE; 
      self.assetChanged = NO; 
     } 

     self.generate.maximumSize = NSSizeToCGSize(size); 

     CGImageRef imageReference = [self.generate copyCGImageAtTime:time actualTime:NULL error:error]; 

     if (imageReference != nil) { 
      NSImage* ret = [[NSImage alloc] initWithCGImage:imageReference size:size]; 
      CGImageRelease(imageReference); 
      return ret; 
     } 

     return nil; 
    } 
} 

任何想法我做错了什么或任何建议如何做不同(例如使用AVAssetReader)?

回答

0

在端予解决它通过使用不同的方法:我用异步图像

-(NSImage *)createAsyncThumbnailAtTime:(CMTime)time withSize:(NSSize)size { 
    if (self.updated) { 
     [_generator cancelAllCGImageGeneration]; // Stop we did not comply in time. 
     _generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:_asset]; 
     _generator.maximumSize = NSSizeToCGSize(size); 
    } 

    NSMutableArray * times = [NSMutableArray array]; 
    [times addObject:[NSValue valueWithCMTime:time]]; 

    __block NSImage * image; 
    __block BOOL finished = NO; 

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

     image = nil; 

     if (result == AVAssetImageGeneratorCancelled) { 
      image = nil; 
      NSLog(@"CANCELLED %@", error); 
      finished = YES; 
     } 
     else 
      if (result == AVAssetImageGeneratorFailed) { 
       image = nil; 
       NSLog(@"FAILDED %@", error); 
       finished = YES; 
      } 
      else /* result == AVAssetImageGeneratorSucessed */ 
      { 
       image = [[NSImage alloc] initWithCGImage:imageRef size:size]; 
       finished = YES; 
      } 
    }]; 

    while (!finished) { 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    } 

    return thumbnail->image; 
}