天天看点

使用系统界面拍摄视频及系统问题

目前,将视频捕获集成到你的应用中的最简单的方法是使用 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 &lt;uinavigationcontrollerdelegate, uiimagepickercontrollerdelegate&gt; 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 &lt;mobilecoreservices/utcoretypes.h&gt;</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>

继续阅读