2013-07-01 30 views
2

查看GLCameraRipple示例時,AVCaptureVideoDataOutput的設置方式是,每當從iphone攝像頭獲得新幀時調用回調(captureOutput)。爲什麼AVCaptureVideoDataOutput回調依賴於OpenGL繪製幀率?

但是,在「drawInRect」函數(用於OpenGL繪圖)的開始處放置一個「sleep(1)」,該回調函數每秒只調用一次,而不是每秒調用30次。

誰能告訴我爲什麼iPhone相機的幀率與OpenGL繪製調用的幀率相關聯?


更新:重現步驟

回答

2

當AVCaptureVideoDataOutput電話委託方法captureOutput:didOutputSampleBuffer:fromConnection:使程序設計師能夠從相機編輯或記錄圖像,這種方法從主線程調用。通常我們應該直接通過主線程編寫與用戶界面交互的代碼,以及爲什麼OpenGL喜歡AVCaptureVideoDataOutput,因爲攝像頭的方法和繪製到屏幕的方法都在主線程中運行。

和AVCaptureVideoDataOutput類可以刪除圖像,如果iPhone不能處理captureOutput:didOutputSampleBuffer:fromConnection:完成了類似的處理時間超過1/30秒下一幀會被忽略,你可以收集與captureOutput數據時間:didDropSampleBuffer :fromConnection:方法

+0

非常感謝您的回答!你怎麼會知道這事? (特別是相機回調在主線程中運行)。這是記錄在某處嗎? –

+1

@JanRüegg - 在主線程中調用它們是正確的,但這是因爲Apple使用這一行明確地將它放在主隊列上:'[dataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];'。如果你願意,它可以放在後臺隊列中,但是如果你的渲染跟不上傳入的視頻幀速率,那麼你必須擔心在那個隊列中建立塊。 Sunama在說明OpenGL渲染必須在主線程上完成時是不正確的,因爲只要多線程不訪問上下文,它可以在後臺完成。 –

+0

嗯......我測試了它,當我使用這一行時,我遇到同樣的問題:'[dataOutput setSampleBufferDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0)];'不應該在另一個線程中運行全局隊列嗎? –