iOS視頻錄制、壓縮導出、取幀


概述

花了點時間研究了一下常用的視頻獲取、錄制、壓縮、取幀圖功能,分享給大家了!相信閱讀完本篇文章,會對你有很大的幫助的!

本篇文章研究幾下以個功能:

需要真機測試,才能錄制視頻!

效果圖

image

視頻錄制

首先,我們彈出系統的視頻錄制界面,也就是UIImagePickerController控制器來實現,但是我們需要驗證用戶授權,只有有錄制視頻的權限,才能繼續往下。

我們還需要判斷UIImagePickerControllerSourceTypeCamera是否支持,比如模擬器就不支持,當然真機是否有不 支持的並不知道,不過更安全的寫法是要這么寫的。視頻錄制可以設置錄制的視頻的質量,也就是分辨率的高低,通過videoQuality屬性來設置。我們 還可以設置錄制視頻的最大時長,通過videoMaximumDuration屬性設置,比如這里設置為5分鍾。

然后實現代理,就可以拿到錄制的視頻了。

從相冊選擇視頻

從相冊選擇視頻與彈出錄制視頻的代碼差不多,只是sourceType不一樣而已。我們一樣要求先判斷權限,用戶是否授權,若不允許,就沒有辦法了。

指定sourceType為UIImagePickerControllerSourceTypeSavedPhotosAlbum就是獲取保存到相冊中的media。我們還要指定mediaTypes,只需要設置為kUTTypeMovie就可以了。

同樣,實現代理方法,就可以取到所選擇的視頻了。

保存視頻到相冊

寫入相冊可以通過ALAssetsLibrary類來實現,它提供了寫入相冊的API,異步寫入,完成是要回到主線程更新UI:

獲取視頻幀圖

同步獲取幀圖

同步獲取中間幀,需要指定哪個時間點的幀,當獲取到以后,返回來的圖片對象是CFRetained過的,需要外面手動CGImageRelease 一下,釋放內存。通過AVAsset來訪問具體的視頻資源,然后通過AVAssetImageGenerator圖片生成器來生成某個幀圖片:

異步獲取幀圖

異步獲取某個幀的圖片,與同步相比,只是調用API不同,可以傳多個時間點,然后計算出實際的時間並返回圖片,但是返回的圖片不需要我們手動再 release了。有可能取不到圖片,所以還需要判斷是否是AVAssetImageGeneratorSucceeded,是才轉換圖片:

壓縮並導出視頻

壓縮視頻是因為視頻分辨率過高所生成的視頻的大小太大了,對於移動設備來說,內存是不能太大的,如果不支持分片上傳到服務器,或者不支持流上傳、文件上傳,而只能支持表單上傳,那么必須要限制大小,壓縮視頻。

就像我們在使用某平台的視頻的上傳的時候,到現在還沒有支持流上傳,也不支持文件上傳,只支持表單上傳,導致視頻大一點就會閃退。流上傳是上傳成功 了,但是人家后台不識別,這一次讓某平台坑壞了。直接用file上傳,也傳過去了,上傳進度100%了,但是人家那邊還是作為失敗處理,無奈!

言歸正傳,壓縮、導出視頻,需要通過AVAssetExportSession來實現,我們需要指定一個preset,並判斷是否支持這個preset,只有支持才能使用。

我們這里設置的preset為AVAssetExportPreset640x480,屬於壓縮得比較厲害的了,這需要根據服務器視頻上傳的支持程度而選擇的。然后通過調用異步壓縮並導出視頻:

解決iOS8上錄視頻引起的偏移bug

在iOS8上有這么一樣bug:彈出錄制視頻頁面,再回來發現整個view都往下移動了,可能網上有很多解決辦法,下面只是其中一種:

Tip:記得在選擇或者取消的代理中都調用!

小結

做每種需求,都可能會遇到坑,不過再多的坑也抵不過一顆對技術執着追求的心,必定盪平一切的坑。以前也沒有怎么弄過視頻類的需求,而別人超過的路,即使有坑也不會告訴后來的人坑在哪里,往往只是心里記着有個坑就算了。

今天給大家分享出來,是幫助有困難的同志們,這里立了一個牌:坑,請大家不要再跳到坑里了。看完本篇文章,是否有所了解了呢?如果您正在做這方面的需求,代碼完全可以直接Copy過去使用哦!

源代碼

下載源代碼,記得star一下,分享出去:

標哥的技術博客:【VideoCaptureDemo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM