Ask Apple问答汇总之Photos and Camera

2,071 阅读22分钟

近期,苹果开发者网站发起了Ask Apple活动,邀请开发人员直接与苹果专家沟通。

活动时间是2022年10月17-21日,目前活动已结束。

苹果为我们保留了本次活动中所有内容供开发者查阅。

我认为有必要在这里对一些感兴趣相关专题中问答内容进行汇总并翻译,供大家参考。

由于水平有限,文中的翻译可能有些不准确或有些小错误,还望大家在阅读过程中理解。如果您发现错误或有更好的想法,欢迎指正🙌🏻

Photos and Camera

截屏2022-10-31 12.28.48.png

如何将不显示“取消”按钮与新的PHPickerViewControllerDelegate进行关联

Developer:

UIImagePickerCOntrollerDelegate中,有两个方法。

extension ViewController: UIImagePickerControllerDelegate {
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        // script to process image when select an image from album and dismiss after the processing
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController)       {
        // the dismiss at this section will make the ‘cancel’ button on the top left of the album controller view being able to dismiss
        dismiss(animated: true, completion: nil)
    }
}

对于最新的PHPickerViewControllerDelegate

extension AlbumViewController: PHPickerViewControllerDelegate {
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        // only has one function which serve the similar function as the func imagePickerController in UIImagePickerControllerDelegate
    }
}

如何不显示相册控制器视图左上角的"取消"按钮?因为在新的PHPickerViewControllerDelegate代理方法里不再有func imagePickerControllerDidCancel

只需点击"取消"按钮,就不会使用新的PHPickerViewControllerDelegate关闭相册控制器视图。如果在picker()中输入dismiss(animated: true, completion:nil) ,它也不会关闭相册视图控制器,即使点击“取消”按钮。

请告知如何将不显示“取消”按钮与新的PHPickerViewControllerDelegate进行关联,目前只看到picker()一个单一方法。谢谢。

Apple:

picker:didFinishPicking:如果点击“取消”按钮,将调用空结果,如果设置了configuration.preselectedAssetIdentifiers代理方法将被预加载调用。如果你启用了滑动消失,你也可以执行presentationControllerDidDismiss:

developer.apple.com/documentati…

是否可以直接保存照片到隐藏的相册文件夹中?

Developer:

是否可以直接保存照片到隐藏的相册文件夹中?我一直在研究“拍摄照片”相关代码并把

let photoCollection = PhotoCollection(smartAlbum: .smartAlbumUserLibrary)

改为:

let photoCollection = PhotoCollection(smartAlbum: .smartAlbumAllHidden)

但它对我来说不管用。

Apple:

您可以通过在更改请求中设置资源上的隐藏属性来将该资源放入隐藏的相册中,请参阅:developer.apple.com/documentati… 请特别注意iOS 16和macOS Ventura中关于您的应用程序是否可以获取隐藏资产的变化。

Developer:

多谢Matt,我会研究的

iOS16中是否有“删除背景”的API提供

Developer:

在iOS16中,shortcuts app有一个名为“删除背景”的快捷方式操作。是否可作为 API 从第三方应用程序中执行“复制主题”功能?

Apple:

不幸的是,目前没有API可以做到这一点。请提交反馈请求,详细说明你希望针对应用的用例查看的 API 类型。

Developer:

另请参阅此讨论 - 我真的非常希望在API中使用它 - appledeveloper.slack.com/archives/C0…

有没有办法获取LiDAR的原始数据或仪表数据?

Developer:

您好,我正在开发一个使用LiDAR传感器的应用程序。 我试图获取LiDAR数据并转换为米或英寸。 我看到了"Depth Data Capture"和"Point Cloud"的所有示例代码。 但我可以找到一种方法来获取LiDAR雷达的原始数据。 所有这些代码都被包装在Metal中,所以我无法获得LiDAR的原始数据。 我只需要激光雷达深度。 有没有办法获取LiDAR的原始数据或仪表数据?

Apple:

我们不支持通过 AVCapture API 检索原始LiDAR数据,仅支持上面的示例代码和 API。 对于测量,我们建议改用 ARKit API。

从iCloud添加/删除/列出照片的支持方法是什么?

Developer:

