目前,将視訊捕獲內建到你的應用中的最簡單的方法是使用 uiimagepickercontroller。這是一個封裝了完整視訊捕獲管線和相機 ui 的 view controller。用uiimagepickercontroller可以自定義系統提供的界面來拍攝并儲存視訊和照片。
source type :
這個參數是用來确定是調用攝像頭還是調用圖檔庫.
<code>uiimagepickercontrollersourcetypecamera</code> : 提供調用攝像頭的界面來拍攝照片視訊。
<code>uiimagepickercontrollersourcetypephotolibrary</code> 調用圖檔庫作為uiimagepickercontroller資料源。
<code>uiimagepickercontrollersourcetypesavedphotosalbum</code> ios裝置中的膠卷相機的圖檔.作為uiimagepickercontroller資料源
mediatypes:
nsarray數組。拍攝時:這個屬性決定uiimagepickercontroller界面模式是拍照還是錄像.檢視已儲存多媒體資料,可決定展示的是照片還是視訊。
<code>kuttypeimage</code> 表示靜态圖檔, <code>kuttypemovie</code>表示錄像.把空數組傳給這個屬性會報異常。在設定此屬性前,需要用<code>availablemediatypesforsourcetype:</code>類方法判斷這種多媒體類型是否被支援。
editing controls :
用來指定是否可編輯.将<code>allowsediting</code> 屬性設定為yes表示可編輯,no表示不可編輯.
delegate
<code>id <uinavigationcontrollerdelegate, uiimagepickercontrollerdelegate> delegate</code>:
使用 uiimagepickercontroller,必須提供遵守uiimagepickercontrollerdelegate和uinavigationcontrollerdelegate協定
的delegate對象.uiimagepickercontrollerdelegate提供了兩個方法來在照相完成後,與uiimagepickercontroller對象界面進行互動。
<code>imagepickercontroller:didfinishpickingmediawithinfo:</code> delegate使用拍攝的照片或者視訊的處理邏輯.
<code>imagepickercontrollerdidcancel(_:)</code> 取消picker view。
1.首先要檢查裝置是否支援相機錄制, 否則裝置不支援相機時,會crash 。
2.檢查在 source type中支援的多媒體類型,并設定mediatypes
如果隻想讓攝像頭隻能攝像,而不能拍照,那應該設定mediatypes
cameraui.mediatypes = [[nsarray alloc] initwithobjects: (nsstring *) kuttypemovie , nil];
kuttypeimage 對應拍照
kuttypemovie 對應攝像
這要導入mobilecoreservices.framework,然後再
<code>#import <mobilecoreservices/utcoretypes.h></code>
3.設定delegate,定義拍攝完成後的互動事件處理
viewcontroller.m
appdelegate.m
橫向拍攝視訊,完成拍攝後點選“使用視訊”,攝像頭被打開,背景出現攝像流。
bug.png
裝置和系統:
iphone6plus 9.1 ,上述情況
iphone5s 8.3 , 上述情況
iphone4s 7.1.1, 上述情況,但是顯示是已拍攝視訊的最後一幀。
問題原因:
調用系統錄影機錄像時,uiimagepickercontroller視圖有兩個關鍵子view,<code>cmkvideopreviewview</code>和<code>plavplayerview</code>。
plavplayerview 用來播放已錄制的視訊。
cmkvideopreviewview 負責展示攝像頭實時拍攝的視訊流。 previewview在不同系統版本有不同的名字:
9.1系統的類名是cmkvideopreviewview;
8.3系統是camvideopreviewview;
7.1系統是 plvideopreviewview)
<code>視圖層次結構</code>:cmkvideopreviewview在下,plavplayerview 在上。橫屏拍攝視訊,完成拍攝後,由于uiimagepickercontroller官方隻支援豎屏模式,系統自動轉為豎屏模式并更新plvideoposterframeview的uiimageview(已錄制視訊的快照)的frame為 (0, 212,75, 414, 310,5),是以原本被遮擋的cmkvideopreviewview就顯示出來了。
paste_image.png
解決方案:
<a href="https://developer.apple.com/library/ios/documentation/audiovideo/conceptual/cameraandphotolib_topicsforios/articles/takingpicturesandmovies.html#//apple_ref/doc/uid/tp40010406" target="_blank">taking pictures and movies</a>
<a href="http://objccn.io/issue-23-1/" target="_blank">ios裝置上捕獲視訊</a>
<a href="http://www.jianshu.com/p/2ac85aca4468" target="_blank">文檔翻譯</a>