2017-07-24 35 views
0

我在會話期間在ARKit中創建視頻。當我按下錄製按鈕時,相機凍結。我已經在導致問題的didUpdateFrame委託中編寫代碼。在那裏我將scene.snapshot保存在一個數組中。此外,當我從這些圖像,應用程序崩潰與下面的消息在調試器創建視頻:從調試 消息:由於終止內存問題在didUpdateFrame方法中保存ARSCNView快照導致相機凍結

-(void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame 
    { 
    if (_recordButton.state == UIControlStateSelected) 
    { 
     currentState = Recording; 
    [self saveImage]; 
    } 
    else if (previousState == Recording) 
    { 
    NSLog(@"Stop recording"); 
    currentState = NotRecording; 
    recordTime = NULL; 
    self.nextButton.enabled=YES; 
    } 
//update recording state per frame update 
previousState = currentState; 

}

-(void)saveImage 
    { 
     UIImage *image = self.sceneView.snapshot; 
     [self.bufferArray addObject:image]; 
     image = nil; 
    } 
+0

暫停'didUpdateFrame'內的調試器並檢查堆棧跟蹤 - 您很有可能進入視圖的渲染循環,因此如果啓動快照,您可能會踢出另一個渲染器,這會調用您的'didUpdateFrame',等等,直到你由於無限遞歸而崩潰。最簡單的解決方案可能是將快照分派到主隊列中。 – rickster

+0

我檢查了派遣異步也沒有發生。 dispatch_async(dispatch_get_main_queue(),^ { 的UIImage *圖像= self.sceneView.snapshot; 的NSData * compressImageData = UIImageJPEGRepresentation(圖像,0.02); 的UIImage * compessImage = [UIImage的imageWithData:compressImageData]; [自我。 bufferArray addObject:compessImage]; compessImage = nil; image = nil; }); – Mudassir

回答

1

不要使用ARSCNView.snapshot與實施ARSessionDelegate.didUpdateFrame。我有同樣的問題,解決方案是不實施ARSessionDelegate.didUpdateFrame。我用ARSCNView.snapshot使用了CADisplayLink,它運行良好。 我也嘗試使用ARFrame.capturedImage,但它根本不包含AR對象。 ARSCNView.snapshot包含它們。