当我的应用程序处于前台时,我需要捕获iPhone屏幕。我为此使用了UIGraphicsGetImageFromCurrentImageContaxt()
,它在大多数synerio中都可以使用,但是当使用MPMoviePlayerViewController
或AVPlayer播放视频时失败,并通过播放器控制返回黑色图像。
大概我的猜测是MPMoviePlayerViewController
使用OpenGl渲染帧,方法UIGraphicsGetImageFromCurrentImageContaxt()
无法捕获图像?
我缺少某些东西,或者有任何其他解决方案可以在应用程序处于前台时捕获iPhone屏幕吗?
最佳答案
对此没有任何简单的解决方案(即可能我不知道),但您需要弄清楚。在这里,我描述了可能的解决方案。当您尝试简单地在上下文中渲染视图时,它将显示空白屏幕代替播放器,其他情况将保持不变。
我知道可能的解决方案
私人API
您可以使用UIGetScreenImage()
功能捕获设备的整个屏幕,包括播放器及其控件。通过这种方式,您可以轻松获得具有视图的播放器图像。
注意:一些朋友说使用此功能可能会导致应用程序被拒绝(我从未使用过App Store的应用程序,因此我对此没有太多经验:))。
第二种方式。
如果您想使用位于主视图或iPhone屏幕上的其他内容获取播放器的图像,则基本思想是捕获两个图像(例如,像使用UIGraphicsGetImageFromCurrentImageContext
一样,其中一个是电影播放器,另一个是整个屏幕)并结合使用一些正确的计算将它们作为一张图像。这样,您需要进行一些计算,因此准确性取决于您的计算。
在这里,我更倾向于使用AVPlayer
而不是MPMoviePlayer来确定我是否正确,但是我感觉AVPlayer在特定时间提供了准确的帧(准确度高。在屏幕上显示的精确图像。)
请将AVPlayer的重力模式设置为AVLayerVideoGravityResizeAspect
。此模式将保留纵横比并适合图层范围(即此选项为默认选项)。您可以这样设置。
playerLayer.videoGravity = setVideoFillMode:AVLayerVideoGravityResizeAspect;
其中playerLayer是
AVPlayerLayer
的对象。现在获取
AVPlayerLayer
的图像AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]
initWithAsset:asset];
imageGenerator.appliesPreferredTrackTransform=YES;
/*AVAssetImageGenerator will scale images such that they fit within the defined bounding box. Images will never be scaled up. So provide this should be the size of AVPlayer. */
imageGenerator.maximumSize=CGSizeMake(400, 400);
CGImageRef imgRef = [imageGenerator copyCGImageAtTime:storedCMTime actualTime:NULL error:NULL];
[imageGenerator release];
请注意,此生成的图像可能不是您要查找的图像的确切大小,也不是您提供的最大大小,因为正如我在上面的评论中所述,图像将永远不会按比例放大。如果图像大小不符合您的实际尺寸,请使用一些图像实用程序功能根据播放器的大小缩放图像,但不要破坏纵横比,因为我们已将AVPLayer的模式设置为AVLayerVideoGravityResizeAspect。 。
现在使用UIGraphicsGetImageFromCurrentImageContext捕获View的图像(即就像您当前正在执行的操作一样)。将我们捕获的AVplayer图像绘制并存储在视图上显示的确切黑色区域上(即,您需要进行一些反复试验才能获得完全相同的图像)。
在这里,我试图涵盖可能引起恐慌或不太明显的所有要点。
更新:
APPLE的屏幕捕获解决方案:http://developer.apple.com/library/ios/#qa/qa1703/_index.html#//apple_ref/doc/uid/DTS40010193
如果您想使用MPMoviewPlayerController,那就可以了。使用@Kuldeep的代码显示获取缩略图。并使用“图像蒙版”将“视图”的图像和“缩略图”组合在一起,在此进行了准确的解释:Link