我正在开发一款iPhone应用程序,我即将为现场观众演示。
我真的很想通过VGA将应用程序直播到投影仪,而不是显示屏幕截图。
我为iPhone购买了一个VGA适配器,并根据我的需要调整了Rob Terrell's TVOutManager。不幸的是,在家里的电视上测试之后的帧速率并不是那么好 - 即使在iPhone 4上(也许是每秒4-5帧,它会有所不同)。
我认为这种缓慢的原因是我用来捕获设备屏幕(然后显示在外部显示器上)的主程序是UIGetScreenImage()
。此例程不再允许成为运送应用程序的一部分,实际上非常慢。这是我用来捕捉屏幕的代码(仅供参考mirrorView
是UIImageView
):
CGImageRef cgScreen = UIGetScreenImage();
self.mirrorView.image = [UIImage imageWithCGImage:cgScreen];
CGImageRelease(cgScreen);
是否有更快的方法可以用来捕获iPhone的屏幕并获得更好的帧速率(拍摄20+ fps)?它不需要通过Apple的应用程序审查 - 此演示代码不会在运送应用程序中。如果有人知道任何更快的私有API,我真的很感激帮助!
此外,上述代码正在使用重复NSTimer
执行,该重复1.0/desiredFrameRate
每隔NSOperationQueue
秒(当前每0.1秒)触发一次。我想知道是否将这些调用包装在一个块中并使用GCD或NSTimer
可能比让updateTVOut
调用当前包含这些调用的CGImageRef
obj-c方法更有效。我也会欣赏一些意见 - 一些搜索似乎表明,与其他操作相比,obj-c消息发送有点慢。
最后,正如您在上面所看到的那样,UIGetScreenImage()
返回的UIImage
正在转变为UIImage
,然后UIImageView
正在传递给{{1}这可能是动态调整图像大小。我想知道调整大小是否会减慢速度。关于如何更快地做到这一点的想法?
答案 0 :(得分:5)
您是否看过Apple推荐的UIGetScreenImage替代品?来自“Notice regarding UIGetScreenImage()”主题:
使用UIGetScreenImage()从相机捕获图像的应用程序应该使用AV基础框架中的AVCaptureSession和相关类。有关示例,请参阅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查看快照”。
答案 1 :(得分:2)
新解决方案:获取iPad 2并镜像输出! :)
答案 2 :(得分:1)
我不知道这有多快,但值得一试;)
CGImageRef screenshot = [[UIApplication sharedApplication] _createDefaultImageSnapshot];
[myVGAView.layer setContents:(id)screenshot];
其中_createDefaultImageSnapshot
是私有API。 (因为是演示......我想它可以)
myVGAView
是正常的UIView。
如果你得到了CGImageRefs,那么只需将它们传递给一个图层的内容,它的亮度应该更快一些(但只是一点点);)
答案 3 :(得分:0)
我没有您想要的解决方案(模拟视频镜像),但您可以将视图移动到外部显示器。这就是我所做的,对帧速率没有明显的影响。但是,显然由于视图不再出现在设备的屏幕上,因此您无法直接与其进行交互或查看它。如果你有类似用加速度计控制的游戏,这应该不是问题,但是基于触摸的东西需要一些工作。当主视图是外部视图时,我所做的是在设备上有另一种视图。对我来说,这是一个“控制”普通3D视图的2D控制视图。如果你有游戏,你可以创建一个替代输入视图来控制游戏(虚拟按钮/操纵杆等),这取决于你如何最好地解决它。
没有越狱自己我不能肯定地说,但我认为越狱设备基本上可以启用视频镜像(就像他们在苹果演示中使用的那样......)。如果是真的,如果你想要的只是一个演示,这可能是你最简单的路线。