Скриншот для AVPlayer и видео
Я пытаюсь сделать скриншот AVPlayer
в увеличенном виде. Я хочу создать только среду тестирования, поэтому частные APIs
или любой другой метод хороши, потому что среда не будет включена при выпуске в AppStore.
Я пробовал с использованием
-
UIGetScreenImage()
: хорошо работает на симуляторе, но не на устройстве -
snapshotviewafterscreenupdates
: показывает представление, но я не могу создать UIImage
из этого. -
drawViewInHierarchy
и renderInContext
не будут работать с AVPlayer
- Я не хочу использовать
AVAssetGenerator
для получения изображения из видео, трудно получить хорошую координату или видеоплеер в качестве подпредставления других видов
Ответы
Ответ 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();