7

静止写真を撮る前に独自のライブ プレビューを作成するアプリケーションがあります。アプリは画像データに対して何らかの処理を実行する必要があるため、AVCaptureVideoPreviewLayer に依存することはできません。Apple のサンプル コードを使用して、初期ストリームを動作させることは非常にうまくいっています。問題は、スナップショットを取得するために高品質のイメージに切り替えようとしたときに発生します。ボタンを押すと、フル解像度の写真を撮るためにセッションを再構成しようとします。私は多くのバリエーションを試しましたが、これが私の最新の例です (まだ動作しません):

- (void)sessionSetupForPhoto
{
 [session beginConfiguration];
 session.sessionPreset = AVCaptureSessionPresetPhoto;
 AVCaptureStillImageOutput *output = [[[AVCaptureStillImageOutput alloc] init] autorelease];
 for (AVCaptureOutput *output in [session outputs]) {
  [session removeOutput:output];
 }
 if ([session canAddOutput:output]){
  [session addOutput:output];
 } else {
  NSLog(@"Not able to add an AVCaptureStillImageOutput");
 }
 [session commitConfiguration];
}

I am consistently getting an error message just after the commitConfiguration line that looks like this: (that is to say, I am getting an AVCaptureSessionRuntimeErrorNotification sent to my registered observer)

Received an error: NSConcreteNotification 0x19d870 {name = AVCaptureSessionRuntimeErrorNotification; object = ; userInfo = { AVCaptureSessionErrorKey = "Error Domain=AVFoundationErrorDomain Code=-11800 \"The operation couldn\U2019t be completed. (AVFoundationErrorDomain error -11800.)\" UserInfo=0x19d810 {}";

The documentation in XCode ostensibly provides more information for the error number (-11800), "AVErrorUnknown - Reason for the error is unknown.";

以前にも stopRunning と startRunning の呼び出しを試みましたが、推奨されない WWDC セッション 409 を見た後はそれを行わなくなりました。停止して開始すると、別のエラー メッセージ -11819 が表示されました。これは、「AVErrorMediaServicesWereReset - メディア サービスが利用できなくなったため、操作を完了できませんでした。」に対応します。これは、単に「不明」というよりもはるかに優れていますが、必ずしもそうとは限りません。もう役に立ちます。

AVCaptureStillImageOutput が正常に追加されます (つまり、ログ メッセージは出力されません)。

iPhone 3g (w/4.1) と iPhone 4 でテストしています。

この呼び出しは、元の AVCaptureSession セットアップが行われた場所でもあるメイン スレッドで行われています。

エラーを回避するにはどうすればよいですか? より高い解像度に切り替えて写真を撮るにはどうすればよいですか?

ありがとうございました!

4

2 に答える 2

2

AVCaptureSession から出力されるビデオ データを処理しているので、sessionSetupForPhoto を呼び出す前に AVCaptureVideoDataOutput が接続されていると想定しています

もしそうなら、captureOutput:didOutputSampleBuffer:で何をしているのか詳しく説明できますか? もっと見ることができないので、古い出力を削除してから写真品質のプリセットを設定することに問題があるのではないかと推測しています。

また、出力を削除するときに反復子として使用している出力変数は、静止画像出力を隠しています。問題はありませんが、コードが少し読みにくくなります。

于 2011-04-08T03:39:07.577 に答える
1

セッションを切り替える必要はありません。初期化時にセッションに追加AVCaptureStillImageOutputし、画像をキャプチャしようとしているときに次を呼び出して、CMSampleBufferRefそれに応じて使用します。

captureStillImageAsynchronouslyFromConnection:videoConnection
   completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
{
}
于 2012-04-30T13:02:44.497 に答える