2

GLCameraRippleの例を見ると、AVCaptureVideoDataOutput は、iPhone カメラから新しいフレームが到着するたびにコールバック (captureOutput) が呼び出されるように設定されています。

ただし、「drawInRect」関数 (OpenGL 描画に使用される) の先頭に「sleep(1)」を配置すると、このコールバックは 1 秒あたり 30 回ではなく、1 秒あたり 1 回だけ呼び出されます。

iPhoneカメラのフレームレートがOpenGLドローコールのフレームレートとリンクしている理由を誰か教えてもらえますか?


更新: 再現手順

  • ここから GLCameraRipple サンプルをダウンロードします: http://developer.apple.com/library/ios/#samplecode/GLCameraRipple/Introduction/Intro.html
  • RippleViewController.m => captureOutput に NSLog(@"Got Frame");. 実行すると、多くの「フレームを取得しました」というメッセージが生成されます (1 秒あたり約 30 件)。
  • RippleViewController.m => drawInRectsleep(1);で、関数の最初に a を追加します。毎秒 1 つのメッセージのみが表示されるようになりました。
4

1 に答える 1

2

AVCaptureVideoDataOutput がデリゲート メソッドの captureOutput:didOutputSampleBuffer:fromConnection: を呼び出して、プログラマーがカメラからの画像を編集または記録できるようにする場合、このメソッドはメイン スレッドから呼び出されます。そして、通常、メイン スレッドによって直接ユーザー インターフェイスとやり取りするコードをプログラムする必要があります。その理由は、カメラからのメソッドと画面への描画がメイン スレッドで実行されるため、OpenGL が AVCaptureVideoDataOutput を好む理由です。

また、AVCaptureVideoDataOutput クラスは、iPhone が処理できない場合に画像をドロップできます captureOutput:didOutputSampleBuffer:fromConnection: 処理時間のような時間で終了します。

于 2013-07-01T10:25:49.073 に答える