2014-02-18 3 views
1

Я хочу сделать эффект размытия на видеоплеере. Итак, я воспроизвожу видео с помощью AVPlayer и всякий раз, когда хочу поделиться видео с социальным, обменивайтесь дисплеем на видеоплеере. просто я хочу применить эффект размытия, чтобы обмениваться фоном окна.iOS 7 blur effect on videoPlayer

renderContext функция не отображает слой AVPlayer. Но я увидел, что новый API-интерфейс API DrawViewHierarchyInRect отобразит определенные слои, такие как видеоплеер или слой OpenGL.

Поэтому я использовал drawViewHierarchyInRect и работает также на симуляторе, но не на устройстве.

Любая идея?

- (UIImage *)snapshotOfVideoPlayer 
{ 
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 1.0); 
    [self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:NO]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
} 
+0

Какое это устройство? Уменьшается ли эффект размытия/анимация (для повышения эффективности)? – Larme

+0

Можете ли вы показать свои коды? – Raptor

+0

Спасибо за ваш быстрый ответ. Устройство iPad4 с iOS 7. Оно вообще не работает. Всегда черное изображение. – liwen

ответ

0

Я считаю, что единственный способ - использовать AVAssetImageGenerator. Предполагая, что вы есть ссылка на ваш AVPlayerItem:

AVURLAsset *asset = (AVURLAsset *)self.playerItem.asset; 
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
CGImageRef thumb = [imageGenerator copyCGImageAtTime:self.playerItem.currentTime 
                actualTime:NULL 
                 error:NULL]; 
self.videoScreenshotIV.image = [UIImage imageWithCGImage:thumb]; 
  1. Обратите внимание на self.playerItem.currentTime. Это гарантирует, что изображение будет точно таким же, как и момент скриншота.
  2. VideoScreenshotIV - это UIImageView (contentMode scaleAspectFit), который находится непосредственно над представлением avplayer с точно такими же границами. Я скрываю этот UIImageView до тех пор, пока мне не понадобится снять скриншот, затем я сначала покажу его и задаю образ, затем сниму скриншот и снова спрячу его. Он отлично работает! :)