9

我正在开发一个 iPhone 应用程序,我将很快向现场观众演示。

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

我为 iPhone 购买了一个 VGA 适配器,并调整了Rob Terrell 的 TVOutManager以满足我的需要。不幸的是,在我家里的电视上测试后的帧速率并不是那么好——即使在 iPhone 4 上也是如此(可能每秒 4-5 帧,它会有所不同)。

我相信这种缓慢的原因是我用来捕获设备屏幕(然后显示在外部显示器上)的主要程序是UIGetScreenImage(). 这个不再被允许成为应用程序的一部分的例程实际上非常慢。这是我用来捕获屏幕的代码(仅供参考mirrorViewUIImageView

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

有没有更快的方法可以用来捕捉 iPhone 的屏幕并获得更好的帧速率(拍摄 20+ fps)?它不需要通过 Apple 的应用程序审查 - 此演示代码不会在发货应用程序中。如果有人知道任何更快的私有 API,我将非常感谢您的帮助!

此外,上面的代码正在使用每秒钟NSTimer触发一次1.0/desiredFrameRate(当前每 0.1 秒)的重复执行。我想知道是否将这些调用包装在一个块中并使用 GCD 或 anNSOperationQueue可能比调用当前包含这些调用的NSTimer我的obj-c 方法更有效。updateTVOut也将不胜感激 - 一些搜索似乎表明 obj-c 消息发送与其他操作相比有些慢。

最后,正如您在上面看到的CGImageRefUIGetScreenImage()返回的 被转换为 a UIImage,然后UIImage被传递给 a UIImageView,这可能正在动态调整图像的大小。我想知道调整大小是否会进一步减慢速度。如何更快地做到这一点的想法?

4

4 回答 4

5

您是否查看过 Apple 推荐的 UIGetScreenImage 替代方案?从“关于 UIGetScreenImage()的通知”线程:

使用 UIGetScreenImage() 从相机捕获图像的应用程序应该使用 AVCaptureSession 和 AV Foundation 框架中的相关类。例如,请参阅技术问答 QA1702,“如何使用 AV Foundation 将摄像机中的视频帧捕获为图像”。请注意,仅 iOS4 及更高版本支持使用 AVCaptureSession。

使用 UIGetScreenImage() 来捕获界面视图和层的内容的应用程序应该使用 QuartzCore 框架中 CALayer 的 -renderInContext: 方法。例如,请参阅技术问答 QA1703,“UIKit 应用程序中的屏幕截图”。

使用 UIGetScreenImage() 来捕获基于 OpenGL ES 的视图和层的内容的应用程序应该使用 glReadPixels() 函数来获取像素数据。例如,请参阅技术问答 QA1704,“OpenGL ES 视图快照”。

于 2011-01-20T04:26:09.223 回答
2

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

于 2011-04-23T00:52:13.107 回答
1

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

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

_createDefaultImageSnapshot私有 API在哪里。(因为是用于演示......我想它没问题)并且myVGAView是一个普通的 UIView。如果你得到 CGImageRefs 然后只需将它们传递给图层的内容,它更轻并且应该更快一点(但只是一点点;))

于 2011-01-27T23:05:48.213 回答
0

我没有您想要的解决方案(模拟视频镜像),但您可以将视图移至外部显示器。这就是我所做的,对帧速率没有明显影响。然而,显然由于视图不再在设备的屏幕上,您不能再直接与其交互或查看它。如果您有类似由加速度计控制的游戏,这应该不是问题,但是基于触摸的东西需要一些工作。当主要视图在外部时,我所做的是在设备上有一个替代视图。对我来说,这是一个“命令”正常 3D 视图的 2D 控制视图。如果你有一个游戏,你也许可以创建一个替代输入视图来控制游戏(虚拟按钮/操纵杆等),这实际上取决于你所拥有的如何最好地解决它。

我自己没有越狱我不能肯定地说,但我的印象是越狱设备基本上可以启用视频镜像(就像他们在苹果演示中使用的那样......)。如果属实,如果您想要的只是演示,那可能是您最简单的方法。

于 2011-01-27T22:40:56.257 回答