由于(非常不幸的是)没有官方API可以直接访问iCloud中的照片,有没有办法获得有关添加/删除照片的通知?从iCloud添加/删除/列出照片的支持方法是什么? 此问题针对的是iOS和macOS。

Apple:

你好!你有没有看过新的PhotoKit更新历史? 它允许你在库发生更改时收到通知,即使你的应用未运行也是如此。以下是有关此主题的 WWDC 2022 视频:

developer.apple.com/videos/play…

关于照片浏览应用添加Live Text支持的问题

Developer:

你好!我正在努力向我的照片浏览应用添加Live Text支持。不幸的是,将ImageAnalysisInteraction添加到PHLivePhotoView会使您无法点击并按住以播放实时照片。这是一个已知问题还是我做错了什么?我已经尝试设置交互的委托并实现交互(_:shouldBeginAt:for:) (如果存在冲突,可能会返回 false),但是当我点击并按住实时照片(不是顶部文本)以尝试播放它时,它不会被调用。谢谢!

Apple:

您应该能够将playbackGestureRecognizer移动到其他视图。

/// Gesture used to trigger playback. By default, added to the receiver. Can be moved to a different view.
@property (readonly, nonatomic, strong) UIGestureRecognizer *playbackGestureRecognizer;

Developer:

啊?!所以PHLivePhotoView是最上面的视图,我不明白我可以尝试将其移动到在哪里🤔

您是否注意到在这种情况下预计不会播放,我应该使用不同的视图(如专用播放视图)来触发播放?理想情况下,它将像照片应用程序一样工作,您可以在其中点击并按住以进行播放,或者如果您点击并按住文本,则会选择文本。

Apple:

也许可以在顶部创建一个透明视图,并将手势识别器移动到那里以解决手势冲突。但是,如果它不起作用,那么创建专用的播放视图将是最佳选择。不过,请提交反馈请求!

Developer:

好的,谢谢!我已提交FB11585815。也许应该创建一个示例项目来配合它,如果这会有所帮助?

Apple:

谢谢!一个示例项目将非常有帮助!

Developer:

我已经向FB11585815添加了一个示例项目,谢谢 @Justin J(Apple)

是否有从相册中获取所有特定区域的照片的API?

Developer:

亲爱的苹果团队 我正在寻找一种方法来从相册中获取所有特定区域的照片。是否有 API 可以实现这一目标?

Apple:

没有允许位置限定提取或类似内容的 API。如果您今天想使用API执行此操作,则需要对单个PHAssets上的位置属性进行大量处理。请提交反馈请求,详细说明你的应用需要什么用例。

如何解决使用AVCaptureMultiCamSession录制视频时遇到空帧问题

Developer:

我正在使用新的AVCaptureMultiCamSession创建画中画视频。我的视频输入是单独录制的,其中包含音频。鉴于数据流的并发性质,我在每次录制开始时都会遇到空帧。我应该如何解决这个问题?

Apple:

事实上,我们有示例代码可以做到这一点,AVMultiCamPiP: developer.apple.com/documentati…

Developer:

是的,我实际上用它来通知我的实现。与我最大的区别在于,我将它们分开保存数据流。这使我能够拥有单独的前/后视频,我可以单独地使用/移动。

是否可以从电影视频的每一帧访问深度图像?

Developer:

是否可以从电影视频的每一帧访问深度图像?理想情况下,在创建如下视频合成时可以如下使用:

