OC之AVCapturePhotoCaptureDelegate

AVCapturePhotoCaptureDelegate 监视进度和从AVCapturePhotoOutput接收结果的方法。

要拍摄照片,需要调用AVCapturePhotoOutput实例的- capturePhotoWithSettings:delegate:方法;AVCapturePhotoOutput调用的协议方法取决于拍摄照片时的设置AVCapturePhotoSettings。此协议中的所有方法在编译时都是可选的,但在运行时,委托对象必须根据照片设置响应某些方法:

  • 如果拍摄静态照片(通过指定图像格式或文件类型), 必须实现- captureOutput:didFinishProcessingPhoto:error:方法,
  • 如果拍摄动态照片(通过将livePhotoMovieFileURL属性设置为非零值),必须实现-captureOutput:didFinishProcessingLivePhotoToMovieFileAtURL:duration:photoDisplayTime:resolvedSettings:error:方法。

当调用- capturePhotoWithSettings:delegate:方法时,必须实现上述某一个协议方法,否则会引发异常。
每次调用- capturePhotoWithSettings:delegate:方法时,必须使用唯一的AVCapturePhotoSettings对象。当照片输出调用协议方法时,它会提供一个AVCaptureResolvedPhotoSettings对象,其uniqueID与请求捕获的照片设置的属性相匹配。进行多次拍摄时,使用此uniqueID来确定哪些协议方法调用对应于哪些请求。
每次调用- capturePhotoWithSettings:delegate:方法时,照片输出始终调用“监控拍摄进度”中四个方法各一次。 对于“接收拍摄结果”中的三个方法,可能会多次被调用,或者根本不被调用,具体取决于照片设置AVCapturePhotoSettings

1、监控拍摄进度

每次调用- capturePhotoWithSettings:delegate:方法时,下述方法都会被调用一次。

1.1、拍摄输出已解析设置,并将很快开始拍摄过程
- (void)captureOutput:(AVCapturePhotoOutput *)output
willBeginCaptureForResolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings;

AVCapturePhotoOutput调用- capturePhotoWithSettings:delegate:方法,已提交选择设置AVCapturePhotoSettings并将很快开始捕获过程时,它会尽可能早的调用此方法,让我们知道对于与同一捕获相关的其他协议方法调用会发生什么。该方法有两个参数:

  • 参数resolvedSettings:描述用于此拍摄的设置的对象。将此对象的uniqueID值与拍摄照片时设置对象AVCapturePhotoSettingsuniqueID属性相匹配,以确定此委托调用对应的捕获请求。还可以使用此对象找出照片输出为自动设置选择的值。

使用此方法及其提供的AVCaptureResolvedPhotoSettings可以尽早找到AVCapturePhotoOutput为自动设置AVCapturePhotoSettings选择的值,以及捕获的图像和电影的输出尺寸。例如,如果请求将flashMode属性设置为AVCaptureFlashModeAuto进行拍摄,则已解析的照片设置flashEnabled属性指示在拍摄期间是否会触发闪光灯。

1.2、即将拍摄照片
- (void)captureOutput:(AVCapturePhotoOutput *)output
willCapturePhotoForResolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings;

AVCapturePhotoOutput调用此方法尽可能接近拍摄的初始时刻。如果启用了快门声,则在AVCapturePhotoOutput开始播放快门声后立即调用此方法。
注意:实时照片捕捉禁用快门声音。在某些地方,设备的静音开关可以禁用快门声音。

1.3、已拍摄照片

一旦拍摄的第一步结束,即在摄影曝光时间结束时,AVCapturePhotoOutput就会调用此方法。

- (void)captureOutput:(AVCapturePhotoOutput *)output
didCapturePhotoForResolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings;
1.4、拍摄照片已完成

当整个拍摄过程完成时,AVCapturePhotoOutput会调用此方法,并且不会再为此拍摄请求发送任何协议消息。

- (void)captureOutput:(AVCapturePhotoOutput *)output
didFinishCaptureForResolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings
error:(NSError *)error;

在这里清除已分配的与此拍摄请求相关的任何资源。

2、接收拍摄结果

每次调用- capturePhotoWithSettings:delegate:方法时,下述三个方法可能会多次被调用,或者根本不被调用,具体取决于照片设置AVCapturePhotoSettings

2.1、提供拍摄的图像以及照片产生的相关元数据
2.1.1、适配 iOS10.0 ~ iOS11.0
提供拍摄的JPEG等格式图像
- (void)captureOutput:(AVCapturePhotoOutput *)output
didFinishProcessingPhotoSampleBuffer:(CMSampleBufferRef)photoSampleBuffer
previewPhotoSampleBuffer:(CMSampleBufferRef)previewPhotoSampleBuffer
     resolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings
      bracketSettings:(AVCaptureBracketedStillImageSettings *)bracketSettings
                error:(NSError *)error NS_DEPRECATED_IOS(10_0, 11_0);

