Подтвердить что ты не робот

Скриншот для AVPlayer и видео

Я пытаюсь сделать скриншот AVPlayer в увеличенном виде. Я хочу создать только среду тестирования, поэтому частные APIs или любой другой метод хороши, потому что среда не будет включена при выпуске в AppStore.

Я пробовал с использованием

  • UIGetScreenImage(): хорошо работает на симуляторе, но не на устройстве
  • snapshotviewafterscreenupdates: показывает представление, но я не могу создать UIImage из этого.
  • drawViewInHierarchy и renderInContext не будут работать с AVPlayer
  • Я не хочу использовать AVAssetGenerator для получения изображения из видео, трудно получить хорошую координату или видеоплеер в качестве подпредставления других видов
4b9b3361

Ответ 1

Я знаю, что вы не хотите использовать AVAssetImageGenerator, но я также исследовал это широко, и я считаю, что единственное решение в настоящее время использует AVAssetImageGenerator. Это не так сложно, как вы говорите, чтобы получить правильную координату, потому что вы должны иметь возможность получить текущее время вашего плеера. В моем приложении следующий код работает отлично:

-(UIImage *)getAVPlayerScreenshot 
{
    AVURLAsset *asset = (AVURLAsset *)self.playerItem.asset;
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    imageGenerator.requestedTimeToleranceAfter = kCMTimeZero;
    imageGenerator.requestedTimeToleranceBefore = kCMTimeZero;
    CGImageRef thumb = [imageGenerator copyCGImageAtTime:self.playerItem.currentTime
                                              actualTime:NULL
                                                   error:NULL];
    UIImage *videoImage = [UIImage imageWithCGImage:thumb];
    CGImageRelease(thumb);
    return videoImage;
}

Ответ 2

AVPlayer воспроизводит видео с помощью графического процессора, поэтому вы не можете захватить его с помощью основных графических методов.

Однако для захвата изображений с помощью AVAssetImageGenerator необходимо указать CMTime.


Обновление:

Забудьте сделать скриншот всего экрана. AVPlayerItemVideoOutput - мой последний выбор, он поддерживает видео steam.

Вот моя полная реализация: https://github.com/BB9z/ZFPlayer/commit/a32c7244f630e69643336b65351463e00e712c7f#diff-2d23591c151edd3536066df7c18e59deR448

Ответ 3

Если вы хотите сделать снимок экрана текущего экрана, просто вызовите следующий метод для любого действия, которое даст вам объект Image.

-(UIImage *) screenshot
{
    UIGraphicsBeginImageContext(self.view.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *sourceImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //now we will position the image, X/Y away from top left corner to get the portion we want
    UIGraphicsBeginImageContext(sourceImage.size);
    [sourceImage drawAtPoint:CGPointMake(0, 0)];
    UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //To write image on divice.
    //UIImageWriteToSavedPhotosAlbum(croppedImage,nil, nil, nil);

    return croppedImage;
}

Надеюсь, это поможет вам.

Ответ 4

CGRect grabRect = CGRectMake(0,0,320,568);// size you want to take screenshot of. 

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
   UIGraphicsBeginImageContextWithOptions(grabRect.size, NO, [UIScreen mainScreen].scale);
 } else {
      UIGraphicsBeginImageContext(grabRect.size);
}
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(ctx, -grabRect.origin.x, -grabRect.origin.y);
[self.view.layer renderInContext:ctx];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();