AVMutableVideoComposition(asset: asset, applyingCIFiltersWithHandler: { request in ...}

我想将我的自定义变形镜头模糊算法应用于电影视频,这看起来很棒!

多谢!

James

Apple:

抱歉,目前不支持此功能。如果这是您的重要功能,请将ER作为FB事件提交。

Developer:

会照做的。多谢!

通过ER和FB,您的意思是向反馈帮助提交错误报告吗?

developer.apple.com/bug-reporti… ?

Apple:

ER = Enhancement Request(增强功能请求)

FB = Feedback Incident via Feedback Assistant(通过反馈助手反馈事件)

是的。

能否阐明增益图是如何在照片中应用的?

Developer:

与从其他地方导入的照片相比,使用 iPhone 或 iPad 拍摄的照片通常在照片中以更亮的颜色和高光显示。 经过大量挖掘,我们发现{MakerApple}部分中的一些EXIF标签包含HDR色调映射信息。在 iPhone 12 和更新机型上拍摄的图像还包含影响局部色调映射的辅助 HDR 增益图。 从 iOS 16 开始,现在有用于在应用程序中呈现 EDR 内容的 API。然而,所有关于 EDR 的 WWDC 会议只提到视频内容,即使图像也可以是 HDR。例如,可以在 EDR 中很好地渲染 OpenEXR 图像或具有 HDR 颜色空间的图像。 但是,无法以保留 HDR 信息的方式加载使用 iPhone 拍摄的 HDR 图像。 PhotoKitImage I/OCore Image 中的所有 API 只加载图像的 SDR 部分,不考虑图像的元数据和增益图。 Image I/O 中有_are_ APIs 用于提取增益图,但我找不到任何关于如何将其应用于图像以实现 HDR 的文档。 您能否阐明增益图是如何在照片中应用的,以便我们也可以在启用 EDR 的应用程序中正确显示它?谢谢!

Apple:

我们不提供详细说明这些图像如何在照片应用程序中呈现的 API。请提交有关您在此空间中想要的确切行为的反馈(或在此处粘贴FB编号,以防您已经提交了一些)。

Developer:

多谢!这里:FB11512515 和FB11512528

如何更好地使用带有外部 GPS 设备的 iOS 应用程序获取位置?

Developer:

你好。我在 Infrakit.com 工作 我们为建筑工地提供基于移动和网络的协作解决方案。我们有 Android 和 iOS 应用程序。我们有外部 GPS 接收器,可以准确地将其附加到照片或使用其他功能——因为它是施工现场所需要的。 Android 可以很好地与外部接收器配合使用,通过 NMEA 数据接收数据并对其进行解析。然而,对于 iOS,连接/测试外部 GPS 设备似乎非常困难。您能否指导我们如何更好地使用带有外部 GPS 设备的 iOS 应用程序获取位置,而不是使用手机的内部 GPS。我不知道在哪里问这个问题,但是由于我们使用的是带有 GPS 坐标的照片和标签,所以我会在这里问,然后请你们把我推给正确的频道或人。提前致谢

Apple:

最好将这个问题发送给蓝牙或其他连接团队,不幸的是,PhotoKitCamera的当前团队在使用外部 GPS 产品这一领域没有专业知识。

Developer:

我找不到对应的频道,你可以指导我吗

Apple:

这些团队没有任何正在进行的活动。我建议为这些团队提交 TSI 或开发人员论坛。

Requesting Technical Support - Support - Apple Developer

Developer:

感谢!

有没有一种简单的方法可以将共享图库中的所有评论复制到照片的关键字字段中?

Developer:

有没有一种简单的方法可以将共享图库中的所有评论复制到照片的关键字字段中?

Apple:

没有任何 API 来访问来自云共享资源的注释,也没有用于添加关键字的 API。请提交反馈以请求 API 支持这些操作,并描述您尝试支持的应用工作流/行为,谢谢。

Developer:

刚刚检查了一下,评论在exiftool中无法检测到

好的 谢谢

Apple:

我以为您指的是对云共享(PHAssetSourceTypeCloudShared)资源所做的评论,您是否指的是在UI中作为“标题”出现在图库照片中的评论?

Developer:

不,显示在 iPhone 底部“评论”字段中以及 Mac 版“照片”评论图标后面的那些

Apple:

知道了,感谢您的确认。是的,这些是对云共享资源的评论(不是用户库资源上的标题)

Developer:

那么没有办法阅读它们吗? 即使生成带有评论和文件名的csv也会有所帮助

另外,这将如何与iOS 16.1中的新共享库一起使用(如果您可以说...)

需要更改哪些图片元数据字段才能避免被视为重复字段吗?

Developer:

我们的一些用户报告说,使用我们的应用程序保存的图像在几秒钟后从“照片”中的图库中消失了。他们都拥有一台带有旧版macOS的Mac,并且他们都为照片启用了iCloud同步功能。 我们的应用程序使用Core Image来处理图片。Core Image会将输入的大部分元数据传输到输出。虽然我们认为这通常是一个好主意,但这似乎导致了这个问题: 在Mac上运行的旧版照片(甚至是iPhoto?)似乎认为我们应用程序的输出图像是加载到我们应用程序中的原始图像的副本。iCloud 同步发生后,Mac 会立即从图库中移除该图像,即使它处于睡眠模式也是如此。当 Mac 关闭或与互联网断开连接时,图像会保留在资源库中,直到 Mac 重新联机。 这似乎是由输出的元数据引起的,但我们无法确定哪些字段导致旧照片将新图像检测为重复图像。 您知道我们需要更改哪些元数据字段才能不被视为重复字段吗?

Apple:

你好!谢谢你的问题。使用 PhotoKit 和 iCloud 同步保存图像不应进行任何重复数据删除。如果这是可重现的,请使用此配置文件的照片诊断进行重现并打开反馈请求,以便我们进一步调查:developer.apple.com/bug-reporti…

关于PHLivePhotoView在Mac上无法播放实时照片的问题

Developer:

似乎PHLivePhotoView在Mac的Catalyst app中没有为用户提供播放它的方式,不像在iOS上可以长按播放(或按住不做任何事情)。

“照片”应用在悬停播放时具有 LIVE 效果。我们是否需要自己实现这种类型的控制,或者系统是否提供了播放实时照片的方法?

Apple:

这听起来像是一个bug,如果播放手势识别器在Mac的Catalyst app中无法按预期工作。请打开反馈请求,以便我们进一步调查。

Developer:

我已经提交了FB11653991,也可以跟进一个样本项目

Apple:

它应该像iOS一样工作。

要解决此问题,您可以通过以下方式实现自己的控制/手势:

- (void)startPlaybackWithStyle:(PHLivePhotoViewPlaybackStyle)playbackStyle;
- (void)stopPlayback;

Developer:

好的,很酷,谢谢!FB11653991更像是一个功能请求,使PHLivePhotoView像在“照片”应用程序中一样工作。我可以提交一个新的错误报告,并包括一个示例项目,显示单击并按住以在 Catalyst 中不起作用。

Apple:

多谢!

Developer:

FB11705385 谢谢你

关于在相机捕获视频时进行对象检测的问题

Developer:

在Mac上,催化剂对象检测由系统自动触发,针对从Camara捕获的每个帧,这会导致高CPU使用率,我们不希望在相机捕获视频时进行对象检测。 它可以通过示例项目重现

developer.apple.com/documentati…).

