美文网首页
iOS摄像头拍摄照片结构框架及数据流向(一)

iOS摄像头拍摄照片结构框架及数据流向(一)

作者: 木木爱吃糖醋鱼 | 来源:发表于2018-02-03 13:35 被阅读0次

    最近在维护一个用到摄像头的iOS app。由于什么都是从头开始学的,趁着记忆还新鲜赶快记录下学习内容。这个应用中需要对拍摄下来的不同曝光度的照片进行合成。为了更好的理解iOS中是如何拍照片的,以及更好的做图像处理,对拍照片的类做了一点研究。本篇文章仅限于用摄像头拍摄静态图片,不涉及视频,音乐,麦克风。

    iOS有自己专属个摄像头接口。但是由于app和iOS系统的互交是由iOS完成的,不熟悉的人很难在一个半成品的app中找出图像数据究竟从哪里,怎么呈现到View上的。因此在这里写出我的理解。


    摄像头用那个类?

    iOS调用摄像头有两类方法,一是用UIImagePickerController,二是AVFoundation

    前者适用于创建简单拍摄的摄像头。你按一个按钮,拍一个照片,存到相册里就完了。可以设置相片、视频质量,分辨率,预设的摄像头面板,开不开闪光灯 etc.  简单实用,但是没有其他可操作的余地,就像自动挡的汽车🚘差不多。 

    后者相对复杂,需要稍微花一点时间去理解和实践他的运作原理。但是他提供了一些底层内容供开发者操作。有点像手动挡的汽车🚘。

    总结一句话,如果你的app仅需要拍张照片就完事,用UIImagePickerController就好。如果要对照片进行二次加工,用AVFoundation。


    UIImagePickerController怎么用?

    要用UIImagePickerController来拍照或者录制视频通常可以分为如下步骤:

    1,创建UIImagePickerController对象。 

    2,指定拾取源,平时选择照片时使用的拾取源是照片库或者相簿,此刻需要指定为摄像头类型。

    3,指定摄像头,前置摄像头或者后置摄像头。 

    4,设置媒体类型mediaType,注意如果是录像必须设置,如果是拍照此步骤可以省略,因为mediaType默认包含kUTTypeImage(注意媒体类型定义在MobileCoreServices.framework中) 

    5,指定捕获模式,拍照或者录制视频。(视频录制时必须先设置媒体类型再设置捕获模式 

    6,展示UIImagePickerController(通常以模态窗口形式打开)。 

    7,拍照和录制视频结束后在代理方法中展示/保存照片或视频。

    具体代码示例看这里,CSDN的大神们讲的很清楚。


    AVFoundation怎么用?

    我手里的app用的AVFoundation,下面是我对AVFoundation的使用心得。这里有官方给的文字指导。一般人看这个可能比较费劲,我用接地气儿的话给解释一遍。

    如图所示(这是中文教科书中最坑爹的一句话),简单地说结构分3层,最上面一层是输入,最下面一层是输出,中间需要一个Session来连接。这些类的名字全是AVCapture开头(跟SOD开头是一个道理,一看名字就知道是什么,别往下问了。。)。

    输入

    AVCaptureDevice, 就是问是麦克风?还是摄像头?

    创建:_yourDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //设备是摄像头,因为我要拍照

    AVCaptureDeviceInput, 这个用来输入。你对麦克喊一声“我要吃煎饼!”。AVCaptureDevice是麦克风,输入“我要吃煎饼!”的方法是通过AVCaptureDeviceInput。

    创建:_yourInput = [AVCaptureDeviceInput deviceInputWithDevice:_yourDevice error:nil]; //这里需要device,所以要先创建device

    输出:

    AVCaptureOutput,这个厉害了,看你输出的是什么。如果是音频,例如“我要吃煎饼!”,就是AVCaptureAudioFileOutput,如果是拍你吃煎饼的视频是AVCaptureMovieFileOutput。我们做的是图像,用AVCapturePhotoOutput。

    创建:_yourOutput = [[AVCapturePhotoOutput alloc] init];

    Session:

    这个最抽象,他相当于一个有几个state的摄像机。你需要把输入,输出全都加进去,配置一下,打开Session就可以了。每样就一行命令。

    创建:

    _yourSession = [[AVCaptureSession alloc] init];

     [_yourSession beginConfiguration]; //是的,开始配置也要交方程

    设置输入:

    if( [_yourSession canAddInput:_yourInput] ) {

         [_yourSession addInput:_yourInput];

    }

    设分辨率:

    if( [_yourSession canSetSessionPreset:preset] ) {

                [_yourSession setSessionPreset:preset];

            }

     else if( [_yourSession canSetSessionPreset:AVCaptureSessionPreset640x480] ) {

                [_yourSession setSessionPreset:AVCaptureSessionPreset640x480]; //这里设置你需要的分辨率

    }

    设置输出:

    if([_yourSession canAddOutput:_yourOutput]) {

                [_yourSession addOutput:_yourOutput];

    }

    最后别忘了commit你的配置:

    [_yourSession commitConfiguration];

    预览:

    AVCaptureVideoPreviewLayer,你在开摄像头的时候,按快门之前,屏幕可以看到摄像头传来的影像对吧。那个就是这个。这个预览和viewController有关,需要在main.storyboard里创建view组件,ctrl拉出property,把这个property传过来设置预览。这个也需要你在建立了Session之后加入。

    创建:_yourPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_yourSession];

    你的view组件弄好之后,设置预览:

    if(_previewLayer) {

            _yourPreviewLayer.frame = imageView.bounds;//设置预览窗口大小与view组件大小相等

            _yourPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;//重力感知设置,你转手机方向,屏幕切换会resize

            [imageView.layer addSublayer:_yourPreviewLayer];

    }

    都弄完了,如果你要开始拍摄了,就交方程开始

    if (![_captureSession isRunning]) { //这段一般写在viewWillAppear里

            [_yourSession startRunning];

        }

    停止也一样

    if ([_captureSession isRunning]) { //这段一般写在viewWillDisappear里

            [_yourSession stopRunning];

        }

    看完了是不是觉得Session有点像数据库的Session,或者Source Control的用法。配置完了要commit才行。

    如果需要音频,录音,视频录制和播放的话,看这里

    第二部分讲图像的数据流向。

    ref: 

    http://blog.csdn.net/u012988591/article/details/54947753

    http://www.cnblogs.com/kenshincui/p/4186022.html

    https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html

    http://www.cnblogs.com/kenshincui/p/4186022.html

    相关文章

      网友评论

          本文标题:iOS摄像头拍摄照片结构框架及数据流向(一)

          本文链接:https://www.haomeiwen.com/subject/vqzyzxtx.html