9

私は iPhone アプリに取り組んでおり、すぐにライブの聴衆に向けてデモを行う予定です。

スクリーンショットを表示するのではなく、VGA 経由でプロジェクターにアプリをライブでデモしたいと思っています。

私は iPhone 用の VGA アダプタを購入し、Rob Terrell の TVOutManagerを私のニーズに適合させました。残念ながら、自宅のテレビでテストした後のフレーム レートは、iPhone 4 でもそれほど良くありません (おそらく 1 秒あたり 4 ~ 5 フレームで、変動します)。

この遅さの理由は、デバイスの画面をキャプチャするために使用しているメインルーチン (外部ディスプレイに表示されている) がUIGetScreenImage(). アプリを出荷することはもはや許可されていないこのルーチンは、実際には非常に遅いです。画面をキャプチャするために使用しているコードは次のとおりです(FYImirrorViewは ですUIImageView):

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

iPhone の画面をキャプチャし、より良いフレーム レート (20 fps 以上の撮影) を実現するために使用できるより高速な方法はありますか? Apple のアプリ レビューに合格する必要はありません。このデモ コードは出荷用アプリには含まれません。より高速なプライベート API を知っている人がいれば、助けていただければ幸いです。

また、上記のコードは、毎秒(現在は 0.1 秒ごと)NSTimerに発生する繰り返しを使用して実行されています。1.0/desiredFrameRate代わりに、これらの呼び出しをブロックでラップし、GCD またはを使用する方が、現在それらの呼び出しを含む obj-c メソッドを呼び出すNSOperationQueueよりも効率的ではないかと考えています。それについてもいくつかの入力をいただければ幸いです-一部の検索では、obj-cメッセージの送信が他の操作に比べてやや遅いことが示されているようです。NSTimerupdateTVOut

最後に、上記でわかるように、CGImageRef返さUIGetScreenImage()れた が に変換されてUIImageからUIImageに渡されますUIImageView。これはおそらくその場で画像のサイズを変更しています。サイズを変更すると、さらに速度が低下するのではないかと考えています。これをより速く行う方法のアイデアはありますか?

4

4 に答える 4

5

Apple が推奨する UIGetScreenImage の代替案を見たことがありますか? 「UIGetScreenImage() に関する通知」スレッドから:

UIGetScreenImage() を使用してカメラから画像をキャプチャするアプリケーションは、代わりに AVFoundation Framework の AVCaptureSession および関連クラスを使用する必要があります。例については、テクニカル Q&A QA1702、「AV Foundation を使用してカメラからビデオ フレームを画像としてキャプチャする方法」を参照してください。AVCaptureSession の使用は、iOS4 以降でのみサポートされていることに注意してください。

UIGetScreenImage() を使用してインターフェイス ビューとレイヤーのコンテンツをキャプチャするアプリケーションは、代わりに QuartzCore フレームワークの CALayer の -renderInContext: メソッドを使用する必要があります。例については、テクニカル Q&A QA1703の「UIKit アプリケーションのスクリーン キャプチャ」を参照してください。

UIGetScreenImage() を使用して OpenGL ES ベースのビューとレイヤーのコンテンツをキャプチャするアプリケーションは、代わりに glReadPixels() 関数を使用してピクセル データを取得する必要があります。例については、テクニカル Q&A 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 に答える