1

これは奇妙で私を超えています。AppleからAVCAMの例を取り、それをアプリに貼り付けると(すべてのファイル、宣言などとともに)、カメラを問題なく使用できます。このアプリは、静止画、ビデオ、保存、オートフォーカスなどをキャプチャします。すべてがうまく機能しますが、1つは、プレビューレイヤー(カメラが何を指しているかを確認するため)がロードされてフリーズしたままの最初のフレームでフリーズすることです。これが私のメインコントローラーのviewDidLoadに入るAppleからのコードです:

if ([self captureManager] == nil) {
         AVCamCaptureManager *manager = [[AVCamCaptureManager alloc] init];
         [self setCaptureManager:manager];
         [manager release];

         [[self captureManager] setDelegate:self];

         if ([[self captureManager] setupSession]) {

              // Create video preview layer and add it to the UI
              AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[[self captureManager] session]];
              UIView *view = [self videoPreviewView];
              CALayer *viewLayer = [view layer];
              [viewLayer setMasksToBounds:YES];

              CGRect bounds = [view bounds];
              [newCaptureVideoPreviewLayer setFrame:bounds];

              if ([newCaptureVideoPreviewLayer isOrientationSupported]) {
                  [newCaptureVideoPreviewLayer setOrientation:AVCaptureVideoOrientationPortrait];
              }

              [newCaptureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

              [viewLayer insertSublayer:newCaptureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]];

              [self setCaptureVideoPreviewLayer:newCaptureVideoPreviewLayer];
              [newCaptureVideoPreviewLayer release];


         // Start the session. This is done asychronously since 
         //    -startRunning doesn't return until the session is running.
              dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                [[[self captureManager] session] startRunning];     });
          }       
}

逆に、Appleのコードをアプリに貼り付ける代わりに、コードをAppleのAVCAMに貼り付けて、それが機能するかどうかを確認することにしました。たくさんのファイルを移動し、基本的にAVCAMを私の実験的なアプリに変えた後、すべてがうまく機能します。両方のプロジェクト(1-AppleのAVCAMにコードを追加しました-2-AVCAMにコードを追加した元のプロジェクト)には、まったく同じファイルとまったく同じコードがあります。冗談抜き。両方のプロジェクトのクラスヘッダーと実装ファイルは同じです。ただし、元のプロジェクトでは、プレビューレイヤーがフリーズし、フリーズしたままになります。ただし、AVCAMの元のプロジェクトでは、プレビューレイヤーが機能します。だから私はフレームワーク、ビルドとリンクのオプション、SDKバージョンなどをチェックしています...それはどこかのプロジェクトセットアップだと思いますが、これを理解することはできません。私は本当にしません

誰かがこれに遭遇しましたか?ビューがロードされた直後の最初のフレームでプレビューレイヤーがフリーズしました。

手がかりはありますか?(ところで、私はSDK 5.1、armv7を使用しており、デバイスで実行しています)。

前もって感謝します!!

4

2 に答える 2

0

わかりました... 誰かがそれを必要とする場合に備えてここに入れます... 問題は MainWindow.xib の接続でした。

  • ソリューション パート 1

MainWindow.xib を開くと、少なくとも 2 つのオブジェクトが表示されます。

「App View Controller」(App はアプリ名)

および「ウィンドウ」オブジェクト。

Window オブジェクトをクリックします。「接続インスペクタ」を表示すると、OUTLETS セクションの下に「rootViewController」アウトレットがあります。私のものは何にもマップされていませんでした。そこで、そのアウトレット接続をクリックして、オブジェクトのリストにある「App View Controller」オブジェクトまでドラッグしました。これで、「WINDOW」オブジェクトに rootViewController から App View Controller への接続が確立されました。「App View Controller」オブジェクトをクリックして接続インスペクターを見ると、「参照アウトレット」rootViewController から Window オブジェクトへの逆接続も表示されます。

  • ソリューション パート 2

すべてのアプリケーションが MainWIndow.xib のオブジェクトのリストに App Delegate を持っているわけではありません。アプリにビュー コントローラーのデリゲートがない場合は、これで完了です。アプリにビュー コントローラーのデリゲートがある場合は、もう 1 つの手順があります。MainWindow.xib を引き続き確認し、App Delegate オブジェクトをクリックして、接続インスペクターを確認します。「OUTLETS」セクションで、viewController から App View Controller への接続が表示されている場合は、その接続を削除します (小さな x をクリックして削除します)。それだけです。デリゲートをまったく使用しない場合は、これを削除するだけで済みます。

上記の手順の後、私のアプリは魔法のように機能します。プレビュー レイヤーは、フリーズせずにリアルタイムで表示されます。

注: このソリューションはデリゲートを無効にします。そのため、applicationDidEnterBackground などのメソッドの一部は、View Controller に影響を与えなくなります。videopreviewlayer をフリーズせずに Delegate メソッドを再び機能させる必要がある場合は、接続をもう少しいじる必要があるかもしれません。ビデオ用のプロジェクト用に 2 つ目のビューコントローラーを作成することもできます。誰が知っている...私のニーズのために、デリゲートを削除しました。

これが役立つことを願っています。

于 2012-10-25T08:36:33.990 に答える