iPhone演示帮助:任何人都知道更快的屏幕截图替代UIGetScreenImage()?

Jon*_* G. 9 iphone screen-capture iphone-privateapi ios

我正在开发一款iPhone应用程序,我很快就会向现场观众进行演示.

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

我为iPhone购买了一个VGA适配器,并根据我的需要调整了Rob Terrell的TVOutManager.不幸的是,在家里的电视上测试之后的帧速率并不是那么好 - 即使在iPhone 4上(也许是每秒4-5帧,它会有所不同).

我认为这种缓慢的原因是我用来捕获设备屏幕的主程序(然后显示在外部显示器上)是UIGetScreenImage().此例程不再允许成为运送应用程序的一部分,实际上非常慢.下面是我使用捕捉屏幕的代码(FYI mirrorViewUIImageView):

CGImageRef cgScreen = UIGetScreenImage();
self.mirrorView.image = [UIImage imageWithCGImage:cgScreen];
CGImageRelease(cgScreen);
Run Code Online (Sandbox Code Playgroud)

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

此外,使用NSTimer每秒1.0/desiredFrameRate(当前每0.1秒)触发的重复执行上述代码.我想知道是否将这些调用包装在一个块中并使用GCD或者NSOperationQueueNSTimer调用我updateTVOut当前包含这些调用的obj-c方法更有效.我也会欣赏一些意见 - 一些搜索似乎表明,与其他操作相比,obj-c消息发送有点慢.

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

Jon*_*nah 5

您是否看过Apple推荐的UIGetScreenImage替代品?从" 有关UIGetScreenImage()的通知 "主题:

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

使用UIGetScreenImage()捕获接口视图和图层内容的应用程序应该使用QuartzCore框架中的CALayer的-renderInContext:方法.有关示例,请参阅技术问答QA1703,"UIKit应用程序中的屏幕截图".

使用UIGetScreenImage()捕获基于OpenGL ES的视图和图层内容的应用程序应该使用glReadPixels()函数来获取像素数据.有关示例,请参阅技术问答QA1704,"OpenGL ES查看快照".