13

デフォルトのカメラアプリで見られるアニメーションをエミュレートしようとしています。カメラのファインダーのスナップショットがアプリのディスプレイの隅にアニメーション化されています。

この問題を解決するための鍵を保持するAVCaptureVideoPreviewLayerオブジェクトは、これらの要件に対してあまりオープンではありません。.を使用して新しいレイヤーにそのコピーを作成しようとします。

- (id)initWithLayer:(id)layer

..画像のスナップショットなしで空のレイヤーを返すので、ここでさらに深い魔法が起こっていることは明らかです。

あなたの手がかり/ブーイングは大歓迎です。

M。

4

4 に答える 4

22

わずかに異なる角度から、同じ問題に直面しています。

考えられる解決策は次のとおりですが、IMOが大きすぎるものはありません。

  • AVCaptureSessionにAVCaptureStillImageOutputAVCaptureVideoDataOutputの両方を追加できます。sessionPresetAVCaptureSessionPresetHighに設定すると、APIによるフレームの取得が開始され、AVCaptureSessionPresetPhotoに切り替えると、実際の画像を撮影できます。そのため、写真を撮る直前に、ビデオに切り替えてフレームを取得してから、カメラに戻ることができます。主な注意点は、カメラがビデオカメラと画像カメラを切り替えるのに「長い」時間(数秒)かかることです。

  • もう1つのオプションは、カメラ出力(AVCaptureStillImageOutput)のみを使用し、UIGetScreenImageを使用して電話のスクリーンキャプチャを取得することです。次に、コントロールを切り取って、画像だけを残すことができます。画像にUIコントロールを表示している場合、これは複雑になります。また、この投稿によると、Appleはこの機能を使用するアプリを拒否し始めました(それは常に不愉快でした)。

  • これらとは別に、AVCaptureVideoPreviewLayerで遊んでみました。UIViewまたはCALayerをUIImageに保存するためのこの投稿があります。しかし、それはすべて鮮明または白い画像を生成します。レイヤー、ビューのレイヤー、スーパーレイヤー、presentationLayer、modelLayerにアクセスしようとしましたが役に立ちませでした。AVCaptureVideoPreviewLayerのデータは非常に内部的なものであり、通常のレイヤーインフラストラクチャの一部ではないと思います。

これがお役に立てば幸いです、Oded。

于 2010-08-10T14:10:45.103 に答える
5

AVCaptureVideoDataOutput現在のセッションに次のように追加する必要があると思います。

AVCaptureVideoDataOutput *videoOutput = [[AVCaptureVideoDataOutput alloc] init];
videoOutput.videoSettings = @{ (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) };
[session addOutput:videoOutput];

dispatch_queue_t queue = dispatch_queue_create("MyQueue", NULL);
[videoOutput setSampleBufferDelegate:self queue:queue];
dispatch_release(queue);

次に、以下のデリゲート メソッドを実装して、イメージのスナップショットを取得します。

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {

    UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
    // Add your code here that uses the image.
    dispatch_async(dispatch_get_main_queue(), ^{
        _imageView.image = image;
    });   
}

これにより、メモリが消費され、アプリのパフォーマンスが低下します。改善するには、次の方法で最適化することもできますAVCaptureVideoDataOutput

videoOutput.minFrameDuration = CMTimeMake(1, 15);

も使用できますalwaysDiscardsLateVideoFrames

于 2012-11-27T02:31:36.327 に答える
0

プレビューのフレームを取得するには 2 つの方法があります.. AVCaptureVideoDataOutput & AVCaptureStillImageOutput :)

キャプチャ セッションはビデオ フレームを取得するように設定されており、選択したフレームからの cgimage を使用してレイヤーを作成します。静止画用に設定されている場合は、静止画を取得するまで待ち、その cgimage の縮小版からレイヤーを作成します。セッションにまだ出力がない場合は、追加する必要があると思います。

于 2010-08-25T02:39:48.797 に答える
-7

iOS 7 以降では、UIView::snapshotViewAfterScreenUpdatesを使用して、AVCaptureVideoPreviewLayer をラップする UIView のスナップショットを作成できます。これはUIGetScreenImage、アプリが拒否される とは異なります。

UIView *snapshot = [self.containerView snapshotViewAfterScreenUpdates:YES];

ビューをイメージに変換する昔ながらの方法を思い出してください。何らかの理由で、カメラのプレビューを除くすべてで機能しました。

UIGraphicsBeginImageContextWithOptions(self.containerView.bounds.size, NO, [UIScreen mainScreen].scale);
[self.containerView drawViewHierarchyInRect:self.containerView.bounds afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
于 2015-07-24T23:41:39.390 に答える