通常的自定義圖檔采集方案都是基于AVCaptureSession;AVCaptureSession采集出來的源資料的精度是可以通過一系列的配置來控制的:
AVCaptureSessionPresetPhoto
AVCaptureSessionPresetHigh
AVCaptureSessionPresetMedium
AVCaptureSessionPresetLow
…
精度從高到低;以iphone6為例,可以輸出的最高精度的圖檔分辨率為:2448*3264(AVCaptureSessionPresetPhoto).
輸出在配置為AVVideoCodecJPEG後會自動啟用硬體壓縮,在這個過程中圖像的精度應該沒有什麼損失。
使用者在儲存圖檔前可以根據需要在UIImageJPEGRepresentation裡傳遞不同的參數來生成不同大小的檔案(有損壓縮,壓縮比率不同)。
我們的項目中遇到的問題是:在一個清單中有多個圖像選擇的控件,而控件中的圖檔來源于拍攝;當我們配置的輸出為最高精度的圖檔時(客戶需求,拍攝正式的協定文檔等),分辨率是很高的。這裡有一個緻命的失誤:控件中的縮略圖直接加載檔案原圖,在這個過程中生成UIImage占用的記憶體是非常驚人的;而同時在一個清單中加載幾十張高清圖檔時,很容易就達到了系統所允許的最高門檻值,是以被系統kill。
讓筆者感到蛋疼的是,該問題沒有生成任何的崩潰日志;而相應的viewcontroller裡面也沒有收到didreceivememorywarning的通知;使用instruments分析的時候能看出一些資訊,雖然沒有記憶體洩漏,但allocations一直在增加。我的印象中以前這類問題是有資訊的,不知道是系統原因還是什麼。
筆者調試該問題的環境是 iphone6 10.2.1系統,xcode 8.2。
<a href="https://developer.apple.com/library/content/technotes/tn2409/_index.html">New AV Foundation Camera Features for the iPhone 6 and iPhone 6 Plus</a>
<a href="https://www.objc.io/issues/23-video/capturing-video/">objc.io-capturing-video</a>
歡迎大家就此問題和我讨論,感謝! [email protected]