当我的应用程序处于前台时,我需要捕获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

10-07 19:56
查看更多