尝试使用UIGraphicsGetImageFromCurrentImageContext()捕获MPMoviePlayerViewController视图时获取空白图像

时间:2012-08-23 07:45:47

标签: iphone ios ipad ios5

当我的应用程序处于前台时,我需要捕获iPhone屏幕。我已经使用了UIGraphicsGetImageFromCurrentImageContaxt(),因为它适用于大部分的synerio但是在使用MPMoviePlayerViewController或AVPlayer播放视频时失败,并且通过播放器控制返回黑色图像。

Probabely我的猜测是MPMoviePlayerViewController使用OpenGl渲染帧并且方法UIGraphicsGetImageFromCurrentImageContaxt()无法捕获图像?

我遗失了一些东西,或者当应用程序处于前台时,是否有可用于捕获iPhone屏幕的替代解决方案?

3 个答案:

答案 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;
}