11

問題

カメラのカスタムインターフェイスを作成するための参照として使用しているApple(SquareCam)のサンプルアプリケーションがあります。AVFoundationフレームワークを使用しています。Appleからプロジェクトをビルドして実行すると、アプリは期待どおりに実行されます。ただし、そのプロジェクトから同じコードを取得してXcodeの新しいプロジェクトに配置すると、ビデオプレビューが表示されません。

ビデオプレビューレイヤーを実行するために必要なコンポーネントまでコードを簡略化しました。繰り返しになりますが、このコードはApple(SquareCam)プロジェクトの場合と同じように正常に実行されますが、新しいプロジェクトでは表示されません。

コード

- (void)setupAVCapture {
    NSError *error = nil;

    AVCaptureSession *session = [AVCaptureSession new];
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
        [session setSessionPreset:AVCaptureSessionPreset640x480];
    else
        [session setSessionPreset:AVCaptureSessionPresetPhoto];

    // Select a video device, make an input
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];

    if ([session canAddInput:deviceInput])
        [session addInput:deviceInput];

    previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    [previewLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
    [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
    CALayer *rootLayer = [previewView layer];
    [rootLayer setMasksToBounds:YES];
    [previewLayer setFrame:[rootLayer bounds]];
    [rootLayer addSublayer:previewLayer];
    [session startRunning];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupAVCapture];
}

私は何を試しましたか?

すべてのコンセントを正しく設定しました。ビルドフェーズにすべてのフレームワークライブラリがあります。どちらのプロジェクトもストーリーボードを使用しています。奇妙なことに、私はカメラから画像をキャプチャし、ソースを前面から背面に切り替えることさえできます。ただし、プレビューは表示されません。AppleプロジェクトはARCでセットアップされていません。そこで、ARCを使用するようにプロジェクトを更新しました。繰り返しになりますが、Appleプロジェクトではうまく機能しますが、新しいプロジェクトではうまく機能しません。

考え?

問題が何であるかについてのアイデアはありますか?これを引き起こす可能性のあるプロジェクト設定はありますか?

4

3 に答える 3

6

私のプロジェクトでも同様の問題がありました。コードの抜粋から、誰が setupAVCapture メソッドを呼び出しているかを判断するのは困難です。私の場合、AVCaptureVideoPreviewLayer がメイン スレッドで作成されていることを確認する必要がありました。

いくつかのオプションがあります。次のブロックで呼び出しをラップすることにより、メイン アプリケーション スレッドで setupAVCapture を呼び出すことができます。

dispatch_async(dispatch_get_main_queue(), ^{
   // call setupAVCapture() method in here
});

それができない場合は、コードの次の部分でのみ実行できます。

  dispatch_async(dispatch_get_main_queue(), ^{
    previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    [previewLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
    [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
    CALayer *rootLayer = [previewView layer];
    [rootLayer setMasksToBounds:YES];
    [previewLayer setFrame:[rootLayer bounds]];
    [rootLayer addSublayer:previewLayer];
   });
于 2013-03-20T21:39:23.553 に答える