如果以JPEG等格式请求拍摄,则AVCapturePhotoOutput会对拍摄请求中的每次曝光调用此方法一次。如果拍摄单个图像,则会调用此方法一次。如果要求使用多次曝光进行包围拍摄,则每次曝光都会调用一次此方法。

  • 参数photoSampleBuffer 包含捕获的照片的样本缓冲区,可以是未压缩的像素缓冲区或压缩的图像数据,以及计时信息和其他元数据。
  • 参数previewPhotoSampleBuffer 如果请求缩略图,则会显示一个样本缓冲区,其中包含所请求格式的缩略图照片。如果未请求预览传递,或者拍摄失败,则此参数为nil。
  • 参数 bracketSettings 如果请求使用AVCapturePhotoBracketSettings对多个图像进行括号捕获,则会在方括号内的静止图像设置对象中描述此委托调用对应的括号中的哪个图像。如果没有请求包围捕获,则此参数为nil。
提供RAW格式图像

如果请求拍摄RAW格式,则AVCapturePhotoOutput会在拍摄请求中为每次曝光调用此方法一次。如果拍摄单个图像,则会调用此方法一次。如果要求使用多次曝光进行包围拍摄,则每次曝光都会调用一次此方法。

- (void)captureOutput:(AVCapturePhotoOutput *)output
didFinishProcessingRawPhotoSampleBuffer:(CMSampleBufferRef)rawSampleBuffer
previewPhotoSampleBuffer:(CMSampleBufferRef)previewPhotoSampleBuffer
     resolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings
      bracketSettings:(AVCaptureBracketedStillImageSettings *)bracketSettings
                error:(NSError *)error NS_DEPRECATED_IOS(10_0, 11_0)
2.1.2、适配 iOS11.0 及以后版本
- (void)captureOutput:(AVCapturePhotoOutput *)output 
didFinishProcessingPhoto:(AVCapturePhoto *)photo 
error:(NSError *)errorAPI_AVAILABLE(ios(11.0));

无论格式如何,使用此方法都可以接收拍摄照片的结果;该方法有三个参数:

  • 参数AVCapturePhoto *photo:包含拍摄的图像像素缓冲区的对象,以及与照片一起捕获的任何元数据和附件(例如预览图像或深度图)。此参数始终为非零;即使拍摄失败,此对象仍包含预期捕获的元数据。

对于所有静止图像拍摄工作,建议使用此方法;如果请求深度数据传递,则需要使用此方法。当调用- capturePhotoWithSettings:delegate:方法时,如果没有实现正确的协议方法,则照片输出会引发异常。
对于动态照片拍摄工作流,可以接收动态照片的静止图像组件。

对于要在拍摄请求中传递的每个主映像,AVCapturePhotoOutput调用此方法一次。
如果以 RAW 和 processed formats请求拍摄,则此方法将针对每种格式触发一次。
如果要求使用多次曝光进行包围拍摄,则此方法会在每次曝光时触发一次。

2.2、动态照片已完成拍摄

拍摄动态照片时,AVCapturePhotoOutput会调用此方法

- (void)captureOutput:(AVCapturePhotoOutput *)output
didFinishRecordingLivePhotoMovieForEventualFileAtURL:(NSURL *)outputFileURL
resolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings;

此时,动态照片内容尚未处理或写入存储。
使用此方法确定何时更改显示的UI以指示不再进行动态照片拍摄。例如,当用户按下快门按钮时,应用程序会显示“LIVE”图标,然后在拍摄动画结束时隐藏该图标。
每次拍摄动态照片时,AVCapturePhotoOutput仅调用此方法一次。

2.3、动态照片产生的URL

调用该方法可以接收动态照片的拍摄结果;如果不拍摄动态照片,则无需实现此方法。

- (void)captureOutput:(AVCapturePhotoOutput *)output
didFinishProcessingLivePhotoToMovieFileAtURL:(NSURL *)outputFileURL
duration:(CMTime)duration
photoDisplayTime:(CMTime)photoDisplayTime
resolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings
error:(NSError *)error;
  • 参数 NSURL *outputFileURL:写入动态照片内容的fileURL
  • 参数 duration:动态照片的持续时间。
  • 参数 photoDisplayTime:动态照片的静止图像部分所对应的时间戳。

AVCapturePhotoOutput调用此方法时,动态照片的影片组件已写入outputFileURL参数指定的位置。
要将拍摄的动态照片添加到用户的照片库,需要使用PHAssetCreationRequest类。 要使用照片库中的动态照片,需要使用PHLivePhotoPHLivePhotoView类。 要在Web上显示动态照片内容,需要使用LivePhotosKit JS框架。

如果拍摄动态照片,则必须实现此方法。 当调用- capturePhotoWithSettings:delegate:方法时,如果没有实现该协议方法,则照片输出会引发异常。
每次拍摄动态照片时,AVCapturePhotoOutput仅调用此方法一次。


本文涉及到的更多信息请阅读:
点击阅读 AVCaptureDevice
点击阅读 AVCaptureSession
点击阅读 AVCapturePhotoOutput
点击阅读 AVCapturePhotoCaptureDelegate
点击阅读 AVCapturePhotoSettings
点击阅读 AVCaptureResolvedPhotoSettings
点击阅读 AVCapturePhoto

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357