2011-01-20 55 views
9

我正在研究一个iPhone应用程序,我将很快演示给现场观众。iPhone演示帮助:任何人都知道更快的截图替代UIGetScreenImage()?

我真的很想通过VGA实时演示应用程序到投影仪,而不是显示屏幕截图。

我买了一个iPhone的VGA适配器,并已改编Rob Terrell's TVOutManager,以满足我的需求。不幸的是,在家里的电视上测试后的帧率并不是很好 - 即使是在iPhone 4上(可能每秒4-5帧,它也不尽相同)。

我相信这个缓慢的原因是我用来捕获设备的屏幕(然后显示在外部显示屏上)的主程序是UIGetScreenImage()。这个不再被允许作为运输应用程序的一部分的例程实际上很慢。下面是我使用捕捉屏幕的代码(FYI mirrorViewUIImageView):

CGImageRef cgScreen = UIGetScreenImage(); 
self.mirrorView.image = [UIImage imageWithCGImage:cgScreen]; 
CGImageRelease(cgScreen); 

是否有快速的方法,我可以用它来捕捉iPhone的屏幕,并实现更好的帧频(20+拍摄FPS)?它不需要通过苹果的应用程序审查 - 此演示代码不会在运输应用程序。如果有人知道任何更快的私人API,我真的很感谢帮助!

另外,使用重复NSTimer的上述代码正在执行,其每隔1.0/desiredFrameRate秒(当前每0.1秒)触发一次。我想知道是否将这些调用封装在一个块中,并使用GCD或NSOperationQueue可能会比调用当前包含这些调用的obj-c方法的NSTimer效率更高。希望对此也有所了解 - 有些搜索似乎表明,与其他操作相比,obj-c消息发送速度有点慢。

最后,你可以在上面看到,该CGImageRefUIGetScreenImage()回报正在变成一个UIImage,然后将该UIImage被传递到UIImageView,这可能是调整上飞的形象。我想知道如果调整大小可能会减慢甚至更多。如何更快做到这一点的想法?

回答

5

你看过Apple推荐的UIGetScreenImage的替代品吗?从“Notice regarding UIGetScreenImage()”跟帖:使用UIGetScreenImage

应用程序()从摄像机捕捉图像应该使用AVCaptureSession和相关类的AV Foundation框架。有关示例,请参见Technical Q&A QA1702,“如何使用AV Foundation将摄像机的视频帧捕获为图像”。请注意,iOS4及更高版本仅支持使用AVCaptureSession。

使用UIGetScreenImage()捕获接口视图和图层的内容的应用程序应改为使用QuartzCore框架中的CALayer的-renderInContext:方法。有关示例,请参阅Technical Q&A QA1703,“UIKit应用程序中的屏幕截图”。

使用UIGetScreenImage()捕捉基于OpenGL ES的视图和图层的内容的应用程序应该使用glReadPixels()函数来获取像素数据。有关示例,请参见Technical Q&A QA1704,“OpenGL ES View快照”。

+1

嗨约拿,谢谢你的建议。事实证明,我确实尝试使用CALayer的renderInContext:方法。它甚至更慢。 AVFoundation在这种情况下不会真正帮助我,因为我没有从相机或其他AV源捕获 - 我试图捕获屏幕本身。 Apple建议替代UIGetScreenImage,因为它们不再允许它,但是此代码不适用于App Store提交,它仅用于演示。 – 2011-01-20 19:43:14

0

我还没有得到你想要的解决方案(模拟视频镜像),但你可以将你的意见移动到外部显示器。这就是我所做的,对帧频没有明显的影响。但是,显然,由于视图不再位于设备的屏幕上,因此您不能再直接与其交互或看到它。如果你有类似于使用加速度计控制的游戏,这应该不成问题,但是基于触摸的操作需要一些工作。当主视图是外部的时,我所做的是在设备上有另一种视图。对我来说,这是一个2D控制视图,用于“命令”正常的3D视图。如果你有一款游戏,你可以创建一个替代输入视图来控制游戏(虚拟按钮/游戏杆等),这取决于你如何解决这个问题。

没有越狱自己我不能说肯定,但我的印象是越狱设备本质上可以启用视频镜像(就像他们在苹果演示中使用的...)。如果这是真的,那么这可能是你最简单的路线,如果你想要的只是一个演示。

1

我不知道有多快是这一点,但它值得一试;)

CGImageRef screenshot = [[UIApplication sharedApplication] _createDefaultImageSnapshot]; 
[myVGAView.layer setContents:(id)screenshot]; 

其中_createDefaultImageSnapshot是一个私有API。 (因为是演示...它确定我想) 和myVGAView是一个正常的UIView。 如果你得到CGImageRefs然后只是将它们传递给一层的内容,它的打火机应该更快一点(但只是一点点))

2

新解决方案:获取iPad 2并镜像输出! :)

相关问题