这是系统问题吗?您何时会解决此问题?

Apple :

我们已注意到此问题(感谢您向 FeedbackAssistant 提交bug),已在内部重现了该错误,并希望在将来的版本中解决该问题。

如何检测iPhone 14 Pro?

Developer:

如何检测iPhone 14 Pro相机? 它是.builtInTripleCameravirtualDeviceSwitchOverVideoZoomFactors返回[2,6],与iPhone 13 Pro相同(不是[2,4,6]

Apple:

可以看下关于-AVCaptureDeviceFormat.secondaryNativeResolutionZoomFactors的最新API。

Developer:

谢谢!

在Apple的示例捕获代码中,不支持某些相机配置

Developer:

在Apple的示例捕获代码中,不支持某些相机配置,似乎对于深度数据......

我们应该如何解决这个问题?非常感谢。

if let depthData = photo.depthData?.converting(toDepthDataType:
                                                        kCVPixelFormatType_DisparityFloat32),
           let colorSpace = CGColorSpace(name: CGColorSpace.linearGray) {
            let depthImage = CIImage( cvImageBuffer: depthData.depthDataMap,        //FIXME: [api] -[CIImage initWithCVImageBuffer:options:] failed because the buffer is nil.
                                      options: [ .auxiliaryDisparity: true ] )
            depthMapData = context.tiffRepresentation(of: depthImage,
                                                      format: .Lf,
                                                      colorSpace: colorSpace,
                                                      options: [.disparityImage: depthImage])
}

Apple:

并非所有AVCaptureDevices和格式都支持深度数据传输。双镜头摄像头可以(双镜头,双广角),以及LiDAR深度和原深感。为了确保选择支持深度的格式,您可以遍历 AVCaptureDevice 的 -格式并检查每个格式支持的 DepthDataFormats 数组。如果数组不是 nil,您应该能够将其连接到 AVCapturePhotoOutput,请求深度,并在生成的照片中获取它。

Developer:

多谢😊

Apple:

要在AVCapturePhotoOutput上请求深度,您需要在AVCapturePhotoOutput上启用深度数据传输: 为此,应用程序需要检查``PhotoOutput是否支持使用AVCapturePhotoOutput.depthDataDeliverySupported,然后应用程序可以使用AVCapturePhotoOutput.depthDataDeliveryEnabled = YES 然后在请求照片时,请确保还设置了AVCapturePhotoSettings.depthDataDeliveryEnabled = YES。`

Developer:

感谢您提供更多详细信息

我可以从AVFoundation API中禁用预闪光吗?

Developer:

我可以从AVFoundation API中禁用预闪光(使用闪光灯拍照期间发生的快速闪光,旨在减少红眼)吗?

Apple:

不幸的是,不可以。此外,预闪不仅仅是红眼;这也是关于AE / AF的。

关于AVCaptureMultiCamSession的问题

Developer:

我有一个关于AVCaptureMultiCamSession的问题:我们希望使用来自同一虚拟AVCaptureDevice的两个输入端口设置相机会话,用于(同步)视频,但我们只需要来自AVCaptureDevice的一个端口的静止图像。我们如何配置它?现在,当我们选择格式时,相机会话总是为两个静止图像分配缓冲区,这导致hardwareCosts为 1.03。我们还希望捕获会话仅将自动公开应用于一个输入端口。这可能吗?

Apple:

听起来您想以不同步的方式运行两个摄像头。您可以简单地运行两个单独的物理摄像机,而不是使用虚拟摄像机。您可以在此配置中独立控制它们的曝光,并且仅将其中一个连接到AVCapturePhotoOutput,这应该可以降低hardwareCost

Developer:

两种不同的AVCaptureDevice工作,但理想情况下,我们希望有一个同步输出,例如远摄和广角。当我们为虚拟相机使用静止图像分辨率为 4032x3024 的格式时,从远摄镜头端口添加第二个AVCaptureConnection 后,hardwareCosts超过 1.0。

Apple:

双摄像头不支持在其组成物理摄像头上进行不同的曝光。它将它们视为一体。

Developer:

好的,我们遇到的问题是,当闪光灯闪光时,使用来自同一AVCaptureDevice的两个端口时,静止图像有时会曝光过度。当用于AVCaptureDevice时,闪光曝光是可以的。

关于静止图像,当我们设置超广角和广角镜头作为端口时,默认情况下静止图像始终来自超广角镜头。我们必须使用virtualDeviceConstituentPhotoDeliveryEnabled来获取广角相机静止图像。有没有办法改变这一点?我们只需要广角静止图像。

当应用程序进入后台时,我是否必须显式停止 AVCaptureSession

Developer:

当应用程序进入后台时,我是否必须显式停止 AVCaptureSession?

Apple:

绝对不行!当你的应用进入后台时,会话会自动中断,当你处于前台时,会话会自动恢复。:+1:

新版本iOS上无法收到AVAssetDurationDidChangeNotification

Developer:

我将视频捕获到本地磁盘(在 macOS 上)上共享目录上的 AVFragmentedAsset 中。当我从 iOS 应用程序打开此资源时,我没有收到任何 AVAssetDurationDidChangeNotification。这曾经适用于以前版本的macOS和iOS。此功能有什么变化吗?

Apple:

可能需要通过 FeedbackAssistant 报告错误。 此类问题的最常见原因是 AVAsset 的持续时间属性的值尚未显式加载。在此之前没有更改通知。

Developer:

谢谢你的回答,我知道了。我在为资产加载持续时间和 containsFragmentskeys之后创建 AVFragmentedAssetMinder,然后添加通知观察者。我在 macOS 上的捕获应用程序上做了同样的事情并且它可以工作,但对于 iOS 上的远程阅读器它没有。这就是让我感到困惑的地方。

我们是否可以在企业分发环境中使用任何机制来为我们的客户启用后台摄像头访问

Developer:

我们开发视频分析软件产品,包括我们的旗舰 GammaPix 技术,以使用智能手机和其他相机检测电离放射性。我们的客户包括公共安全、环境保护、公民科学和教育用户,他们将这种能力用于各种目的。我们 120,000 名用户中有 99% 使用 Android,因为我们能够在后台进行重复的、无人值守的测量以确保人们的安全。 我们接触的许多机构都在使用 iOS 设备。这包括我们的纽约市警察局客户,他们最近从 Android 切换到 iOS,并且不再具有监控功能。我们的用户将受益于我们的应用程序能够不时在后台访问相机以获取短片。该视频仅在镜头被遮盖时才有用,否则立即中止。在我们专有的图像处理和分析完成后,所有数据都会立即处理掉。 我们理解并尊重 Apple 为保护用户隐私而对相机访问设置的限制。我们的用例在于拥有企业分销渠道的各种公共安全组织。我们是否可以在企业分发环境中使用任何机制来为我们的客户启用后台摄像头访问?

Apple:

你好@Gordon,您能否澄清一下您关于“视频仅在镜头被覆盖时才有用”的说法?如果镜头被覆盖,如何捕获视频?

Developer:

嗨,Brad。我们的应用程序的工作方式是,当辐射照射到相机传感器时,有时会留下亮点。如果图像在其他方面较暗,则更容易检测到。所以我们感兴趣的是黑色视频,比如当相机被覆盖时,这样我们就可以寻找斑点。

对我们来说,图像中的其他任何东西都是令人烦恼的噪音,而不是信号。

Apple:

明白了。而且这种测量不能从应用程序中获取?所以用户知道发生了什么?

Developer:

它可以并且正在从当前版本的应用程序中获取,但这需要用户干预才能读取。我们的 Android 用户欣赏的是,当设备不使用时,可以自动读取读数,并在检测到辐射时提醒用户。

如果 HEIC 文件有效地驻留在 OSX 照片库中,是否可以使用并行进程?

这个问题与 OSX 上的照片库有关。该应用程序处理用户创建和保存的 HEIC 文件,然后用户可以再次打开、修改和保存 HEIC 文件。如果 HEIC 文件驻留在 OSX 文件系统上,则该过程相当常规。我的问题是,如果 HEIC 文件有效地驻留在 OSX 照片库中,是否可以使用并行进程。 现在,该应用程序使用以下代码在照片库中创建和重写 HEIC 文件(又名照片库assets)。

  do
    {
      try PHPhotoLibrary.shared().performChangesAndWait({
        let request = PHAssetCreationRequest.forAsset()
        let options = PHAssetResourceCreationOptions()
        options.shouldMoveFile = true
        request.addResource(with: .photo, fileURL: fileUrl, options: options)
        localIdentifier = request.placeholderForCreatedAsset?.localIdentifier
        })
     }
     catch  { localIdentifier = nil }

要读取 HEIC 文件,该应用程序使用本地标识符/云标识符。 更具体地说,我的问题是应用程序尝试做的事情是否明智(且可靠),如果是这样,如果上面的代码是推荐的方法。 假设上面的代码在正确的轨道上,对我来说模糊的一个项目是写入文件使用 HEIC 文件名,而读取使用本地标识符。 因此,在重写时,指定与创建相同的 HEIC 文件 URL 是否真的会导致照片库中的原始 HEIC 文件被替换。 或者应该先使用本地标识符删除 HEIC 文件,然后创建全新的文件。 请注意,我对创建和恢复 XMP 元数据感兴趣,这就是为什么 HEIC 文件非常适合该应用程序的原因。

Apple:

如果我理解正确,您是在问用已转变为 HEIC 的assets资源替换现有assets资源?这是不支持的。您无法替换库中存在的assets的原始资源。如果要执行此类操作,则需要创建新assets并向该assets添加资源。

Developer:

谢谢。 也许是为了确定。 对于文件系统,我读取图像(带有自定义元数据)文件,对其进行修改,然后写入文件,使用相同的文件名进行读写。 但是,对于照片库,我读取了assets(带有元数据的图像),对其进行了修改,删除了原始资产,然后创建了一个新assets。 基本上,照片库不像文件系统文件那样容易修改。

Apple:

正确,修改是不同的模型,以确保用户数据的完整性

以上就是所有photos and camera专题的问答内容汇总。