2014-11-25 2 views
0

Я использую следующий код, чтобы создать панель миниатюр:Создание бар миниатюр с AVAssetImageGenerator

NSArray *times = [self timesForDuration:_videoAsset.duration andCount:self.numberOfThumbnails]; 

__block int i = 0; 

[_imageGenerator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) { 
    if (result == AVAssetImageGeneratorSucceeded) { 
     UIImageView *imageView = [self imageViewForImage:image atPosition:i]; 

     CGImageRelease(image); 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [_videoBarView addSubview:imageView]; 
     }); 
    } 
    ++i; 
}]; 

Это вроде работает, но проблема заключается в том, что вид в целом обновления очень медленно, и вы можете см. пробелы в баре ... через некоторое время на панели отображаются все запрошенные эскизы, как ожидалось.

Из отладчика я могу сказать, что генерация миниатюр на самом деле довольно быстро, так что происходит здесь?

Я видел обходное решение, которое будет генерировать каждое изображение синхронно, используя copyCGImageAtTime, но это может сделать пользовательский интерфейс неактуальным.

ответ

1

Проблемы, как представляется, вызваны созданием объектов UIImageView за пределами блока dispatch_async; установка этого кода внутри блока устраняет проблемы:

if (result == AVAssetImageGeneratorSucceeded) { 
    __block int position = i; 
    CGImageRetain(image); 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIImageView *imageView = [self imageViewForImage:image atPosition:position]; 

     [_videoBarView addSubview:imageView]; 

     CGImageRelease(image); 
    }); 
} 
++i; 
Смежные вопросы