2010-12-10 47 views
7

我有一個應用程序在拍攝靜態照片之前創建自己的實時預覽。該應用程序需要對圖像數據執行一些處理,因此無法依賴AVCaptureVideoPreviewLayer。使用Apple的示例代碼,使初始流工作得很好。當我嘗試切換到更高質量的圖像以拍攝快照時,問題就出現了。爲了響應按鈕按下,我嘗試重新配置會話以拍攝全分辨率照片。我嘗試過許多變化,但這裏是我的最新的例子(仍然不工作):如何使用AVCaptureSession傳送實時預覽視頻,然後拍照,然後返回流式傳輸

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

我只是commitConfiguration線,看起來像這樣之後我一直收到錯誤消息: (即,我收到發送到我註冊觀察者的AVCaptureSessionRuntimeErrorNotification)

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

在Xcode中的文檔表面上提供了錯誤號(-11800),更多信息「AVErrorUnknown - 原因的錯誤是未知的。」

此前,我還嘗試過打電話給stopRunning和startRunning,但在觀看WWDC Session 409後不再那樣做,因爲它在那裏不受歡迎。當我停下來並開始時,我收到了一條不同的錯誤消息-11819,它對應於「AVErrorMediaServicesWereReset - 操作無法完成,因爲媒體服務不可用」,比簡單的「未知」更好,但不一定更有幫助。

它成功添加了AVCaptureStillImageOutput(即不發出日誌消息)。

我測試在iPhone 3G(W/4.1)和iPhone 4

該調用在主線程,這也是在那裏我原來AVCaptureSession設置發生發生。

如何避免該錯誤?如何切換到更高分辨率拍攝照片?

謝謝!

+0

我被困在了同樣的錯誤。你找到了解決方法嗎? – 2011-03-10 10:22:04

回答

2

由於您正在處理來自AVCaptureSession的視頻數據,因此我假設您在調用sessionSetupForPhoto之前先連接了AVCaptureVideoDataOutput。

如果是這樣,你可以詳細說明你在做什麼captureOutput:didOutputSampleBuffer:?如果看不到更多的信息,我猜測移除舊的輸出並隨後設置照片質量預設可能存在問題。

而且,你使用的迭代器,當你刪除你的輸出輸出變量隱藏靜止圖像輸出。這不是問題,但它使代碼更難閱讀。

1

沒有必要切換會話。只需添加AVCaptureStillImageOutput到您的會議初始化,並調用下面,當你將要拍攝圖像,並相應地使用CMSampleBufferRef

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

請注意,如果您對iOS 4.3或更高版本的AVCaptureSessionPresetPhoto的會話預設執行此操作,則只會獲得視頻預覽Feed。較舊的iOS版本不支持獲取照片預設的視頻預覽,因此您必須做更多的工作來捕獲全尺寸照片,同時在這些較舊的iOS版本上進行預覽。 – 2012-04-30 14:54:17

相關問題