目前,将视频捕获集成到你的应用中的最简单的方法是使用 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>