当我的应用程序处于前台时,我需要捕获iPhone屏幕。我已经使用了UIGraphicsGetImageFromCurrentImageContaxt()
,因为它适用于大部分的synerio但是在使用MPMoviePlayerViewController
或AVPlayer播放视频时失败,并且通过播放器控制返回黑色图像。
Probabely我的猜测是MPMoviePlayerViewController
使用OpenGl渲染帧并且方法UIGraphicsGetImageFromCurrentImageContaxt()
无法捕获图像?
我遗失了一些东西,或者当应用程序处于前台时,是否有可用于捕获iPhone屏幕的替代解决方案?
答案 0 :(得分:3)
没有任何简单的解决方案(即可能是我不知道),但你需要弄明白。这里我描述了可能的解决方案。当您尝试简单地在上下文中渲染视图时,它将代替玩家提供空白屏幕,其他内容将按原样显示。
我知道可能的解决方案
私有API
您可以使用UIGetScreenImage()
功能捕获设备的整个屏幕,包括播放器及其控制。这是您可以轻松获得视图播放器图像的方式。
注意:有些伙伴说使用此功能可能会导致应用程序被拒绝(我从未使用过应用程序商店的应用程序,所以我没有太多经验:))。
第二种方式。
如果你想获得位于主视图或iPhone屏幕中的其他东西的播放器图像,那么基本的想法是捕获两个图像(即一个电影播放器和另一个整个屏幕,就像你正在使用{{1使用一些正确的计算将它们组合成一个图像。这样你需要做一些计算,所以准确性取决于你的计算。
在这里,我更喜欢使用UIGraphicsGetImageFromCurrentImageContext
而不是MPMoviePlayer,不确定我是否真实,但因为我觉得AVPlayer在特定时间提供精确的帧(准确度很高。在屏幕上显示的精确图像。 )
请将AVPlayer的重力模式设置为AVPlayer
。此模式将保留纵横比并适合层边界(即此选项为默认选项)。你可以这样设置。
AVLayerVideoGravityResizeAspect
其中playerLayer是playerLayer.videoGravity = setVideoFillMode:AVLayerVideoGravityResizeAspect;
的对象。
现在获取AVPlayerLayer
AVPlayerLayer
请注意,此生成的图片可能不是您要查找的图片的精确尺寸,或者因为您提供了最大尺寸,因为正如我在上面评论中提到的那样,图片将永远不会放大。如果图像不是你所看到的确切大小,那么使用一些图像效用函数来根据你的播放器的大小来缩放图像,但不要破坏Aspect的比例因为我们已经将AVPLayer的模式设置为AVLayerVideoGravityResizeAspect.store这个图像临时
现在使用UIGraphicsGetImageFromCurrentImageContext捕获View的图像(即你现在正在做的那样)。绘制AVplayer的图像,我们已经捕获并存储在您的视图上显示的黑色区域(即,您需要进行一些试验和错误才能获得完全相同的)。
在这里,我试图涵盖可能引起恐慌或不立即显而易见的所有要点。
<强>更新强> APPLE的屏幕截图解决方案:http://developer.apple.com/library/ios/#qa/qa1703/_index.html#//apple_ref/doc/uid/DTS40010193
如果您想使用MPMoviewPlayerController,那么没关系。使用@Kuldeep的代码显示获取缩略图。并使用图像屏蔽组合两个视图的图像和缩略图,在这里完全解释:Link
答案 1 :(得分:0)
我宁愿建议使用下面的代码段,也许它会更容易使用。您只需要传递捕获视频所需的时间因素。
float timeFactor = 60.0;
CGRect rect = CGRectMake(self.view.center.x, self.view.center.y, 100.0, 100.0)
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
UIImage *thumbnail = [player thumbnailImageAtTime:timeFactor timeOption:MPMovieTimeOptionNearestKeyFrame];
UIImageView *imagV=[[UIImageView alloc]initWithImage:thumbnail];
[imagV setFrame:rect];
答案 2 :(得分:0)
好吧,我似乎找到了一个在AVPlayer中捕获帧的解决方案:
- (UIImage*) captureFrame {
AVAssetImageGenerator *imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:[self.player.currentItem asset]];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5) {
[imageGenerator setRequestedTimeToleranceAfter:kCMTimeZero];
[imageGenerator setRequestedTimeToleranceBefore:kCMTimeZero];
}
CGImageRef ref = [imageGenerator copyCGImageAtTime:self.player.currentItem.currentTime actualTime:nil error:nil];
UIImage *img = [UIImage imageWithCGImage:ref];
CGImageRelease(ref);
return img;
}