2010-12-10 6 views
7

Ich habe eine Anwendung, die vor der Aufnahme eines Standfotos eine eigene Live-Vorschau erstellt. Die App muss einige Verarbeitungsschritte für die Bilddaten ausführen und kann sich daher nicht auf AVCaptureVideoPreviewLayer verlassen. Den ersten Stream zum Laufen zu bringen, geht mit dem Beispielcode von Apple recht gut. Das Problem tritt auf, wenn ich versuche, zu einem Bild mit höherer Qualität zu wechseln, um den Schnappschuss aufzunehmen. Als Reaktion auf einen Tastendruck versuche ich die Sitzung neu zu konfigurieren, um ein Foto mit voller Auflösung aufzunehmen. Ich habe viele Variationen ausprobiert, aber hier ist mein jüngstes Beispiel (die immer noch nicht funktioniert):So verwenden Sie AVCaptureSession, um Live-Vorschauvideo zu streamen, dann ein Foto aufzunehmen und dann zum Streaming zurückzukehren

- (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]; 
} 

ich konsequent bin immer eine Fehlermeldung direkt nach der commitConfiguration Linie, die wie folgt aussieht: (dh , ich bin ein AVCaptureSessionRuntimeErrorNotification meiner registrierten Beobachter geschickt bekommen)

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 {}";

die Dokumentation in XCode angeblich mehr Informationen für die Fehlernummer (-11.800), bietet „AVErrorUnknown - Grund für den Fehler ist unbekannt.“;

Zuvor hatte ich auch versucht, Anrufe zu stoppenRunning und startRunning, aber nicht mehr tun, nachdem WWDC Sitzung 409 zu sehen, wo es entmutigt ist. Als ich anhielt und anfing, bekam ich eine andere Fehlermeldung -11819, die "AVErrorMediaServicesWereReset - Der Vorgang konnte nicht abgeschlossen werden, da Mediendienste nicht verfügbar wurden.", Die viel netter als einfach "unbekannt" ist, aber nicht unbedingt noch hilfreicher.

Es fügt erfolgreich den AVCaptureStillImageOutput hinzu (d. H., Gibt die Protokollnachricht NICHT aus).

Ich teste auf einem iPhone 3g (w/4.1) und das iPhone 4.

Dieser Aufruf wird im Hauptthread geschieht, wo auch meine ursprüngliche AVCaptureSession Setup stattfand.

Wie kann ich den Fehler vermeiden? Wie kann ich zu der höheren Auflösung wechseln, um das Foto aufzunehmen?

Vielen Dank!

+0

ich am gleichen Fehler bin stecken. Hast du die Problemumgehung gefunden? –

Antwort

2

Da Sie die Videodaten verarbeiten, die aus AVCaptureSession stammen, nehme ich an, dass ein AVCaptureVideoDataOutput vor dem Aufruf von sessionSetupForPhoto damit verbunden ist.

Wenn ja, können Sie näher erläutern, was Sie tun in captureOutput: didOutputSampleBuffer:? Ohne dass ich mehr sehen kann, nehme ich an, dass es ein Problem beim Entfernen der alten Ausgaben und dem anschließenden Einstellen der Fotoqualitätsvoreinstellung geben könnte.

Auch die Ausgang Variable, die Sie als Iterator verwenden, wenn Sie Ihre Ausgaben entfernen versteckt sich das Standbild Ausgabe. Kein Problem, aber es macht den Code etwas schwerer zu lesen.

1

Es ist nicht notwendig, Sitzungen zu wechseln. Fügen Sie einfach AVCaptureStillImageOutput zu Ihrer Sitzung bei der Initialisierung und rufen Sie die folgende, wenn Sie im Begriff sind, um das Bild aufzunehmen und die CMSampleBufferRef entsprechend zu verwenden:

captureStillImageAsynchronouslyFromConnection:videoConnection 
    completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
{ 
} 
+0

Beachten Sie, dass Sie den Videovorschau-Feed nur erhalten, wenn Sie dies für die Sitzungsvoreinstellung von AVCaptureSessionPresetPhoto unter iOS 4.3 oder höher tun. Ältere iOS-Versionen unterstützen nicht das Abrufen einer Videovorschau für das Foto-Preset. Sie müssen also ein wenig mehr arbeiten, um ein Foto in Originalgröße zu erfassen, während Sie eine Vorschau auf diese älteren iOS-Versionen haben. –

Verwandte Themen