2013-07-16 47 views
1

我有一個iOS應用程序直接從相機處理來自captureOutput的視頻幀。作爲處理的一部分,我在另一個源文件中調用了幾個C函數。我將UIImage轉換爲原始數據並快速傳遞 - 所有的處理都是在與視頻輸出相關的隊列上完成的。從Objective-C調用C函數 - 傳遞大量數據

這似乎工作正常,達到一定的程度。當我傳遞的數據變得太大,並且在C函數的初始化階段出現看似隨機的EXC_BAD_ACCESS錯誤時,似乎我達到了極限。 初始化我的意思是,聲明小靜態數組並將它們設置爲零等。

我想知道是否因爲傳遞大量數據而導致某種堆棧限制,所以嘗試使用其他鏈接器標記和-Wl,-stack_size來增加堆棧大小,但這似乎沒有什麼區別。

還有什麼我應該知道的以這種方式從非UI線程調用C函數?

對不起,有點泛泛,但我無法發佈代碼的具體細節,我正在尋找這種情況的一般建議和提示。我們在釋放內存方面存在問題,並在Objective-C的視頻處理方面使用了自動釋放池(因爲我們建議使用不同的線程) - 也許我們遇到了同樣的困難C代碼。有沒有辦法增加釋放/釋放在C中執行的頻率,還是我只是在追逐我的尾巴?

+0

我會建議,以便它反映了從目標C.通過大的輸入到C函數時的問題,編輯您的帖子/問題的標題除此之外,我沒有任何建議,對不起:( –

+0

聽起來不像C/Objective-C的本質的問題,這聽起來像你有不良的內存訪問某處 –

+0

是的,我一直在追查任何內存問題和應用程序是穩定的內存(真實和虛擬)根據儀器和沒有收到內存警告。 – FiddleMeRagged

回答

0

在包含一些代碼關鍵區域的@autoreleasepool塊後,我們確定了我們遇到的內存問題的主要原因。

似乎在captureOutput回調函數中加入了下面的代碼塊就完成了。

@autoreleaspool 
    { 
    imageColour = [self imageFromSampleBuffer:sampleBuffer]; 
    } 

注:imageFromSampleBuffer爲了解決這個問題採取 ios capturing image using AVFramework

0

因此,您的問題的根源是內存使用情況。即使你不泄漏任何內存,並且非常小心,在iOS上編寫視頻處理應用程序非常棘手,因爲在操作系統因內存使用而終止你的應用程序之前,只有很多內存可以在應用程序中實際分配。如果您想閱讀關於此主題的博客文章,可以在video_and_memory_usage_on_ios找到它。一些簡單的規則要記住的是,你基本上可以在短時間內分配和使用諸如10兆內存之類的東西,但除此之外,你可能會破壞操作系統,你的應用可能會被終止。對於文件中的虛擬映射內存,任何時候所有映射內存的總共上限爲700 megs。這不是一個堆棧問題,我正在談論堆內存。你不應該把視頻內存放在堆棧上,這太瘋狂了。小心只傳遞指向內存的指針,不要將內存從一個緩衝區複製到另一個緩衝區,只需將緩衝區中的內存傳遞給內存。 CoreGraphics和CoreVideo中的iOS API支持這種類型的「分配緩衝區並傳遞指針」類型的方法。另一條經驗法則是一次只處理一個幀,然後在數據寫入文件或通過AVAssets API寫入h.264視頻後重新使用相同的緩衝區處理下一幀。